学习dsp发现没有对vectors.asm进行详细讲解的文章,我也是初学者之一,就把自己学习的体会写出来交流一下。
代码如下:
unused .macro id
.global unused:id:
unused:id:
b unused:id: ; nested branches to block interrupts
nop 4
b unused:id:
nop
nop
nop
nop
nop
.endm
.sect ".vectors"
.ref _c_int00 ; C entry point
.align 32*8*4 ; must be aligned on 256 word boundary
RESET: ; reset vector
mvkl _c_int00,b0 ; load destination function address to b0
mvkh _c_int00,b0
b b0 ; start branch to destination function
mvc PCE1,b0 ; address of interrupt vectors
mvc b0,ISTP ; set table to point here
nop 3 ; fill delay slot
nop
nop
;
; plug unused interrupts with infinite loops to
; catch stray interrupts
;
unused 1
unused 2
unused 3
unused 4
unused 5
unused 6
unused 7
unused 8
unused 9
unused 10
unused 11
unused 12
unused 13
unused 14
unused 15
首先定义了一个宏“unused”,下面是它的宏体。因为dm642每个中断服务取指包包括8条指令,所以宏体也是8条指令构成。
.sect 是建立包含代码和数据的自定义段。
.ref 是在当前模块中使用,但在别的模块中定义。(扩展:.def是在当前模块中定义,但在别的模块中使用。.global可替代.ref 和.def)
.align:用来指定数据的对齐方式,格式如下:
.align [absexpr1, absexpr2]
以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,4, 8,16或 32. 第二个表达式值表示填充的值。"must be aligned on 256 word boundary"是因为dm642每个中断服务取指包包括8条指令,每个指令是32位,而指令又必须要4位对齐,所以是 .align 32*8*4。
如果要使用哪个中断
只需要把下面的中断服务指令换成自己需要的指令即可。