在FreeRTOS中设计中断及其ISR(中断服务程序)时,核心原则可以用通俗的语言总结为以下几点:
1. 中断要快进快出
-
解释:中断服务程序(ISR)就像是一个“急救医生”,它的任务是快速处理紧急情况(比如读取数据、清除中断标志),然后马上离开,不能在里面做太多复杂的事情(比如处理大量数据或等待其他事件)。
-
为什么:如果ISR占用太长时间,其他更紧急的中断可能无法及时响应,系统会变得不实时。
-
怎么做:在ISR中只做最必要的操作,复杂的工作可以交给任务去处理。
2. 不要阻塞中断
-
解释:ISR不能调用会“等待”的函数(比如延时函数
vTaskDelay
),因为这些函数会阻塞程序的运行,而ISR需要快速完成。 -
为什么:阻塞会导致系统无法响应其他中断,甚至可能死机。
-
怎么做:在ISR中只能使用带
FromISR
后缀的函数(比如xQueueSendFromISR
),这些函数是专门为ISR设计的,不会阻塞。
3. 中断和任务要安全通信
-
解释:ISR和任务之间需要传递数据或信号(比如告诉任务有新数据到了),但直接操作共享资源(比如全局变量)可能会导致数据混乱。
-
为什么:如果ISR和任务同时操作同一个资源,可能会导致数据错误或程序崩溃。
-
怎么