我当前为 MSP430F2618工作的引导加载程序在64K 的存储器大小和 MSP430X 的指令集下工作正常。 将存储器大小更改为1MB 不会让函数指针跳转到所需的中断矢量。 引导加载程序的中断矢量在 crt0.asm 下定义如下:
;跳转例程以将中断从加载程序传递到 Loadee .code #define LOADEE_INT_VEC 0xE9C0 jumpvec0: MOV LOADEE_INT_VEC+0、PC 跳向1: MOV LOADEE_INT_VEC+2、PC 跳向2: MOV LOADEE_INT_VEC+4、PC 跳向3: MOV LOADEE_INT_VEC+6、PC 跳向4: MOV LOADEE_INT_VEC+8、PC 跳向5: MOV LOADEE_INT_VEC+10、PC 跳向6: MOV LOADEE_INT_VEC+12、PC 跳向7: MOV LOADEE_INT_VEC+14、PC 跳向8: MOV LOADEE_INT_VEC+16、PC 跳向9: MOV LOADEE_INT_VEC+18、PC 跳向10: MOV LOADEE_INT_VEC+20、PC 跳向11: MOV LOADEE_INT_VEC+22、PC 跳向12: MOV LOADEE_INT_VEC+24、PC 跳向13: MOV LOADEE_INT_VEC+26、PC 跳向14: MOV LOADEE_INT_VEC+28、PC 跳向15: MOV LOADEE_INT_VEC+30、PC 跳向16: MOV LOADEE_INT_VEC+32、PC 跳向17: MOV LOADEE_INT_VEC+34、PC 跳向18: MOV LOADEE_INT_VEC+36、PC 跳向19: MOV LOADEE_INT_VEC+38、PC 跳向20: MOV LOADEE_INT_VEC+40、PC 跳向21: MOV LOADEE_INT_VEC+42、PC 跳向22: MOV LOADEE_INT_VEC+44、PC 跳向23: MOV LOADEE_INT_VEC+46、PC 跳向24: MOV LOADEE_INT_VEC+48、PC 跳向25: MOV LOADEE_INT_VEC+50、PC 跳向26: MOV LOADEE_INT_VEC+52、PC 跳向27: MOV LOADEE_INT_VEC+54、PC 跳向28: MOV LOADEE_INT_VEC+56、PC 跳向29: MOV LOADEE_INT_VEC+58、PC 跳向30: MOV LOADEE_INT_VEC+60、PC #ifndef __NOVECTORS ;复位矢量 向量 保持 DW jumpvec0 DW 跳向1 DW 跳转2 DW 跳转3 DW 跳转4 DW 跳转矢量5 DW 跳转6 DW 跳转7 DW 跳转8 DW 跳转9 DW 跳转10 DW 跳转11 DW 跳向12 DW 跳转13 DW 跳转14 DW 跳转15 DW 跳转16 DW 跳转17 DW 跳转18 DW 跳转19 DW jumpvec20 DW jumpvec21 DW jumpvec22 DW 跳转23 DW jumpvec24 DW 跳转25 DW 跳转26 DW 跳转27 DW 跳转28 DW 跳转29 DW 跳转30 DW __reset #endif //#ifndef __NOVECTORS //;复位向量 // .vectors // .keep // org) RESET_VECTOR // DW _reset //#endif
从引导加载程序跳转到程序的代码如下所示:
#define bootloader_vector 0xE9FE typedef void (* fnptr)(void);
unsigned int addr =*(unsigned int *) bootloader_vector; fnptr JAF =(fnptr) addr;
(*JAF)();//条件检查内部
该程序是在用于 MSP430的 CrossStudio 中编写的。 当我将存储器大小设置为64K 时、在.hzx 下定义的 intvec 指示 jumpvecX 定义的地址从82fc 开始到 fafc、并在语句 DW __reset 的00ff 结束。 地址增加1024。 即82fc、86fc、8afc 等。 将存储器大小更改为1M 会初始化 c8fc 中的 jumpvecX 定义、递增1024、jumpvec14会溢出16位地址。 尽管我使用的是 MSP430X 和1M 存储器大小、但 INTVEC 大小的限制限制为64K 意味着无法将所有 jumpvec 位置添加到其中。 我如何解决这个问题?