嵌入式编程深入解析1

<HS>首先看看之前学过的DSP编程:开发一个DSP的C语言应用程序,需要以下4种类型的文件:C语言文件(.c)、汇编语言文件(.asm)、头文件(.h)和命令文件(.cmd)。其中C语言文件是必须的;汇编文件则根据实际情况而定,一般程序的复位和中断向量需要用汇编语言编写;头文件定义内部寄存器的地址分配,头文件不需要自己添加,只要头文件和工程在同一个目录下,连接时开发工具会自动添加;命令文件主要定义堆栈、程序空间分配和数据空间分配等。

LF2407中.asm汇编语言文件如下:

;define.asm
            .include  "lf2407a.h" 
            .include  "F2407REGS.H"
            .global _c_int0,_c_int1,_c_int2
            .global    _IMR,_IFR
            .global    _SCSR1,_SCSR2,_XINT1CR,_XINT2CR
            .global _WDCNTR,_WDKEY,_WDCR
            .global _MCRA,_MCRB,_MCRC,_PADATDIR,_PBDATDIR,_PCDATDIR,_PEDATDIR,_PFDATDIR
            .global _ADCTRL1,_ADCTRL2,_MAXCONV,_CHSELSEQ1,_CHSELSEQ2,_CHSELSEQ3,_CHSELSEQ4
            .global _AUTO_SEQ_SR,_RESULT0,_RESULT1,_RESULT2,_RESULT8,_RESULT9
            .global _CANMDER,_CANTCR,_CANRCR,_CANMCR,_CANBCR2,_CANBCR1,_CANESR,_CANGSR
            .global _CANCEC,_CANIFR,_CANIMR,_CANLAM0H,_CANLAM0L
            .global _CANID0L,_CANID0H,_CANCTRL0,_CANBX0A,_CANBX0B,_CANBX0C,_CANBX0D
            .global _CANID1L,_CANID1H,_CANCTRL1,_CANBX1A,_CANBX1B,_CANBX1C,_CANBX1D
            .global _CANID2L,_CANID2H,_CANCTRL2,_CANBX2A,_CANBX2B,_CANBX2C,_CANBX2D
            .global _CANID3L,_CANID3H,_CANCTRL3,_CANBX3A,_CANBX3B,_CANBX3C,_CANBX3D
            .global _CANID4L,_CANID4H,_CANCTRL4,_CANBX4A,_CANBX4B,_CANBX4C,_CANBX4D
            .global _CANID5L,_CANID5H,_CANCTRL5,_CANBX5A,_CANBX5B,_CANBX5C,_CANBX5D
            .global _SCICCR,_SCICTL1,_SCIHBAUD,_SCILBAUD,_SCICTL2,_SCIRXST,_SCIRXEMU,_SCIRXBUF,_SCITXBUF,_SCIPRI;
            .global _GPTCONA,_T1CNT,_T1PR,_T1CON,_T2CNT,_T2PR,_T2CON
            .global    _EVAIMRA,_EVAIMRB,_EVAIFRA,_EVAIFRB,_PIVR
            .global _GPTCONB,_T3CNT,_T3CMPR,_T3PR,_T3CON,_COMCONA,_ACTRA,_DBTCONA,_CMPR1,_EVBIMRA,_EVBIFRA
            .global _WSGR           

;建立中断向量表          
            .sect     ".vectors"           
RSVECT      B        _c_int0
INT1         B        PHANTOM
INT2        B       _c_int2
INT3        B       PHANTOM
INT4        B        PHANTOM
INT5        B        PHANTOM
INT6        B       PHANTOM
;中断子向量入口定义 

            .text                

PHANTOM:
            KICK_DOG
            RET   
            .end

 

其中.****是伪指令,比如.text表示程序编译连接时该标号标示部分存放可执行代码和浮点数常量。那么上文中便是指定PHANTOM的执行代码,当遇到INT1时执行的代码,喂狗,就是没有特殊的中断服务程序。

.sect 后面的vectors是一个段名,在.CDM命令文件中可以知道这个段的分配地址。

MEMORY
{
       PAGE 0: VECS: origin = 0x8000,  length 0x040
       PAGE 0: PROG: origin = 0x8860,  length 0x6000
       PAGE 1: B0  : origin = 0x200,   length 0x100
       PAGE 1: B1  : origin = 0x300,   length 0x100
       PAGE 1: DATA: origin = 0x0860,  length 0x0780
}

SECTIONS
{
       .vectors  : {}  >VECS PAGE 0         /* 中断向量表 */
       .text     : {}  >PROG PAGE 0         /* 可执行代码和字符串 */
       .cinit    : {}  >PROG PAGE 0
       .data     : {}  >DATA PAGE 1        /* 初始化变量和常数表 */
       .bss      : {}  >DATA PAGE 1            /* 保留全局变量和静态变量空间 */
       .const    : {}  >DATA PAGE 1            /* 字符串和switch表 */   
       .switch   : {}  >PROG PAGE 0         /* 包含.switch语句建立的表格 */
       .stack     : {}  >DATA PAGE 1         /* 为系统堆栈分配存储器 */
       .system   : {}  >DATA PAGE 1            /* 为动态存储器函数分配存储器空间 */

}

回到汇编文件中,中断向量表的定义中_c_int0便是一个中断服务程序的入口,也就是一个函数名,定义服务程序中使用:void interrupt    c_int2() 

</HS>

posted on 2012-02-23 12:56  demogame  阅读(301)  评论(0)    收藏  举报

导航