RTOS中任务、事件、消息之间的关系
它们之间的关系如下:
1、任务是处理事件的一个功能集合,一般由一个事件处理函数实现(ProcessEvents)
2、事件是当前系统中被触发的动作,例如有按键按下,接收到其他节点发送过来的消息等等
3、消息则是事件编号和其对应事件内容的集合,发生事件并将其打包到消息队列,供事件处理函数进行处理
大致的流程如下:
**事件发生后-->被打包为消息-->存放到消息队列-->事件处理函数取出消息并进行相应操作。**
关于消息队列的几个疑问?
1、对于一个任务发送消息,多个任务接收消息,那么接收消息的任务如何确定接收的消息是否是自己想要的?
2、多个任务发送消息,一个任务接收消息,那么如何确定接收消息的来源呢?
3、任务通知方式仅可以用在只有一个任务等待信号量,消息邮箱或者事件标志组的情况???具体是指整个工程的通知方式只能三选一???还是说一个任务中的通知方式只能三选一???
答:工程中只能有一个任务接收任务通知(信号量,消息邮箱或者事件标志组)。
关于FreeRTOS各种信号的理解:
一、共同点:
都是在接收到自己相对于的信号时,这个任务后面的程序的才可以进入运行态或就绪态,否则,这个任务一直处于阻塞态。
二、不同点:
1、事件标志组:传递的是标志位
1)选择“等待所有标志位都被设置”时,那么这个任务后面的程序只有在所有的标志位全部置位后,才会进 入运行态或就绪态。而对于这些标志位,可以在不同的任务、不同的函数中分别置位,也可以同时置位
2)选择“等待不是所有标志位都被设置”时,那么只有有一个标志位置位,后面的的程序就可进入运行态或就绪态
2、消息队列:传递的是数值(指针值)
3、计数信号量:传递的是信号量计数值
1)这个计数值的大小,代表可用资源的数量,每占用一个资源,信号量计数值-1;每释放一个资源,信号量计数值+1.
2)当这个计数值为0时,表示没有资源可以使用,任务进入阻塞态,直至有信号量释放。
4、二值信号量:相当于只有0或1两种计数值的计数信号量。
5、互斥信号量:可以防止优先级翻转的二值信号量。
三、任务通知方式:任务事件标志组、…
1、任务事件标志组、任务计数信号量、任务二值信号量、任务消息邮箱
2、注意事项
1)任务通知方式只能有一个任务接收任务通知(信号量,消息邮箱或者事件标志组),不过实际项目项目中这种情况也是最多的。
2) 接收通知的任务可以因为等待通知而进入阻塞状态,但是发送通知的任务即便不能立即完成发送通知,也不能进入阻塞状态。