ardupilot chibios如何写一个中断服务函数

目录

文章目录

  • 目录
  • 1.如何创建一个中断服务函数
    • 1.编写常规中断处理程序
    • 2.编写快速中断处理程序
    • 3.处理程序命名

摘要:本节主要讲解如何创建一个中断服务函数的过程。


1.如何创建一个中断服务函数


自从1.1.0版Chibios/RT提供了一种用于写作中断手柄的交叉平台方法。在标准系统宏内封装有关端口和编译相关细节。

1.编写常规中断处理程序

常规中断处理程序是一个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();
}

2.编写快速中断处理程序

在某些体系结构中,它被支持一种特殊的“快速中断”类,这样的中断源具有比内核更高的硬件优先级,因此不可能从那里调用系统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)

3.处理程序命名

关于处理程序名称myIRQ的注释,在某些端口中,它必须是向量号而不是函数名,它也可以是来自预定义集的名称,请参见有关各个端口的注释。

你可能感兴趣的:(ardupilot学习)