从0到1学习FreeRTOS:FreeRTOS 内核应用开发:(十)消息队列 NO.3 消息队列使用注意事项和实验现象

从0到1学习FreeRTOS:FreeRTOS 内核应用开发:(十)消息队列 NO.3 消息队列使用注意事项和实验现象

目录

一、消息队列使用注意事项:

二、消息队列使用总结:

三、消息队列实验:


一、消息队列使用注意事项:

       如果队列存储的数据较大时,那最好是利用队列来传递数据的指针而不是数据本身,因为传递数据的时候是需要CPU一字节一字节地将数据拷贝进队列或从队列拷贝出来。而传递指针无论是在处理速度上还是内存空间利用上都更有效。但是,当利用队列传递指针时,一定要十分小心地做到以下两点

1、指针指向的内存空间的所有权必须明确当任务间通过指针共享内存时,应该从根本上保证所不会有任意两个任务同时修改共享内存中的数据,或是以其它行为方式使得共享内存数据无效或产生一致性问题。原则上,共享内存在其指针发送到队列之前,其内容只允许被发送任务访问;共享内存指针从队列中被读出之后,其内容亦只允许被接收任务访问

2、指针指向的内存空间必须有效如果指针指向的内存空间是动态分配的,只应该有一个任务负责对其进行内存释放。当这段内存空间被释放之后,就不应该有任何一个任务再访问这段空间。并且最最最重要的是禁止使用指针访问任务栈上的空间,也就是局部变量。因为当栈发生改变后,栈上的数据将不再有效

二、消息队列使用总结:

在使用 FreeRTOS 提供的消息队列函数的时候,需要了解以下几点:


1、使用 xQueueSend()、 xQueueSendFromISR()、 xQueueReceive()等这些函数之前应先创建需消息队列,并根据队列句柄进行操作
2、队列读取采用的是先进先出( FIFO)模式,会先读取先存储在队列中的数据。当然也 FreeRTOS 也支持后进先出(LIFO)模式,那么读取的时候就会读取到后进队列的数据。
3、在获取队列中的消息时候,我们必须要定义一个存储读取数据的地方,并且该数据区域大小不小于消息大小,否则,很可能引发地址非法的错误。
4、无论是发送或者是接收消息都是以拷贝的方式进行, 如果消息过于庞大,可以将消息的地址作为消息进行发送、接收。
5、队列是具有自己独立权限的内核对象,并不属于任何任务。所有任务都可以向同一队列写入和读出。一个队列由多任务或中断写入是经常的事,但由多个任务读出倒是用的比较少。
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值