OpenEdv-开源电子网

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

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

[复制链接]

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2016-9-22 10:41:44 | 显示全部楼层 |阅读模式
11金钱
都是说临界区的代码是不能被打断的,或者反过来说,如果某段程序不能或者不应该被打断,就应该使用临界区
例如:
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]


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

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

最佳答案

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

你贴的代码可能需要临界访问.因为用了file这个全局变量. 其实需要不需要临界访问,可以这样分析: 1.代码中是否有使用全局资源.你上面的代码就用了两个全局资源,一是GPIO,一是文件指针. 2.在本线程使用的资源,如果被其他线程改变,会对结果造成什么样的影响.你的代码中,GPIO的状态改变正是你需要的,但如果文件指针被其他线程改变,那可能就会影响结果. 3.设想其他线程可能在任何时候抢占本线程,在最坏情况下的线程切换并且全局门资 ...
电子爱好者
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
金钱
1522
注册时间
2014-5-16
在线时间
217 小时
发表于 2016-9-22 10:41:45 | 显示全部楼层
你贴的代码可能需要临界访问.因为用了file这个全局变量.
其实需要不需要临界访问,可以这样分析:
1.代码中是否有使用全局资源.你上面的代码就用了两个全局资源,一是GPIO,一是文件指针.
2.在本线程使用的资源,如果被其他线程改变,会对结果造成什么样的影响.你的代码中,GPIO的状态改变正是你需要的,但如果文件指针被其他线程改变,那可能就会影响结果.
3.设想其他线程可能在任何时候抢占本线程,在最坏情况下的线程切换并且全局门资源被改变,是否会对结果造成影响.你的代码,如果在写文件过程中,只写了2个字节就被打断,切换到其他线程,往文件写了10字节,再切换回来,那你剩余的数据再写到文件中.那很显然,你的数据就被打乱了.
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-9-22 12:33:44 | 显示全部楼层
先自顶,等待高手~
电子爱好者
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-9-22 15:53:48 | 显示全部楼层
难道是我分太少了,还是人品差,怎么没人回答我的问题???
电子爱好者
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-9-22 16:46:28 | 显示全部楼层
帮顶~
我的理解是在操作公共资源(全局、静态变量、堆内存、硬件设备)的时候要使用临界区,防止其他任务或中断影响共享资源。
有时候没法完全保证上层调用函数前会进入临界区,所以函数内部进入临界保护是有必要的,函数对自己的操作负责。
等大神给正式答案
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-9-23 09:16:41 | 显示全部楼层
ianhom 发表于 2016-9-22 16:46
帮顶~
我的理解是在操作公共资源(全局、静态变量、堆内存、硬件设备)的时候要使用临界区,防止其他任务 ...

感谢大神指教~
电子爱好者
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-9-23 12:15:56 | 显示全部楼层
公共资源写操作需要进入临界区。你的代码里写操作的你根据你的情况判断吧。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-9-26 08:42:46 | 显示全部楼层
ysq7120 发表于 2016-9-23 12:15
公共资源写操作需要进入临界区。你的代码里写操作的你根据你的情况判断吧。

多谢大神指导~
电子爱好者
回复

使用道具 举报

5

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
金钱
1522
注册时间
2014-5-16
在线时间
217 小时
发表于 2016-9-26 09:32:48 | 显示全部楼层
关于资源互斥访问,可以看看《windows核心编程》,我记得里面讲解得很清晰.
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-9-27 08:41:38 | 显示全部楼层
zmingwang 发表于 2016-9-26 09:29
你贴的代码可能需要临界访问.因为用了file这个全局变量.
其实需要不需要临界访问,可以这样分析:
1.代码中 ...

蒙受大神指教,不胜感激~~~
电子爱好者
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 18:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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