网站收录了文章不收录,2023年新开市场动态,wordpress 修改文章作者,深圳全网推广小程序制作中断管理介绍
嵌入式实时系统需要对整个系统环境产生的事件作出反应。这些事件对处理时间和响应时间都有不同的要求。事件通常采用中断方式检测#xff0c;中断服务例程(ISR)中的处理量应当越短越好。ISR是在内核中被调用的#xff0c; ISR执行过程中#xff0c;用户的任务…中断管理介绍
嵌入式实时系统需要对整个系统环境产生的事件作出反应。这些事件对处理时间和响应时间都有不同的要求。事件通常采用中断方式检测中断服务例程(ISR)中的处理量应当越短越好。ISR是在内核中被调用的 ISR执行过程中用户的任务无法执行。 ISR要尽量快否则其他低优先级的中断无法被处理实时性无法保证。 如果这个硬件中断的处理就是非常耗费时间呢对于这类中断的处理就要分为2部分
ISR尽快做些清理、记录工作然后触发某个任务任务更复杂的事情放在任务中处理所以需要 ISR 和任务之间进行通信 注意只有以”FromISR”或”FROM_ISR”结束的 API 函数或宏才可以在中断服务例程中。 俩套API函数
在任务函数中我们可以调用各类 API 函数比如队列操作函数 xQueueSendToBack。但是在 ISR 中使用这个函数会导致问题应该使用另一个函数 xQueueSendToBackFromISR它的函数名含有后缀FromISR表示从 ISR 中给队列发送数据。FreeRTOS中很多API函数都有两套一套在任务中使用另一套在ISR中使用。后者的函数名含有FromISR后缀。 为什么要引入两套API函数 很多 API 函数会导致任务计入阻塞状态运行这个函数的任务进入阻塞状态比如写队列时如果队列已满可以进入阻塞状态等待一会ISR 调用 API函数时 ISR 不是任务 ISR 不能进入阻塞状态。所以在任务中、在 ISR 中这些函数的功能是有差别的。 xHigherPriorityTaskWoken 参数 xHigherPriorityTaskWoken 的含义是是否有更高优先级的任务被唤醒了。如果为pdTRUE则意味着后面要进行任务切换。 可以看到在任务中调用 API 函数可能导致任务阻塞、任务切换这叫做context switch上下文切换。这个函数可能很长时间才返回在函数的内部实现了任务切换。 xQueueSendToBackFromISR()函数也可能导致任务切换但是不会在函数内部进行切换而是返回一个参数表示是否需要切换函数原型与用法如下
/*
* 往队列尾部写入数据此函数可以在中断函数中使用不可阻塞
*/
BaseType_t xQueueSendToBackFromISR(
QueueHandle_t xQueue,
const void *pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken
);
/* 用法示例 */
BaseType_t xHigherPriorityTaskWoken pdFALSE;
xQueueSendToBackFromISR(xQueue, pvItemToQueue, xHigherPriorityTaskWoken);
if (xHigherPriorityTaskWoken pdTRUE)
{
/* 任务切换 */
}使用FromISR函数时如果不想使用xHigherPriorityTaskWoken参数可以设置为NULL。
ISR中任务切换
portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); //使用汇编实现
//或者使用以下函数
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );//使用 C 语言实现void XXX_ISR()
{
int i;
BaseType_t xHigherPriorityTaskWoken pdFALSE;
for (i 0; i N; i)
{
xQueueSendToBackFromISR(..., xHigherPriorityTaskWoken); /* 被多次调用 */
}
/* 最后再决定是否进行任务切换
* xHigherPriorityTaskWoken 为 pdTRUE 时才切换
*/
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}中断延迟处理
如果在中断中需要处理的函数十分耗时那么就要考虑分为以下俩个步骤进行处理
ISR尽快做些清理、记录工作然后触发某个任务任务更复杂的事情放在任务中处理
俩套函数API