SIEMENS河北省廊坊市 西门子代理商——西门子华北一级总代理
| 更新时间 2024-11-26 07:00:00 价格 请来电询价 西门子总代理 PLC 西门子一级代 驱动 西门子代理商 伺服电机 联系电话 15903418770 联系手机 15915421161 联系人 张经理 立即询价 |
在裸机编程中,当设计了一个稍微复杂的功能是,会设计处许多子函数来实现一个整体功能,这之中通知会用到一些全局变量或全局数组等来实现各个子函数之间的联系。
在RTOS中,当然也可以使用全局变量,但RTOS更推荐我们使用系统自带的任务间通信机制。原因有二:
阻塞等待机制比轮询等待更高效
全局变量当用作某种事件标志时,获取该标志的任务需要轮询检测标志是否变化,这样会产生大量无效的判断,而使用任务间通信中的阻塞等待机制,CPU可以转而处理其它事情,当标志变化时,解除阻塞,又可以及时执行后续处理。
全局变量会产生不可重入函数造成逻辑混乱
RTOS运行时,CPU是在各个任务间跳来跳去的,若使用全局变量不恰当,会导致原本设计的逻辑产生混乱。比如某个低优先级任务正在访问某个公共函数,并对该函数中的全局变量进行了修改,还未退出该函数时,更高优先级的任务抢占了CPU的使用权,并也对该函数中的全局变量进行了修改,此时,如果低优先级的任务若认为自己对变量修改成功,并因此而执行自己后续的逻辑,则会导致逻辑错误。
FreeRTOS任务间通信方式
信号量(Semaphore):用于任务间的同步,一个任务以阻塞方式等待另一个任务等待另一个任务释放信号量。
互斥量(Mutex):用于任务间共享资源的互斥访问,使用前获取锁,使用后释放锁。
事件标志组(EventGroup):也是用于任务间的同步,相比信号量,事件标志组可以等待多个事件发生。
消息队列(Queue):类比全局数据,它可以一次发送多个数据(一般将数据定义成结构体发送),每次数据的大小固定不变。
流缓冲区(StreamBuffer):在队列的基础上,优化的一种更适合的数据结构,可以一次写入任意数量的字节,并且可以一次读取任意数量的字节。
消息缓冲区(MessageBuffer):在流式缓冲区的基础上实现的,其进一步针对“消息”进行设计改进,每一条消息的写入增加了一个字节用来表示该条消息的长度,读取时需要一次性读出至少一条消息,否则会返回 0。
任务通知(Notify):不同于上面的任务间通信方式(使用某种通信对象,通信对象是独立于任务的实体,有单独的存储空间,可以实现数据传递和较复杂的同步、互斥功能),通知是发向一个指定的任务的,直接改变该任务TCB的某些变量。