搜索
bottom↓
回复: 4

ucos 临界段 疑问 求教

[复制链接]

出0入0汤圆

发表于 2011-2-24 10:48:02 | 显示全部楼层 |阅读模式
我知道的:
临界段通过关中断的方式,禁止了任务调度,虽然降低了实时性,但保护了全局变量不被修改。

解释一下:
int a;// 全局变量

void taska(void)                     void taskb(void)
{                                          {
     while(1)                                 while(1)
     {                                          {
           a = 5;       // 1                        a = 8;       // 3
           a++;         // 2                        .....
           .........                             }
     }                                     }
}

当程序运行到1句时,a = 5,此时被高优先级任务b抢占,全局变量a=8;当回到任务a时,a++就变成9了,一般不是用户所希望的。
所以taska中的全局变量应该保护一下,方法有很多,可以用开关中断的方法,于是改成如下任务:

void taska(void)                     
{                                          
     while(1)                                
     {                                         
         OS_ENTER_CRITICAL();
          a = 5;       // 1               
           a++;         // 2               
         OS_EXIT_CRITICAL();
            .........                        
     }                                    
}
这样修改a的时就不会被其他任务修改;这是容易理解的。

说了这么多,进入正题:
引用ucos内核os_core.c文件的一句程序

OS_ENTER_CRITICAL();
OSIdleCtr    = 0L;               /* Clear idle counter */
OS_EXIT_CRITICAL();

疑问:为何赋值0也要保护,就算赋值前OSIdleCtr被修改,但是再回来还是会被赋值0,所以我认为此处的临界段处理是多余的。请问诸位我理解对吗?

出0入0汤圆

发表于 2011-2-25 10:00:52 | 显示全部楼层
注意OSIdleCtr的数据类型肯定不是字节吧!如果一种处理器只有对内存进行字节操作的指令,那么这条语句肯定是分成很多条指令执行的。记不清L是多少位的了,假如是32位的吧!那这四个字节只能一个字节一个字节的修改了。假如先修改了最低的一个字节,原先OSIdleCtr=0x12345678,被改成0x12345600,然后丢失了处理器,就要出问题了。可见这行代码是提高了代码的兼容性。而且这行代码告诉我们一个原则:对全局变量的修改,只有是作为一个相对独立的操作的,都要在临界区内,这样就不会出问题了。

出0入0汤圆

发表于 2011-3-5 22:32:42 | 显示全部楼层
楼上解释精彩,谢谢

出0入0汤圆

发表于 2011-3-7 13:08:48 | 显示全部楼层
1、  全局变量在“中断服务程序”中“生产”,然后在任务中“消费”
        这种情况,只能使用临界段来保护

   2、 全局变量在一个任务中“生产”,然后在其它任务中“消费”

        这种情况,最好不要使用临界段保护,因为会降低操作系统的实时性,

        最好的方法是:使用信号量。

出0入10汤圆

发表于 2014-10-20 23:37:47 | 显示全部楼层
ba_wang_mao 发表于 2011-3-7 13:08
1、  全局变量在“中断服务程序”中“生产”,然后在任务中“消费”
        这种情况,只能使用临界段来保 ...

完全不能理解,不知所云,可以说下为什么吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 08:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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