FreeRTOS中断管理(一)

探讨了二值信号量如何在中断发生时解除任务阻塞,实现任务与中断的同步,以及如何通过延迟处理任务优化中断事件处理,提高系统效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二值信号量

  • 二值信号量可以在某个特殊的中断发生时,让任务解除阻塞,相当于让任务与中断同步。这样就可以让中断事件处理量大的工作在同步任务中完成,中断服务例程(ISR)中只是快速处理少部分工作。如此,中断处理可以说是被“推迟”(deferred)到一个“处理”(handler)任务。
  • 如果某个中断处理要求特别紧急,其延迟处理任务的优先级可以设为最高,以保证延迟处理任务随时都可以抢占系统中的其他任务。这样,延迟处理任务就成为其对应的ISR退出后第一个执行的任务,在时间上紧接着ISR执行,相当于所有的处理都在ISR中完成一样
    在这里插入图片描述
  • 延迟处理任务对一个信号量进行带阻塞性质的"take"调用,意思是进入阻塞态以等待事件发生。当事件发生后,ISR对同一个信号量进行"give"操作,使得延迟处理任务解除阻塞,从而事件在延迟处理任务中得到相应的处理。
  • 信号量可以看做一个深度为1的队列。这个队列由于最多只能保存一个数据单元,所以其不为空则为满(所谓“二值”)。
  • 延迟处理任务调用xSemaphoreTake()时,等效于带阻塞时间地读取队列,如果队列为空的话任务则进入阻塞态
  • 当事件发生后,ISR通过调用xSemaphoreGiveFromISR()放置一个信号量到队列中,使得队列成为满状态。这也使得延迟处理任务切出阻塞态,并移除信号量,使得队列再次成为空。当任务完成处理后,再次读取队列,发现队列为空,又进入阻塞态,等待下一次事件发生
    在这里插入图片描述

vSemaphoreCreateBinary()

#define vSemaphoreCreateBinary( xSemaphore )//创建二值信号量

在这里插入图片描述

xSemaphoreTake()

#define xSemaphoreTake( xSemaphore, xBlockTime )//获取信号量

在这里插入图片描述

  • 除互斥信号量外,所有类型的信号量都可以通过调用函数xSemaphoreTake()来获取
  • 不能在中断服务例程中调用。

xSemaphoreGiveFromISR()

#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken )

在这里插入图片描述

对任务和中断进行同步

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
整个执行流程可以描述为:

1)中断产生。

2)中断服务例程启动,给出信号量以使延迟处理任务解除阻塞。

3)当中断服务例程退出时,延迟处理任务得到执行。延迟处理任务做的第一件事便是获取信号量。

4)延迟处理任务完成中断事件处理后,试图再次获取信号量——如果此时信号量无效,任务将切入阻塞待等待事件发生。

FreeRTOS个实时操作系统,它的中断管理是其核心功能之。在FreeRTOS中,中断管理主要是围绕中断服务例程(ISR)和任务调度来实现的。以下是些关于FreeRTOS中断管理的关键概念和特性: 1. 中断服务例程(ISR):在FreeRTOS中,当硬件中断发生时,中断服务例程会被调用。ISR应该尽可能简短和快速地执行,因为在其执行期间,中断通常是被禁用的。在ISR中,通常只做必要的硬件状态的保存和恢复,以及设置个任务通知或信号量等,来通知个或多个任务中断已经发生。 2. 任务通知:ISR通过FreeRTOS提供的API(例如xSemaphoreGiveFromISR(), xQueueSendFromISR())来通知任务。这些函数允许ISR将事件传递给任务,而不需要任务处于阻塞状态。 3. 中断优先级和FreeRTOS优先级:FreeRTOS可以运行在具有多种中断优先级的硬件上。通常,FreeRTOS会为自己的任务分配高于或等于最低硬件中断优先级的优先级,以确保中断不会被低优先级的任务阻塞。 4. 响应中断:当中断发生时,FreeRTOS的任务调度器会根据当前的中断处理和系统状态来决定是否进行任务切换。如果有必要,调度器会在ISR完成后切换到适当的高优先级任务。 5. 中断和上下文切换:FreeRTOS的上下文切换是由中断触发的,特别是由系统时钟中断触发,它允许调度器周期性地检查是否有更高优先级的任务准备运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值