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

上一页  [1] [2] [3]  下一页


Tag:控制技术计算机控制技术,工厂电气控制技术控制技术