ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

关于μC/OS消息队列的注意事项

2026/8/8 1:39:10 拓冰建站 浏览量
关于μC/OS消息队列的注意事项

关于μC/OS消息队列的注意事项


之前在μC/OS系统中使用消息队列传递串口信息,由于数据帧数量多但数据量小,使用一个变量接收数据,有数据将其接收并丢入队列中,再单独起一个任务死等该队列,一有消息立即执行相关回调函数,构想非常完美,但是在使用中,该任务总是会不明不白卡死,而进入HardFault,当时非常不解,后来这个构想被推翻,直到后来使用FreeRTOS时发现一些值得注意的问题…

基本原理通常队列采用先进先出(FIFO)的存储缓冲机制,也就是往队列发送数据的时候(也叫入队)永远都是发送到队列的尾部,而从队列提取数据的时候(也叫出队)是从队列的头部提取的。但是也可以使用LIFO 的存储缓冲,也就是后进先出。
数据拷贝方式数据发送到队列中会导致数据拷贝,也就是将要发送的数据拷贝到队列中,这就意味着在队列中存储的是数据的原始值,而不是原数据的引用(即只传递数据的指针),这个也叫做值传递,值传进队列后一般不会被篡改;但还有一种引用传递传递的是数据的地址,这就意味数据的值可能被外界篡改,比如用一个全局变量存储接收到的数据,这个全局变量的地址被传入队列,但当新的数据被接收,同样用这个变量接收,那么队列里的数据还没出队列就被新数据覆盖,换句话说就是采用引用传递的话消息内容就必须一直保持可见性,也就是消息内容必须有效,那么局部变量这种可能会随时被删掉的东西就不能用来传递消息。

利弊:
1、引用传递省时,不用进行数据拷贝;采用值传递的话虽然会导致数据拷贝,会浪费时间,一般网络应用环境中,网络的数据量很大时候使用该方式。
2、值传递省事好理解,数据缓冲区就可以删除掉或者覆写,这样的话这些缓冲区就可以被重复的使用,适用于消息多而短,且时效要求不是特别严格的情况。

FreeRTOS 队列传递消息可使用数据拷贝,也可使用引用来传递,但是在μC/OS中消息队列时使用引用传递,刚好我使用的就是一个变量来接收数据,这就就是我的数据会被篡改或释放导致程序运行出问题的原因