为了降低 FRAM 消耗、我要尝试将同一个公共陷阱处理程序设置为 MSP430FR6043上的多个中断矢量。
借助 TI 编译器、可以使用"pragma 向量":
#pragma vector=RTC_VECTOR, PORT2_VECTOR, …, UNMI_VECTOR __interrupt void Dummy_ISR(void) { while (1) { } }
MSP430 GCC 编译器9.3.1.11是否有使用"__attribute__(interrupt (x))"的等效代码?
在 MSP430 IRQ 处理器和向量中 、有一条提示、但是它每32位而不是每16位填充一次存储器(向量表中有16位元素!)。
示例 msp430fr6043.ld:
MEMORY { … UNUSED_VECTS_1 : ORIGIN = 0xFF90, LENGTH = 0x004C /* END=0xFFDB, 38 vectors, size 76 bytes*/ … } SECTIONS { … __unused_vectors_1 : { KEEP (*(__unused_vectors_1)) } > UNUSED_VECTS_1 /* 0 - 37 = 38 vectors */ … }
Traps.c:
static void __attribute((interrupt)) default_trap(void) { while (1) { } } __attribute__((section("__unused_vectors_1"), used)) static void (*vectors[19])(void) = { // 1. compile ok, but elements are 32 not 16-bit! //static const uintptr_t v[19] = { // 2. compile ok, but elements are 32 not 16-bit! //static const __int20 v[19] = { // 3. compile ok, but elements are 32 not 16-bit! //static const uint16_t v[38] = { // 4. compile error: initializer element is not computable at load time default_trap, // unused default_trap, // unused default_trap, // unused default_trap, // unused 0, // intentionally left zero to check the result 0, // same as above };
在上述 traps.c 代码片段中,前3种形式会进行编译,但结果是错误的。 例如、如果 DEFAULT_TRAP 的结果地址为0x99FA、那么在0xFF90处得到的存储器内容为:99FA 0000、99FA 0000、99FA 0000、99FA 0,000,0000 0000、 0000 0000,... 但我期望的是99FA, 99FA, 99FA, 99FA,...
如果我尝试将表强制为16位(上述 traps.c 中的形式4)、则代码无法编译、并出现"加载时无法计算初始化器元素"错误!
有什么建议如何使用任何 C/ASM/连接器组合通过 GCC 实现此目标? 谢谢!