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

2019-07-20 04:56发布

很多教程都说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);
}


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

比如这个例子,两个任务使用全局变量通信,没有做什么临界段什么保护,也没啥问题啊?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
szczyb1314
1楼-- · 2019-07-20 09:33
 精彩回答 2  元偷偷看……
琉璃
2楼-- · 2019-07-20 12:45
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 的过程中发生任务抢占,也没有
什么影响吧?不太明白错误的数据指的是什么?
szczyb1314
3楼-- · 2019-07-20 13:53
你的这个例子太过简单,等下我给你个复杂的例子看看
szczyb1314
4楼-- · 2019-07-20 17:20
 精彩回答 2  元偷偷看……
琉璃
5楼-- · 2019-07-20 19:35
szczyb1314 发表于 2018-11-18 17:16
例子是原子哥的UCOS的:直接访问共享资源和使用信号量访问共享资源
不用管是那个OS,都一样的,全局变量就 ...

谢谢大神指导。这就看你说的那本书去。
szczyb1314
6楼-- · 2019-07-20 20:26
 精彩回答 2  元偷偷看……

一周热门 更多>