新闻中心

EEPW首页 > 手机与无线通信 > 设计应用 > 在MAX-IDE中自动初始化数据段

在MAX-IDE中自动初始化数据段

作者: 时间:2011-04-06 来源:网络 收藏

这种方案可以很好地工作,但是有几个问题需要注意。

本文引用地址://www.cghlg.com/article/156478.htm

必须事先定义每个变量的地址,这项工作比较耗时,特别是确定随后将所有变量移至不同的存储区域时。
必须注意一个以上的变量不要占用同一地址,如果发生这种错误将很难追踪这些故障。
变量的(开始)值必须通过应用程序装载,如上述程序的最后一行。如果有多个变量按照这种方式化将会占用大量的程序空间。
比较有效的方案是利用机制分别声明程序段和段。这种方法允许编程人员指定汇编程序的哪一部分定义为程序空间,哪一部分定义为空间。

segment code

move DP[0], #VarA ; Point to VarA
move Acc, @DP[0] ; Get current value of VarA
add #1 ; Increment it
move @DP[0], Acc ; Store value back in VarA

segment data

VarA:
dw 0394h ; Initial value for VarA


利用上述方案,在数据段声明的变量地址由编译器解析文件时指定,用同样方法为程序空间分配地址标签。标签用于对变量地址指定符号名称,dw和db声明可以在化变量时用于设置字宽或字节宽度初始值。这种情况下,假定汇编文件中事先没有segment data指令,编译器将从0000h地址起始数据段。这意味着VarA将存储在字地址0000h。对于程序空间,org声明将强制变量从指定的起始地址开始存储。

数据段初始化
在先前的程序清单中,变量VarA定义(用dw声明)的初始值为0394h。但是,该值在程序中并不装载到VarA。那么,如何初始化这一数值? 答案是在编译和运行工程时,执行数据段初始化。

MaxQAsm编译器通过产生一个二级hex输出文件响应segment data指令。通常,为工程产生的hex文件包含程序数据。例如,如果编译工程example.prj,将产生一个名称为example.hex的hex文件,并包含通过编译工程文件产生的程序数据。如果定义了数据段,则将产生一个名称为example_d.hex的附加hex文件,该文件包含该段编译数据。

执行工程时,检查是否在工程编译中产生了数据段文件(以_d.hex结尾)。如果存在数据段文件,MAX-IDE通过标准的JTAG装载器将该段数据装载到器件的数据SRAM。该过程在标准的hex文件装载到程序存储器之后执行。

这种方案能够很好地工作在开发阶段,当器件连接到JTAG适配器,在应用程序运行之前,MAX-IDE重新装载程序数据和段数据。但是,一旦器件掉电并重新上电,而且允许独立运行(没有连接调试器),在每次运行前MAX-IDE将无法正确装载数据段。变量也无法设置在所要求的数值,导致应用程序不能正确执行。这种故障很难分析,因为一旦器件重新连接到调试器,MAX-IDE将在每次运行前重新开始装载数据段,问题也就消失了。

保存和恢复数据段
一个遗留问题是:如何使应用程序在连接调试器(每次运行前MAX-IDE重新装载程序和数据)和独立运行(上电后RAM内容不确定)时都能保持工作。显然,解决方法需要两个步骤:应用程序将变量值(一旦经过初始化)保存到闪存,每次复位或上电后重新装载这些数值。

对于第一步,应用程序必须将数值保存到闪存。每次主机擦除或装载程序后第一次运行应用程序时执行该操作。

应用程序检测“标志”位置以验证变量之前是否复制到闪存内。该标志可以存储在特殊功能、非易失存储器,或与变量共用存储器,只要变量具有非零初始值(与空RAM地址区分开)。
应用程序将每个变量值从数据RAM复制到闪存,绝大多数带有可重复写操作闪存的MAXQ微控制器(如MAXQ2000)利用UROM_flashWrite函数实现。
应用程序在闪存中写一个标志,表明已经存储变量。
对于第二步,在后续的程序运行中,应用程序必须将变量从闪存重新装载到预先规定的数据RAM地址。

应用程序检测闪存的标志位置,以验证已经存储变量。
应用程序利用UROM_copyBuffer子程序将变量从闪存复制到数据RAM的正确位置。
以下程序清单展示了利用MAXQ2000评估板的保存-恢复方案,该程序中,变量值存储在闪存的7000h–71FFh地址内。

$include(maxQ2000.inc)

;; Code memory (flash) : 0000h-7FFFh (word addr)
;; Data memory (RAM) : 0000h-03FFh (word addr)

org 0000h

ljump start ; Skip over password area

org 0020h

start:
move DPC, #1Ch ; Set all pointers to word mode
move DP[0], #0F000h ; Check first variable value (flag)
lcall UROM_moveDP0 ; 'move GR, @DP[0]' executed by Utility ROM
move Acc, GR
cmp #1234h
jump NE, copyToFlash



关键词: 数据 初始 自动 MAX-IDE

评论


相关推荐

技术专区

关闭