OpenEdv-开源电子网

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

请教一个Free RTOS下使用全局变量的问题

[复制链接]

9

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-1-28
在线时间
44 小时
发表于 2018-11-18 16:09:01 | 显示全部楼层 |阅读模式
100金钱
很多教程都说RTOS下使用全局变量必须加保护,否则多个任务使用同一个全局变量会发生冲突,导致破坏数据。这一点实在想不明白,全局变量不就是让任务通信吗,就是要他互相改写互相读取啊,怎么会破坏数据呢?


比如这个例子:

/********************************************/

int     flag    =  0;

void  vLED()
{
        if (flag   ==  1)LED = 1;
        if (flag   ==  0)LED = 0;

        任务延时(10);
}
void  vKEY()
{
        if (KEY   ==  1)flag = 1;
        if (KEY   ==  0)flag = 0;

        任务延时(10);
}


/********************************************/

比如这个例子,两个任务使用全局变量通信,没有做什么临界段什么保护,也没啥问题啊?

最佳答案

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

OS会导致任务切换你知道的吧?全局变量A在任务A中“使用中”任务切换至B,B中修改了全局变量A的值再切换回任务A接着使用全局变量A,此时的全局变量的值已经不是原来的值而是被B修改过了。你在任务A中得出了错误的结果就因为你没有做保护使得任务B在全局变量使用过程中(任务A使用中)修改了变量的值。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-11-18 16:09:02 | 显示全部楼层
OS会导致任务切换你知道的吧?全局变量A在任务A中“使用中”任务切换至B,B中修改了全局变量A的值再切换回任务A接着使用全局变量A,此时的全局变量的值已经不是原来的值而是被B修改过了。你在任务A中得出了错误的结果就因为你没有做保护使得任务B在全局变量使用过程中(任务A使用中)修改了变量的值。

He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

9

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-1-28
在线时间
44 小时
 楼主| 发表于 2018-11-18 16:53:55 | 显示全部楼层
szczyb1314 发表于 2018-11-18 16:19
OS会导致任务切换你知道的吧?全局变量A在任务A中“使用中”任务切换至B,B中修改了全局变量A的值再切换回 ...

谢谢回复,但是问题还是没有搞清楚。
就算使用中被另一个任务抢占了,又怎么会导致错误的结果呢?

比如上面这个例子,vLED 任务读取 flag 中,读出结果为 0 。
此时 key 抢占,改写了 flag 为1 ,切换回 vLED 任务后读
取 flag ,发现结果变为 1。整个过程中,vKEY 扫描案件,
把按键情况通过 flag 告知 vLED 任务,vLED 任务根据 flag
决定是否点灯。

这个过程中,即使读写 flag 的过程中发生任务抢占,也没有
什么影响吧?不太明白错误的数据指的是什么?
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-11-18 17:03:12 | 显示全部楼层
你的这个例子太过简单,等下我给你个复杂的例子看看
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-11-18 17:16:53 | 显示全部楼层
例子是原子哥的UCOS的:直接访问共享资源和使用信号量访问共享资源
不用管是那个OS,都一样的,全局变量就是共享资源

另外,推荐你去看看《基于嵌入式实时操作系统的程序设计技术》-北京航空航天大学出版社-周航慈写的这本书,你的问题在第7章,我没电子版只有纸质版的,不好给你

1111.zip

7.5 MB, 下载次数: 51

He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

9

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-1-28
在线时间
44 小时
 楼主| 发表于 2018-11-18 17:32:19 | 显示全部楼层
szczyb1314 发表于 2018-11-18 17:16
例子是原子哥的UCOS的:直接访问共享资源和使用信号量访问共享资源
不用管是那个OS,都一样的,全局变量就 ...

谢谢大神指导。这就看你说的那本书去。
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-11-22 16:32:49 | 显示全部楼层
琉璃 发表于 2018-11-18 17:32
谢谢大神指导。这就看你说的那本书去。

有收获不?
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-2 05:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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