OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16255|回复: 11

FREERTOS中使用全局变量的问题。

[复制链接]

28

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
263
金钱
263
注册时间
2015-11-28
在线时间
51 小时
发表于 2017-7-3 09:05:22 | 显示全部楼层 |阅读模式
5金钱
在freertos队列章节中,看到如下内容:
11111111111.png
想搞明白使用全局变量会出现什么问题。串口接收到数据后,要存储在一个数组中,这个数组不也是全局变量吗?

最佳答案

查看完整内容[请看2#楼]

都给你写的清清楚楚了“资源管理”的问题!多任务访问全局变量会带来共享资源管理问题,消息队列最终是用的全局变量!但是消息队列对这个全局变量做了保护,重点就是资源管理的保护!假如你直接使用全局变量,那么在代码中任何任务都可以随时随地的访问、修改这个全局变量!比如A任务正在使用全局变量S,A任务由于任务切换暂停运行切换到B任务,而B任务也要使用S,这时候B任务修改了S的值。当再次切换到A任务的时候这个变量S不就变 ...
笑哥
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-7-3 09:05:23 | 显示全部楼层
本帖最后由 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任务才申请使用!
回复

使用道具 举报

28

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
263
金钱
263
注册时间
2015-11-28
在线时间
51 小时
 楼主| 发表于 2017-7-3 23:22:46 | 显示全部楼层
zuozhongkai 发表于 2017-7-3 09:12
都给你写的清清楚楚了“资源管理”的问题!多任务访问全局变量会带来共享资源管理问题,消息队列最终是用的 ...

这个问题想清楚了,又一个新的问题,多个任务(比如三个)向一个队列(长度也是3)中发送消息,如何保证每个任务的信息都发到了队列中,并且读队列的任务能把几个任务传的参数都读出,而不是一直传输的是三个任务中优先级最高的那个任务的发送的数据。
笑哥
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-7-4 14:15:15 | 显示全部楼层
Y-Hanxiao 发表于 2017-7-3 23:22
这个问题想清楚了,又一个新的问题,多个任务(比如三个)向一个队列(长度也是3)中发送消息,如何保证 ...

对于全局变量的安全使用,其实网上已有很明确的方法
为了避免读-改-写导致的全局变量问题的出现,一定要对变量做临界区保护,或者是关中断
楼上左工说的队列,其实核心也是用了OS的临界区做保护
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2017-6-21
在线时间
31 小时
发表于 2017-7-9 21:23:04 | 显示全部楼层
楼主的资料哪里来的 我咋没有找到呢 可否分享一下
回复

使用道具 举报

18

主题

100

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1195
金钱
1195
注册时间
2012-3-26
在线时间
387 小时
发表于 2018-2-11 08:59:08 | 显示全部楼层
可是我看四轴飞行器里面FreeRTOS的例程不是还是使用了好多全局变量???
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2014-8-29
在线时间
11 小时
发表于 2019-7-8 16:19:13 | 显示全部楼层
有没有完整章节的FreeRTOS的中文资料,我下载的怎么只有6个章节?
回复

使用道具 举报

4

主题

44

帖子

0

精华

高级会员

Rank: 4

积分
635
金钱
635
注册时间
2019-4-23
在线时间
84 小时
发表于 2019-7-9 17:17:46 | 显示全部楼层
Y-Hanxiao 发表于 2017-7-3 23:22
这个问题想清楚了,又一个新的问题,多个任务(比如三个)向一个队列(长度也是3)中发送消息,如何保证 ...

如果不是很需要实时性的情况,建议全局变量使用开关调度器即可,回到你这个问题,队列有长度,这个长度是item的个数;队列慢满,只有读取一个item,其他发送任务才能往队列里增加一个新的item;可以FIFO或者FILO;17年的问题,楼主现在应该已经解决了吧.
回复

使用道具 举报

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-6-22
在线时间
9 小时
发表于 2019-9-14 11:33:40 | 显示全部楼层
对于使用DMA进行串口接收的情况,全局变量的方式更快吧,因为DMA接收把串口接收数据直接存储到一个全局数组中,如果使用消息队列的方式,就需要逐个字节拷贝传输。二全局变量就省去了逐个拷贝的过程,可以直接对全局数组访问就可以了。
回复

使用道具 举报

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-6-22
在线时间
9 小时
发表于 2019-9-14 11:36:05 | 显示全部楼层
不是特别复杂的程序,对同一个全局数组,一般不会出现过多的任务需要访问,最多也就3,4个任务需要访问一个全局变量,而且有前后顺序关系的,不是那么容易出现读改写变化的。
回复

使用道具 举报

4

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-6-22
在线时间
9 小时
发表于 2019-9-14 11:38:39 | 显示全部楼层
当然了,全局变量带来的时间节省在MCU速度很快的情况下,或许很有限。从程序的健壮性来讲,当任务复杂性和规模提高后,一定是用消息队列的方式更好!!
回复

使用道具 举报

0

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2019-12-31
在线时间
28 小时
发表于 2020-6-18 13:41:24 | 显示全部楼层
zhamatu 发表于 2019-9-14 11:36
不是特别复杂的程序,对同一个全局数组,一般不会出现过多的任务需要访问,最多也就3,4个任务需要访问一个 ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表