设计方案
- 定义通用接口:为注册中断服务函数、使能和禁用中断定义通用的API,这些API在不同硬件平台上保持一致的调用方式。
- 抽象中断向量表:由于不同硬件平台中断向量表结构不同,将中断向量表的管理抽象出来,通过宏定义或配置文件来映射不同平台的中断向量。
- 条件编译:利用C语言的条件编译(
#ifdef
)根据不同硬件平台的特性进行针对性的代码编写。
关键代码示例
- 通用中断处理函数类型定义
typedef void (*InterruptHandler)(void);
- 通用中断注册函数
// 定义一个数组存储中断服务函数指针
InterruptHandler interruptHandlers[NUM_INTERRUPTS];
// 注册中断服务函数的通用函数
void registerInterruptHandler(int interruptNumber, InterruptHandler handler) {
if (interruptNumber < NUM_INTERRUPTS) {
interruptHandlers[interruptNumber] = handler;
}
}
- 使能和禁用中断的通用函数
// 使能中断的通用函数,通过条件编译适配不同平台
#ifdef PLATFORM_A
void enableInterrupt(int interruptNumber) {
// 假设PLATFORM_A有专门的寄存器来使能中断
volatile unsigned int *interruptEnableRegister = (volatile unsigned int *)0xXXXX;
*interruptEnableRegister |= (1 << interruptNumber);
}
#endif
#ifdef PLATFORM_B
void enableInterrupt(int interruptNumber) {
// 假设PLATFORM_B有不同的方式使能中断
volatile unsigned int *interruptControlRegister = (volatile unsigned int *)0xYYYY;
*interruptControlRegister |= (1 << interruptNumber);
}
#endif
// 禁用中断的通用函数,通过条件编译适配不同平台
#ifdef PLATFORM_A
void disableInterrupt(int interruptNumber) {
volatile unsigned int *interruptEnableRegister = (volatile unsigned int *)0xXXXX;
*interruptEnableRegister &= ~(1 << interruptNumber);
}
#endif
#ifdef PLATFORM_B
void disableInterrupt(int interruptNumber) {
volatile unsigned int *interruptControlRegister = (volatile unsigned int *)0xYYYY;
*interruptControlRegister &= ~(1 << interruptNumber);
}
#endif
- 中断向量表映射(以宏定义为例)
// 在PLATFORM_A的头文件中
#ifdef PLATFORM_A
#define INTERRUPT_VECTOR_OFFSET 0x08000000
#define TIMER0_INTERRUPT_VECTOR (INTERRUPT_VECTOR_OFFSET + 0x10)
#endif
// 在PLATFORM_B的头文件中
#ifdef PLATFORM_B
#define INTERRUPT_VECTOR_OFFSET 0x10000000
#define TIMER0_INTERRUPT_VECTOR (INTERRUPT_VECTOR_OFFSET + 0x20)
#endif
- 中断服务函数调用(在中断向量表相关代码中)
// 假设在PLATFORM_A的中断向量表实现中
void __attribute__((interrupt("IRQ"))) TIMER0_ISR(void) {
if (interruptHandlers[TIMER0_INTERRUPT_NUMBER] != NULL) {
interruptHandlers[TIMER0_INTERRUPT_NUMBER]();
}
// 清除中断标志等操作
}
// 假设在PLATFORM_B的中断向量表实现中
void __attribute__((interrupt("IRQ"))) TIMER0_ISR(void) {
if (interruptHandlers[TIMER0_INTERRUPT_NUMBER] != NULL) {
interruptHandlers[TIMER0_INTERRUPT_NUMBER]();
}
// 清除中断标志等操作
}
确保兼容性和高效性
- 兼容性:通过条件编译,根据不同硬件平台的定义(如
PLATFORM_A
、PLATFORM_B
),编译器会选择对应平台的代码进行编译,从而适配不同的硬件平台特性。同时,通用接口的定义保证了上层应用代码无需关心底层硬件平台差异。
- 高效性:直接对硬件寄存器进行操作,减少不必要的函数调用开销。中断向量表的合理映射和管理,使得中断响应能够快速定位到对应的中断服务函数,提高中断处理效率。并且通过条件编译针对不同平台优化代码,避免了通用代码带来的额外开销。