8978|10

17

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

ucos 临界保护 问题 [复制链接]

 小弟求教下有关 OS_ENTER_CRITICAL()与 OS_EXIT_CRITICAL()的问题
假如 uCos-II 运行多任务时,最高优先级的任务对某一些全局变量进行写操作(如赋值或加减运算),一些低优先级对它进行读操作。有没有必要对这些全局变量进行临界保护?

小弟认为这个不需要进行临界保护,但是一个前辈对这些全局变量进行了临界保护。这个到底要不要呢?求教高手答疑。谢谢!~~

最新回复

还是要看这个变量类型,看低优先级的读操作是否是原子的。 这里要注意原子性并非指一条汇编才原子,实际上即使一次赋值编译成几条汇编依然可以是原子的,只要保证该内存不产生中间值,只有原值和目标值两种状态则就是原子的。 如果这里的变量是double,那读变量是需要执行多次ldr指令才能把整个变量读出来,如果只读了一半,就被高优先级任务抢占,并对变量进行了写入,那返回低优先级任务继续读就会出问题:读出来的值中,一半是写入之前的值,一半是写入之后的值。  详情 回复 发表于 2016-8-24 11:20
点赞 关注
 

回复
举报

6

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
OS_ENTER_CRITICAL():这个函数主要是关门处理器中断总开关。OS_EXIT_CRITICAL():把与之对应的中断总开关关闭。
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 qzgui 的帖子

OS_ENTER_CRITICAL()关掉总中断的情况下,系统时钟关掉了,任务调度关掉了。所以高优先级任务对内部全局变量操作也就无法操作。只有当OS_EXIT_CRITICAL(),重新恢复了正常。
用了这个临界保护也就保护了当前对全局变量的操作。但是如果此时是最高优先级任务的话,个人感觉无需对此全局变量做临界保护,因为没有任务能中断它了。唯一的就是中断,但是中断如果没对这全局变量进行操作,所以临界保护不需要,这个我个人的分析,不知道对不对?求教高手!
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

4
 
不清楚你任务的功能,从算法上来说,
低优先级读数据的话,数据实时性不高,
做临界保护没实质意义
 
 
 

回复

112

帖子

0

TA的资源

一粒金砂(高级)

5
 
我认为不需要
1.高优先级的任务写的时候,能完整的写完,不会被干扰。因为中断服务程序不会去写这个变量。
当高优先级的任务被进入阻塞态,低优先级的任务才会有机会运行,读完全没有问题
如果动不动就进临界区,那么时钟中断和其他中断响应被关闭,系统就不是实时的了
2.如果写的任务是低优先级的,而且如果写的语句不是一条而是多条,那么就应该加上
       OS_ENTER_CRITICAL();
       your processing;
                OS_EXIT_CRITICAL();
因为高优先级的任务可能读到你写到一半的数据
如果及时如此也没有什么问题,还是可以不进临界区。

我的理解是在完整的阅读了源代码的基础上的
请参考卢有亮的《嵌入式实时操作系统μC/OS原理与实践》,该书有全套PPT和源代码,包括例子程序,可以在WINDOWS上虚拟运行,VC6就可以打开整个工程,采用的是USOS2.91,感兴趣的可以在电子工业出版社网站下载http://www.broadview.com.cn/15441或加群215824172学习和交流(注明学习目的)。
 
 
 

回复

112

帖子

0

TA的资源

一粒金砂(高级)

6
 
楼主的写任务优先级高于读任务,完全不需要临界区保护
1.写任务的优先级高,在写的时候不会被中断;读任务优先级低,在读的时候不会影响全局变量的内容。
2.中断服务程序不会影响这个变量
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

7
 
呃,说得有点绝对了,中断归中断,只是完了不调度而已!
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(初级)

8
 
分析的很详细,学习了
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(中级)

9
 
确实不用加,理由上面几位都说了。但是,这里有一个前提:你是在做实验,而不是在做产品。如果你是做产品,那么你还是加上吧,这是牵涉到一个后期调试还有代码稳定性的问题……
 
 
 

回复

104

帖子

0

TA的资源

一粒金砂(高级)

10
 

回复 楼主 greedangel 的帖子

写的数据量小,任务执行时间短的,不需要保护。但是对于数据量大,而且任务执行时间长,有可能在你写数据的时造成中断的(并且没写完对于读取的时候影响很大的),必须要保护一下
 
 
 

回复

5

帖子

1

TA的资源

一粒金砂(中级)

11
 
还是要看这个变量类型,看低优先级的读操作是否是原子的。
这里要注意原子性并非指一条汇编才原子,实际上即使一次赋值编译成几条汇编依然可以是原子的,只要保证该内存不产生中间值,只有原值和目标值两种状态则就是原子的。
如果这里的变量是double,那读变量是需要执行多次ldr指令才能把整个变量读出来,如果只读了一半,就被高优先级任务抢占,并对变量进行了写入,那返回低优先级任务继续读就会出问题:读出来的值中,一半是写入之前的值,一半是写入之后的值。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表