关于ucos进入临界区,恳请大神指教

2019-07-20 19:52发布

都是说临界区的代码是不能被打断的,或者反过来说,如果某段程序不能或者不应该被打断,就应该使用临界区
例如:
1>我看原子和很多其它的例程,OSTaskCreate(...)被放在临界区内,但是我觉得没必要啊,因为OSTaskCreate(...)源码中的关键代码段已经被放在临界区了...
2>下面这段代码需要在哪个地方进入临界区嘛?为什么?
[mw_shl_code=c,true]void lwip_reset_thread(void *p_arg)
{
        struct lwip_info info;
        p_arg = p_arg;
       
        Reset_GPIO_Init();
       
        while(1)
        {
                if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
                {
                        OSTimeDlyHMSM(0, 0, 5, 0);
                        if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
                        {
                                info.server_ip.addr = 0x3d0aa8c0UL; //default server ip:192.168.10.61
                                info.local_ip.addr  = 0xde0aa8c0UL; //default local ip :192.168.10.222
                                info.netmask.addr   = 0x00ffffffUL; //default netmask  :255.255.255.0
                                info.gateway.addr   = 0x010aa8c0UL; //default gateway  :192.168.10.1
                                info.port           = 0x1f90;       //default port     :8080
                                info.dhcp           = 0;            //default dhcp     :0
                                fatfs_write(file, &info); //将上面这个结构体数据通过fatfs写入flash当中
                                OSSemPost(sem_others);
                                OSSemPost(sem_serverip);
                        }
                }
                OSTimeDlyHMSM(0, 0, 1, 0);
        }
}[/mw_shl_code]


那么关键的问题来了~~~

如何判断某段代码是不可被打断的(需要进入临界区),恳请大神能够讲的清楚,细致点,小弟在此拜谢大神指教~~~

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
zmingwang
1楼-- · 2019-07-20 20:18
你贴的代码可能需要临界访问.因为用了file这个全局变量.
其实需要不需要临界访问,可以这样分析:
1.代码中是否有使用全局资源.你上面的代码就用了两个全局资源,一是GPIO,一是文件指针.
2.在本线程使用的资源,如果被其他线程改变,会对结果造成什么样的影响.你的代码中,GPIO的状态改变正是你需要的,但如果文件指针被其他线程改变,那可能就会影响结果.
3.设想其他线程可能在任何时候抢占本线程,在最坏情况下的线程切换并且全局门资源被改变,是否会对结果造成影响.你的代码,如果在写文件过程中,只写了2个字节就被打断,切换到其他线程,往文件写了10字节,再切换回来,那你剩余的数据再写到文件中.那很显然,你的数据就被打乱了.
liuchang
2楼-- · 2019-07-21 02:10
 精彩回答 2  元偷偷看……
liuchang
3楼-- · 2019-07-21 03:52
难道是我分太少了,还是人品差,怎么没人回答我的问题???
ianhom
4楼-- · 2019-07-21 09:32
帮顶~
我的理解是在操作公共资源(全局、静态变量、堆内存、硬件设备)的时候要使用临界区,防止其他任务或中断影响共享资源。
有时候没法完全保证上层调用函数前会进入临界区,所以函数内部进入临界保护是有必要的,函数对自己的操作负责。
等大神给正式答案
liuchang
5楼-- · 2019-07-21 11:29
ianhom 发表于 2016-9-22 16:46
帮顶~
我的理解是在操作公共资源(全局、静态变量、堆内存、硬件设备)的时候要使用临界区,防止其他任务 ...

感谢大神指教~
ysq7120
6楼-- · 2019-07-21 11:55
公共资源写操作需要进入临界区。你的代码里写操作的你根据你的情况判断吧。

一周热门 更多>