FreeRTOS中断管理

admin2024-05-15  5

文章目录

  • 前言
  • 一、ISR的API函数
  • 二、切换任务

前言

RTOS中,需要应对各类事件。这些事件很多时候是通过硬件中断产生。
假设当前系统正在运行Task1任务,用户按下了按键,触发了按键中断。触发中断后:
硬件负责:
CPU跳到固定地址去执行代码,这个固定地址通常被称为中断向量。
软件负责:

  1. 保存现场:Task1被打断,需要先保存Task1的运行环境,比如各类寄存器的值;
  2. 调用处理函数(这个函数就被称为ISR,interrupt service
    routine)
  3. 恢复现场:继续运行Task1,或者运行其他优先级更高的任务。

本章主要涉及

  1. FreeRTOS的哪些API函数能在ISR中使用
  2. 怎么把中断的处理分为两部分:ISR、任务

提示:以下是本篇文章正文内容,下面案例可供参考

一、ISR的API函数

FreeRTOS中很多API函数都有两套:一套在任务中使用,另一套在ISR中使用。因为很多API函数会导致任务计入阻塞状态,但是ISR不能进入阻塞状态,所以需要另一套函数。

类型在任务中在ISR中
队列(queue)xQueueSendToBackxQueueSendToBackFromISR
xQueueSendToFrontxQueueSendToFrontFromISR
xQueueReceivexQueueReceiveFromISR
xQueueOverwritexQueueOverwriteFromISR
xQueuePeekxQueuePeekFromISR
信号量(semaphore)xSemaphoreGivexSemaphoreGiveFromISR
xSemaphoreTakexSemaphoreTakeFromISR
事件组(event group)xEventGroupSetBitsxEventGroupSetBitsFromISR
xQueueSendToBackxQueueSendToBackFromISR
参数不同xTicksToWait: 队列满阻塞时间没有xTicksToWait
唤醒等待的任务写队列后,会唤醒等待数据的任务,如果唤醒任务优先级高会发起调度写队列后,会唤醒等待数据的任务但不调度,只会记录是否需要发起调度
阻塞如果队列满,可以阻塞 也可以即刻返回如果队列满,即刻返回

二、切换任务

我们希望中断处理要快,那当我们处理比较耗时的中断就需要中断的延迟处理

  1. ISR:尽快做些清理、记录工作,然后触发某个任务
  2. 任务:更复杂的事情放在任务中处理
    FreeRTOS中断管理,在这里插入图片描述,第1张
void XXX_ISR()
{
int i;
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
for (i = 0; i < N; i++)
{
xQueueSendToBackFromISR(..., &xHigherPriorityTaskWoken); /* 被多次调用 */
}
/* 最后再决定是否进行任务切换
* xHigherPriorityTaskWoken为pdTRUE时才切换
*/
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!