最近在学习DSP,第一次看C语言写的程序,发现在向量文件中,所有的中断都由一个矢量.vectors定义地址,而我以前看的程序,各个中断都有自己的矢量,这个给我的理解造成了冲突。还有,就是有一个_c_int00没有定义,但用了,对于这个也不理解。
1. 对于第一个问题,通过查看中断向量表,发现向量文件中的中断的顺序跟中断向量表中一致。接着,我进行了单步跟踪,在跟踪时,发现向量文件中的每个中断处都出现了地址,而看到源文件中用到的中断timer0,在向量文件中,它显示的地址是00CC(BD _timer0),发现跟asm(" stm #00a0h, PMST "); //IPTR = 001,以及中断向量表TINT0组成的向量地址一致,由此可以看出,.vectors定义的地址和asm(" stm #00a0h, PMST "); (即_timer0地址)有着相互的关系,一个决定另一个。
2.对于_c_int00,我查了一下资料,说法是这样的:
C程序开始运行时,必须首先初始化C运行环境,这是通过_c_int00函数来完成的,这个函数在运行支持库(rts.lib)中。连接器会将这个函数的入口地址放在复位中断向量中,使其可以在初始化时被调用。 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
_c_int00函数为建立C运行环境,需完成以下工作:
l 为系统堆栈产生.stack块,并初始化堆栈指针;
l 从.cinit块将初始化数据拷贝到.bss块中相应的变量;
l 调用main函数,开始运行C程序;
l 用户可以对c_int00函数进行修改,但修改后的函数必须完成以上任务。
如果是汇编程序,那么不需要链接RTS库,_c_int00也毫无意义。
同时,对于连接命令文件中,各段的起始地址赋值,以及长度分配,不是很了解,在以下程序中不知是不是在相应的程序区或数据区中,随便找个符合条件的地址作为起始地址,以及赋予足够的长度,还是另有什么考虑,这个好有待学习。
源文件
#include "cpu_reg.h"
int ms,f;
void main()
{
asm(" STM #0000h,CLKMD ");
while(*CLKMD & 0x01 );
asm(" STM #40C7h,CLKMD "); //设置CPU运行频率=100M
/* 40C7h:5*clkin =100M
30c7h:4*clkin =80M
20c7h:3*clkin =60M
10C7h:2*clkin =40M
*/
asm(" stm #4240h, SWWSR ");
//2 wait except for on-chip program 1
asm(" stm #00a0h, PMST "); //MP/MC = 0, IPTR = 001,ovly=0
asm(" stm #0802h, BSCR ");
asm(" STM #0h,IMR ");
asm(" STM #0010h,TCR "); //关定时器
asm(" STM #0186ah,PRD ");//1ms
asm(" STM #0C2fh,TCR "); //TCR=最后四位
asm(" STM #0008h,IFR ");
asm(" ORM #0008h,*(IMR) ");/*开时间中断*/
asm(" RSBX INTM "); /*开中断*/
f="2";
ms="0";
while(1)
{
while(ms<500/f); //LED_flash
ms="0";
asm(" RSBX XF ");
while(ms<500/f);
ms="0";
asm(" SSBX XF ");
}
}
interrupt void timer0()
{
ms++;
}
向量文件
DRR11A .set 0x41
DXR11A .set 0x43
.ref _timer0
.ref _c_int00
.sect ".vectors"
rs: BD _c_int00
nop
nop
nmi: rete ;NMI, SINT16
nop
NOP
NOP
sint17: BD _c_int00 ;SINT17
NOP
NOP
sint18: BD _c_int00 ;SINT18
NOP
NOP
sint19: BD _c_int00 ;SINT19
NOP
NOP
sint20: BD _c_int00 ;SINT20
NOP
NOP
sint21: BD _c_int00 ;SINT21
NOP
NOP
sint22: BD _c_int00 ;SINT22
NOP
NOP
sint23: BD sint23 ;SINT23
NOP
NOP
sint24: BD sint24 ;SINT24
NOP
NOP
sint25: BD sint25 ;SINT25
NOP
NOP
sint26: BD sint26 ;SINT26
NOP
NOP
sint27: BD sint27 ;SINT27
NOP
NOP
sint28: BD sint28 ;SINT28
NOP
NOP
sint29: BD sint29 ;SINT29
NOP
NOP
sint30: BD sint30 ;SINT30
NOP
NOP
int0: BD int0 ;INT0, SINT0
NOP
NOP
int1: BD int1 ;INT1, SINT1
NOP
NOP
int2: BD int2 ;INT2, SINT2
NOP
NOP
tint0: BD _timer0 ;TINT0, SINT3
NOP
NOP
brint0: BD _c_int00 ;BRINT0, SINT4
NOP
NOP
bxint0: BD bxint0 ;BXINT0, SINT5
NOP
NOP
dmac0: BD dmac0 ;DMAC0, brint2, SINT6
NOP
NOP
dmac1: BD _c_int00 ;DMAC1, bxint2, SINT7 ??
NOP
NOP
int3: BD int3 ;INT3, SINT8
NOP
NOP
hpint: BD _c_int00 ;HPINT, SINT9
NOP
NOP
brint1: BD brint1 ;BRINT1 or DMAC2, SINT10
NOP
NOP
;bxint1: BD mcbsp1 ;BXINT1 or DMAC3, SINT11
bxint1: BD _c_int00 ;BXINT1 or DMAC3, SINT11
NOP
NOP
dmac4: BD dmac4 ;DMAC4, SINT12
NOP
NOP
dmac5: BD dmac5 ;DMAC5, SINT13
NOP
NOP
rsvd1: BD rsvd1 ;reserved
NOP
NOP
rsvd2: BD rsvd2 ;reserved
NOP
NOP
连接命令文件
MEMORY {
PAGE 0:
RESEVE: org 00h len = 0x80
PAGE 0:
PROG1: org = 0x0100 len = 0x1200
PAGE 0:
VECT: org = 0x0080, len = 0x80
PAGE 1:
RESEVE1: org 00h len = 0x1300
PAGE 1:
DARAM2: org = 0x1300 len = 0x400
PAGE 1:
DARAM1: org = 0x1700 len = 0x2900
}
SECTIONS{
.text : > PROG1 PAGE 0
.cinit : > PROG1 PAGE 0
.switch: > PROG1 PAGE 0
.vectors:> VECT PAGE 0
.const: > DARAM1 PAGE 1
.bss : > DARAM1 PAGE 1
.stack : > DARAM2 PAGE 1
.system: > DARAM2 PAGE 1
.data : > DARAM2 PAGE 1
}
文章评论(0条评论)
登录后参与讨论