长期以来,不知是何人发明,在许多C/C++环境下启动代码都需要汇编语言编写. 这主要是代码地址定位困难的问题.
而启动代码最关键部分就是中断向量表或中断代码表,前者只有中断服务程序的 入口地址,后者要包含跳转指令后加中断服务程序的入口地址两部分.
后者的代表就是MCS51,它间隔8字节地址,一般有跳转命令和简洁代码组成. 前者的代表如ARM7等.
在DSP54XX中,中断的架构类同MCS51.它间隔4字地址,共32个中断空间.
其中复位(中断)入口地址(假定为0x0080)处一般汇编代码为: .align 0x0080 ; must be aligned on page boundary
RESET: ; reset vector BD _c_int00 ; branch to C entry point STM #200,SP ; stack size of 200 nmi: RETE ; enable interrupts and return from one NOP NOP NOP ;NMI~
; software interrupts sint17 .space 4*16 ..................
我们可以设想: 既然很有规律,间隔又相同,我们为何不用数组或结构去代替汇编代码呢???
虽然DSP/BIOS就不需要汇编启动代码,都由系统自动配置,但实际上也是向其地址 空间添入中断入口地址.
所以答案是肯定可以的,那么如何去实现呢???自己想想~~~
菜农已将其嵌入到新版的c5402cfg.h中,操作极为方便.
例如: const uVectorEntry g_pfnVectors[] = { ISR_Reset(), //reset 0x0080 #0 ISR_Default(), //nmi 0x0084 #1 ISR_Default(), //sint17 0x0088 #2 ISR_Default(), //sint18 0x008c #3 ISR_Default(), //sint19 0x0090 #4 ISR_Default(), //sint20 0x0094 #5 ISR_Default(), //sint21 0x0098 #6 ISR_Default(), //sint22 0x009c #7 ISR_Default(), //sint23 0x00a0 #8 ISR_Default(), //sint24 0x00a4 #9 ISR_Default(), //sint25 0x00a8 #10 ISR_Default(), //sint26 0x00ac #11 ISR_Default(), //sint27 0x00b0 #12 ISR_Default(), //sint28 0x00b4 #13 ISR_Default(), //sint29 0x00b8 #14 ISR_Default(), //sint30 0x00bc #15 ISR(Eint0Isr), //int0 0x00c0 #16 ISR(Eint1Isr), //int1 0x00c4 #17 ISR(Eint2Isr), //int2 0x00c8 #18 ISR(Timer0Isr),//tint 0x00cc #19 ISR(McBSPIsr), //rint0 0x00d0 #20 ISR_Default(), //xint0 0x00d4 #21 ISR_Default(), //rint1 0x00d8 #22 ISR_Default(), //xint1 0x00dc #23 ISR(Eint3Isr), //int3 0x00e0 #24 ISR_Default(), //hpint 0x00e4 #25 ISR_Default(), // 0x00e8 #26 ISR_Default(), // 0x00ec #27 ISR_Default(), // 0x00f0 #28 ISR_Default(), // 0x00f4 #29 ISR_Default(), // 0x00f8 #30 ISR_Default(), // 0x00fc #31 };
哈哈~~~让intvecs.asm见鬼去吧~~~
6.14确实是个好日子~~~俺分别倒塌了: 1.构造了cstring,使ccs能和其他的C++一样对字符串的操作,而且可以随意增添.
2.实现了外部RAM/ROM真正的数组访问,而且比指针少一条指令.
3.成功正法ASM~~~
4.第6感告诉俺HotOS肯定会实现~~而且在代码空间上估计能打败DSP/BIOS, 但愿苍天有眼不辜负菜农的"一腔热血"~~~
|