目录
1 任务通知
1. 基本概念
我们之前讲过消息队列、信号量、互斥量、事件组,它们都可以实现任务间的通信和同步。本节我们讲解任务通知(Task Notifications),它是freeRTOS中实现的另一种通信和同步的方法,在一定程度上可以代替信号量、消息队列、事件标志组的功能;而且任务通知所需要的资源更少、执行速度更快。
freeRTOS的任务通知,和信号量、消息队列、事件标准组一样,也是一种可以阻塞任务的事件。 每个任务对应有一个任务通知,任务可以在等待自己对应的任务通知时被阻塞,向该任务通知发送通知可以唤醒该任务;
任务通知的值,就是任务控制块结构体中的变量ulNotifiedValue,32bit;这也说明了任务通知是和任务一一对应的; 更新任务通知的值ulNotifiedValue,可以有多种方式:覆盖旧通知值、(如果上次未处理则)不覆盖旧通知值、更新任务通知的某几个bit、增加任务通知值。
灵活运用更新任务通知值的方法,可以使任务通知实现信号量、消息队列、事件标志组等的功能。 例如:向某个任务发送一个信号量,可以通过将该任务的通知值加1实现;获取信号量,可以将该任务的通知值减1实现; 向某个任务的通知值中写入一个数据,相对于向该任务发送了一个长度为1的消息; 设置某个任务通知值的bit0~bit31,可以实现事件标志组。
2.任务通知的优势与限制
任务通知实现的信号量、消息队列、事件标志组,比之前讲过的实现方法占用内存更少、执行速度更快;但是使用时有一些限制:
- 不能同时使用任务通知来广播给多个任务,也就是说同一时间对于某个任务,只能实现一个“信号量”或“消息队列”或“事件标志组”的作用;
- 使用任务通知时,不支持发送信息的超时等待(即发送方不可超时等待,这一点和之前讲过的信号量、消息队列、事件标志组不同,它们是可以支持超时等待的)。
2 示例程序
2.1 例程功能
创建两个按键任务,按键按下即发送一个任务通知;创建一个打印任务,等待发送任务通知并判断那一位为1。
2.2 步骤
配置两个按键IO口

文章介绍了FreeRTOS中的任务通知机制,作为实现任务间通信和同步的一种方法,它可以替代信号量、消息队列和事件标志组。任务通知具有资源消耗低、执行速度快的特点,但不支持广播和超时等待。示例程序展示了如何通过按键任务触发通知,并在打印任务中接收和解析这些通知。
最低0.47元/天 解锁文章
288

被折叠的 条评论
为什么被折叠?



