FreeRTOS中断管理


前言

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

以写队列为例,来看一下这两个API有什么区别

xQueueSendToBackxQueueSendToBackFromISR
参数不同xTicksToWait: 队列满阻塞时间没有xTicksToWait
唤醒等待的任务写队列后,会唤醒等待数据的任务,如果唤醒任务优先级高会发起调度写队列后,会唤醒等待数据的任务但不调度,只会记录是否需要发起调度
阻塞如果队列满,可以阻塞 也可以即刻返回如果队列满,即刻返回

二、切换任务

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

  1. ISR:尽快做些清理、记录工作,然后触发某个任务
  2. 任务:更复杂的事情放在任务中处理
    在这里插入图片描述

FreeRTOS的ISR函数中,使用宏进行任务切换:portYIELD_FROM_ISR(xHigherPriorityTaskWoken);

void XXX_ISR()
{
int i;
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
for (i = 0; i < N; i++)
{
xQueueSendToBackFromISR(..., &xHigherPriorityTaskWoken); /* 被多次调用 */
}
/* 最后再决定是否进行任务切换
* xHigherPriorityTaskWoken为pdTRUE时才切换
*/
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值