MAXQ架构的表操作
[09-13 17:04:17] 来源:http://www.88dzw.com 控制技术 阅读:8503次
文章摘要:这个代码例程存在的更大问题是不能进行汇编操作!标记UtilityROMGetDP0没有定义,造成这一结果的原因很简单:各款MAXQ微控制器的实用程序地址是不同的。事实上,甚至不能保证这些程序在特定MAXQ器件的不同版本中位于相同的位置!为解决这一问题,每一款MAXQ微控制器的固定用途ROM都包含一个固定用途函数的地址表,以及一个指向该表的指针,该指针的地址固定为0x800D。需明确指出的是,固定用途ROM包含以下代码: org0800DhdwUtilityFunctionTable...UtilityFunctionTable:...dwGetDP0dwGetDP0IncdwGetDP0Dec
MAXQ架构的表操作,标签:计算机控制技术,工厂电气控制技术,http://www.88dzw.com这个代码例程存在的更大问题是不能进行汇编操作!标记UtilityROMGetDP0没有定义,造成这一结果的原因很简单:各款MAXQ微控制器的实用程序地址是不同的。事实上,甚至不能保证这些程序在特定MAXQ器件的不同版本中位于相同的位置!
为解决这一问题,每一款MAXQ微控制器的固定用途ROM都包含一个固定用途函数的地址表,以及一个指向该表的指针,该指针的地址固定为0x800D。需明确指出的是,固定用途ROM包含以下代码:
org 0800Dh dw UtilityFunctionTable . . . UtilityFunctionTable: . . . dw GetDP0 dw GetDP0Inc dw GetDP0Dec dw GetDP1 dw GetDP1Inc dw GetDP1Dec dw GetBP dw GetBPInc dw GetBPDec注意:第一,固定用途函数表由地址组成,而不是指令。因此,编程人员必须提取地址并call它,而不能简单地跳转至该表。第二,第一个存储器函数也许不是该表的入口。由于每款MAXQ微控制器包含不同类型和容量的存储器以及不同的外设,每款器件很有可能包含不同的函数列表,函数在表中具有不同的相对偏移量。
3个指针寄存器各自都有3个相关的函数,总计有9个表查找函数。每个指针寄存器的第一个函数只是提取位于给定地址的数据,而后两个函数分别采用后递增和后递减形式的间接装载。在每一种情况下,都将提取到的数据装载到GR寄存器中。
现在,代码可改为如下形式:
CorrectTableLookup: move dp[0], #0800Dh ; Point to pointer to function table move acc, @dp[0] ; acc now has pointer to ftable add #3 ; For 2000, GetDP0 move dp[0], acc ; Load ptr + offset to dp0 move a[1], @dp[0] ; Get address of GetDP0 into A1 move dp[0], #StartOfTable + 08000h call a[1] ; This will call GetDP0, finally! . . . ret . . . StartOfTable: dc16 01234h dc16 05678h dc16 098abh dc16 0cdefh需注意,一旦找到GetDP0程序的地址,即可将该地址存放起来并重复使用。上述前5条指令只需要执行一次;然后,每次访问表数据操作只需要三个指令周期:调用,读取(运行固定用途ROM内的程序),返回(也运行固定用途ROM内的程序)。
将数据表从闪存拷贝到RAM
将整个表从闪存拷贝到RAM的方法之一是利用表的读函数实现。例如,如果在BP中给出了目标地址,那么拷贝方法如下:SlowTableMove: move dp[0], #0800Dh ; Point to pointer to function table move acc, @dp[0] ; acc now has pointer to ftable add #4 ; For 2000, GetDP0Inc move dp[0], acc ; Load ptr + offset to dp0 move a[1], @dp[0] ; Get address of GetDP0 into A1 move dp[0], #StartOfTable + 08000h move bp, #RAMDest ; Set this label to desired dest move offs, #0ffh ; Pre-decremented offset move lc[0], #4 ; Move four words TableMoveLoop: move dp[0], dp[0] ; Set source pointer call a[1] ; This will call GetDP0inc move @bp[++offs], gr ; Store retrieved word to dest djnz lc[0], TableMoveLoop . . . ret . . . StartOfTable: dc16 01234h dc16 05678h dc16 098abh dc16 0cdefh如上文所述,前5条指令只需要执行一次,此后可根据需要多次执行表操作,GetDP0inc子程序地址始终保存在A1中。每次执行表操作需要6个指令周期外加建立开销。
加入move dp[0], dp[0]指令是MAXQ架构的特殊性要求的。由于数据空间只有一条地址总线,因此必须在读数据空间操作的前1个周期先将地址建立起来。在表操作循环中,对DP[0]给出的地址进行读操作,然后在总线上放置写地址。如果没有move dp[0], dp[0]指令,当读取表中下一个地址的数据时,写地址会仍然占据总线。通过插入这条明显的空指令,可以为预期的下一个读操作刷新源操作数地址总线。
然而,还有一个更好的方法完成该拷贝任务。固定用途ROM中包括一个能实现上述相同功能的copyBuffer程序,而且所占用的指令周期更少。copyBuffer程序在固定用途ROM中位于表查找程序的后面。
FasterTableMove: move dp[0], #0800Dh ; Point to pointer to function table move acc, @dp[0] ; acc now has pointer to ftable add #12 ; For 2000, copyBuffer move dp[0], acc ; Load ptr + offset to dp0 move a[1], @dp[0] ; Get address of GetDP0 into A1 move dp[0], #StartOfTable + 08000h move bp, #RAMDest ; Set this label to desired dest move offs, #0 ; No need to pre-decrement offset move lc[0], #4 ; Move four words call a[1] ; This will call copyBuffer . . . ret . . . StartOfTable: dc16 01234h dc16 05678h dc16 098abh dc16 0cdefh
Tag:控制技术,计算机控制技术,工厂电气控制技术,控制技术
《MAXQ架构的表操作》相关文章
- › MAXQ7665评估板快速入门
- › MAX6951/MAX6950 LED显示驱动器与MAXQ2
- › Rowley CrossWorks和MAXQ2000评估板入
- › MAXQ微控制器的中断编程
- › 在应用编程MAXQ微控制器中可分区擦除的程序和数据闪存
- › 利用液晶的MAXQ微控制器-Using an LCD wit
- 在百度中搜索相关文章:MAXQ架构的表操作
- 在谷歌中搜索相关文章:MAXQ架构的表操作
- 在soso中搜索相关文章:MAXQ架构的表操作
- 在搜狗中搜索相关文章:MAXQ架构的表操作
分类导航
最新更新