DSP

TI的vectors.asm解析

2019-07-13 17:25发布

http://blog.csdn.net/liangwei88624/article/details/6214010


  学习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。     如果要使用哪个中断 只需要把下面的中断服务指令换成自己需要的指令即可。