自从1.1.0版Chibios/RT提供了一种用于写作中断手柄的交叉平台方法。在标准系统宏内封装有关端口和编译相关细节。
常规中断处理程序是一个ISR,从中可以调用系统API,它必须使用以下通用形式编写:
CH_IRQ_HANDLER(myIRQ) {
CH_IRQ_PROLOGUE();
/* IRQ handling code, preemptable if the architecture supports it.*/
chSysLockFromISR();
/* Invocation of some I-Class system APIs, never preemptable.*/
chSysUnlockFromISR();
/* More IRQ handling code, again preemptable.*/
CH_IRQ_EPILOGUE();
}
ardupilot代码
#define OSAL_IRQ_HANDLER(id) CH_IRQ_HANDLER(id)
OSAL_IRQ_HANDLER(STM32_ADC1_HANDLER) {
OSAL_IRQ_PROLOGUE();
adc_lld_serve_interrupt(&ADCD1);
#if defined(STM32_ADC_ADC1_IRQ_HOOK)
STM32_ADC_ADC1_IRQ_HOOK
#endif
OSAL_IRQ_EPILOGUE();
}
在某些体系结构中,它被支持一种特殊的“快速中断”类,这样的中断源具有比内核更高的硬件优先级,因此不可能从那里调用系统API。必须使用以下常规格式编写快速中断处理程序:
CH_FAST_IRQ_HANDLER(myIRQ) {
/* Fast IRQ handling code, preemptable if the architecture supports it.
The invocation of any API is forbidden here because fast interrupt
handlers can preempt the kernel even within its critical zones in
order to minimize latency.*/
}
ardupilot中中断代码
#define CH_FAST_IRQ_HANDLER(id) PORT_FAST_IRQ_HANDLER(id)
关于处理程序名称myIRQ的注释,在某些端口中,它必须是向量号而不是函数名,它也可以是来自预定义集的名称,请参见有关各个端口的注释。