嵌入式编程深入解析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>
浙公网安备 33010602011771号