OpenEdv-开源电子网

标题: FREERTOS中使用全局变量的问题。 [打印本页]

作者: Y-Hanxiao    时间: 2017-7-3 09:05
标题: FREERTOS中使用全局变量的问题。
在freertos队列章节中,看到如下内容:
(, 下载次数: 57)
想搞明白使用全局变量会出现什么问题。串口接收到数据后,要存储在一个数组中,这个数组不也是全局变量吗?


作者: zuozhongkai    时间: 2017-7-3 09:05
本帖最后由 zuozhongkai 于 2017-7-3 09:19 编辑

都给你写的清清楚楚了“资源管理”的问题!多任务访问全局变量会带来共享资源管理问题,消息队列最终是用的全局变量!但是消息队列对这个全局变量做了保护,重点就是资源管理的保护!假如你直接使用全局变量,那么在代码中任何任务都可以随时随地的访问、修改这个全局变量!比如A任务正在使用全局变量S,A任务由于任务切换暂停运行切换到B任务,而B任务也要使用S,这时候B任务修改了S的值。当再次切换到A任务的时候这个变量S不就变了?A任务可能就运行出错。如果使用消息队列的话,A任务要使用队列S,先申请,申请成功以后才可以使用。B任务也要使用S的时候也要先申请,当时发现S已经被A任务使用了,所以B任务就没法使用(假设当前的队列长度为1),直到A任务使用完S并且释放掉B任务才申请使用!
作者: Y-Hanxiao    时间: 2017-7-3 23:22
zuozhongkai 发表于 2017-7-3 09:12
都给你写的清清楚楚了“资源管理”的问题!多任务访问全局变量会带来共享资源管理问题,消息队列最终是用的 ...

这个问题想清楚了,又一个新的问题,多个任务(比如三个)向一个队列(长度也是3)中发送消息,如何保证每个任务的信息都发到了队列中,并且读队列的任务能把几个任务传的参数都读出,而不是一直传输的是三个任务中优先级最高的那个任务的发送的数据。
作者: FreeRTOS    时间: 2017-7-4 14:15
Y-Hanxiao 发表于 2017-7-3 23:22
这个问题想清楚了,又一个新的问题,多个任务(比如三个)向一个队列(长度也是3)中发送消息,如何保证 ...

对于全局变量的安全使用,其实网上已有很明确的方法
为了避免读-改-写导致的全局变量问题的出现,一定要对变量做临界区保护,或者是关中断
楼上左工说的队列,其实核心也是用了OS的临界区做保护
作者: MDZZYUE    时间: 2017-7-9 21:23
楼主的资料哪里来的 我咋没有找到呢 可否分享一下
作者: swanegong    时间: 2018-2-11 08:59
可是我看四轴飞行器里面FreeRTOS的例程不是还是使用了好多全局变量???
作者: pcf2000    时间: 2019-7-8 16:19
有没有完整章节的FreeRTOS的中文资料,我下载的怎么只有6个章节?
作者: jiuhao2019    时间: 2019-7-9 17:17
Y-Hanxiao 发表于 2017-7-3 23:22
这个问题想清楚了,又一个新的问题,多个任务(比如三个)向一个队列(长度也是3)中发送消息,如何保证 ...

如果不是很需要实时性的情况,建议全局变量使用开关调度器即可,回到你这个问题,队列有长度,这个长度是item的个数;队列慢满,只有读取一个item,其他发送任务才能往队列里增加一个新的item;可以FIFO或者FILO;17年的问题,楼主现在应该已经解决了吧.
作者: zhamatu    时间: 2019-9-14 11:33
对于使用DMA进行串口接收的情况,全局变量的方式更快吧,因为DMA接收把串口接收数据直接存储到一个全局数组中,如果使用消息队列的方式,就需要逐个字节拷贝传输。二全局变量就省去了逐个拷贝的过程,可以直接对全局数组访问就可以了。
作者: zhamatu    时间: 2019-9-14 11:36
不是特别复杂的程序,对同一个全局数组,一般不会出现过多的任务需要访问,最多也就3,4个任务需要访问一个全局变量,而且有前后顺序关系的,不是那么容易出现读改写变化的。
作者: zhamatu    时间: 2019-9-14 11:38
当然了,全局变量带来的时间节省在MCU速度很快的情况下,或许很有限。从程序的健壮性来讲,当任务复杂性和规模提高后,一定是用消息队列的方式更好!!
作者: caoenq    时间: 2020-6-18 13:41
zhamatu 发表于 2019-9-14 11:36
不是特别复杂的程序,对同一个全局数组,一般不会出现过多的任务需要访问,最多也就3,4个任务需要访问一个 ...

1.首先FreeRTOS官方文档都不建议实用队列来传递数据,因为这样效率实在是太低,如果非要实用队列,那也是传指针而非传递数据本身。
2.其次在多任务操作系统中实用全局变量,设计成只有一个任务可以改变这个全局变量的值,其他多个任务只是读取这个全局变量的值(不会去写这个全局变量),这种应用也是不会有任何问题的。




欢迎光临 OpenEdv-开源电子网 (http://www.openedv.com:80/) Powered by Discuz! X3.4