关于关于C语言中语言中DSP5402中断向量表的配置问题中断向量表的配置问题
在MCU/ARM/DSP中,都有1个启动过程,这里主要设计复位及中断的入口问题。所以它们基本都有启动文件的支
持,使程序上电后自动进入正确的程序位置及地址。复位及中断的入口具有多个间隔固定的程序空间,它们可以是
单独的跳转地址及函数指针,如ARM的中断向量表。也可是一块小的固定程序空间,如51的n*8+3和DSP5402的4
字。
DSP5402和51略有不同,它在硬件复位时bootloader将中断向量表映射到ROM的0xFF80处。
但我们实际运行时,中断入口是允许改变的,而且每个程序的中断地址和个数都是不同的。
故需要动态地改变中断向量表。
DSP5402在硬件复位时中断向量表存在SREGs.PMST.IPTR中,步进(大小)0x80.
SREGs.PMST.IPTR初始化为0b11111111 1,故中断向量表在0xff80处。
我喜欢将其动态映射到0x0080处,因为寄存器在0x00~0x5f,0x60~0x7f处。
这样连续,RAM程序可从0x100开始装载。
所以我们要做至少2方面的工作:
1.修改SREGs.PMST.IPTR
//设置0x0080为中断向量表首址,在第2个128页内。
SREGs.PMST.Regs = (0x01 << PMST_IPTR) | (1 << PMST_MP_MC) | (1 << PMST_OVLY);
2.初始化中断向量表
在C语言的启动文件中,我们只需将中断向量表看成普通数组即可,因为CCS具有地址绝对定位功能。
这样我们就可以很方便地将中断向量表绝对定位到我们需要定位的位置。
在CCS中想绝对定位,必须修改CMD文件。
例如:
MEMORY
{
/*(R读 W写 X运行 I初始化)*/
PAGE 0: /* Program Space */
MMRS (RWIX) : o="000000h" l="000060h" /* Memory-mapped registers */
SCRATCH (RW ) : o="000060h" l="000020h" /* scratch-pad DARAM */
VECT (RWIX) : o="000080h" l="000080h" /* Interrupt Vector Table */
IPROG (RW ) : o="000100h" l="001f00h" /* On-Chip DARAM */
PAGE 1: /* Data Space */
/* declaration for DARAM already made in PAGE 0 */
/*支持对SREGs在watch窗口中有效查看*/
IMMRS (RWIX) : o="000000h" l="000060h" /* Memory-mapped registers */
ISCRATCH(RW ) : o="000060h" l="000020h" /* scratch-pad DARAM */
/*支持对中断向量表的正确定位及改写*/
IVECT (RWIX) : o="000080h" l="000080h" /* Interrupt Vector Table */
IDATA (RW ) : o="002000h" l="002000h" /* On-Chip DARAM */
EDATA (RW ) : o="008000h" l="008000h"