请注意,此答案仅适用于 Cortex 系列 ARM 处理器
我看到您不久前找到了解决方案,希望这对将来遇到类似问题的任何人都有用。
设置中断向量的方法有很多,它们在硬件之间差异很大,并且某些平台可能需要额外的步骤。下面的解决方案通常在 ARM Cortex 微控制器上可行,并且与编译器无关。
#include <string.h>
//Size of vector table, note yours is probably 16 entries
#define VECTOR_TABLE_ENTRIES 4
//Base address in MCU memory of vector table (by default 0x0 for ARM9)
#define HARDWARE_VECTOR_TABLE_ADDRESS 0x00000000
typedef void(*isr_vector)(void);
void myIsr1();
void myIsr2();
void myIsr3();
void myIsr4();
static isr_vector s_vector_table[VECTOR_TABLE_ENTRIES] =
{
myIsr1,
myIsr2,
myIsr3,
myIsr4
};
/**
* Load interrupt vector to correct area in system memory, call on startup
*/
void load_vector_table()
{
memcpy(HARDWARE_VECTOR_TABLE_ADDRESS, s_vector_table, sizeof(isr_vector));
}
void myIsr1()
{
}
...
如果您只需要向表中添加一个条目,您可以使用以下命令:
void set_vector_table_entry(int index, isr_vector vector)
{
*(HARDWARE_VECTOR_TABLE_ADDRESS + (sizeof(isr_vector) * index)) = vector;
}
归根结底,设置表是简单的部分,您所做的就是加载指向特定位置的函数指针表,困难的部分是在正确的寄存器中设置正确的位以启用中断并清除正确地追随他们。
进一步请注意,中断函数通常需要使用编译器特定的关键字或编译指示来声明,以确保编译器生成正确的代码。这是因为调用中断向量时的函数调用和返回处理通常与调用普通函数时不同。
请注意,ARMv7 架构支持重新映射向量表,这非常有用,这种方法增加了对表对齐的约束,但这反过来又需要编译器/链接器特定的指令。