OpenEdv-开源电子网

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

UCOS任务代码使用临界区屏蔽中断,为什么导致任务中的延时函数不起作用?跪求大神指点!

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-8-27
在线时间
0 小时
发表于 2015-8-27 22:29:27 | 显示全部楼层 |阅读模式
5金钱
只有两个任务,优先级分别为6和7:

[mw_shl_code=c,true]void led0_task(void *pdata) { while(1) { OS_CPU_SR cpu_sr=0; OS_ENTER_CRITICAL(); //加了临界区 LED0=0; //亮 delay_ms(1000); LED0=1; //灭 delay_ms(2000); OS_EXIT_CRITICAL(); } } void led1_task(void *pdata) { while(1) { OS_CPU_SR cpu_sr=0; OS_ENTER_CRITICAL(); //加了临界区 LED1=0; //亮 delay_ms(1500); LED1=1; //灭 delay_ms(1000); OS_EXIT_CRITICAL(); } }[/mw_shl_code]

最终的现象是:

LED02s非常微弱的闪一下,LED11s非常微弱的闪一下,感觉第一个延时没起作用,而第二个延时又正常执行,请问为什么?


最佳答案

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

这样不恰当的比喻一下: 临界区是为了处理一些特殊的事情而开辟出来的,例如我要瞬移,中间必须畅通不能被打断。万一中间撞到一个坦克,瞬移被打断了就可能挂了。 此时临界区就是用大法力大神通开出来的只能维持很短时间的通道,比如撕裂空间,产生一个黑洞。你要抓紧时间赶紧过去。 你不能在里面睡觉,而且睡醒了再睡一觉。这样就很可能出不来了。不知道结果会怎么样,也许永远困在了黑洞里。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-8-27 22:29:28 | 显示全部楼层
这样不恰当的比喻一下:
临界区是为了处理一些特殊的事情而开辟出来的,例如我要瞬移,中间必须畅通不能被打断。万一中间撞到一个坦克,瞬移被打断了就可能挂了。
此时临界区就是用大法力大神通开出来的只能维持很短时间的通道,比如撕裂空间,产生一个黑洞。你要抓紧时间赶紧过去。

你不能在里面睡觉,而且睡醒了再睡一觉。这样就很可能出不来了。不知道结果会怎么样,也许永远困在了黑洞里。
小小蜗牛
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-8-27 22:41:01 | 显示全部楼层
临界区保护会关闭总中断的,总中断一旦关闭了那么UCOS的系统时钟就停了,延时肯定就会出问题的!
开往春天的手扶拖拉机
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-8-27
在线时间
0 小时
 楼主| 发表于 2015-8-27 22:51:36 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
我试了好几次,换了不同的延时时间,为什么从现象来看,第二个延时函数又没问题?
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-8-28 08:27:09 | 显示全部楼层
一个任务的话呢?
小小蜗牛
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1835
金钱
1835
注册时间
2014-6-27
在线时间
981 小时
发表于 2015-8-28 08:42:09 | 显示全部楼层
回复【3楼】飞翔熊熊宝宝:
---------------------------------
本来用在UCOS的延时函数是有调度的,你这样加,节拍就不走了,就无法调度,。除非你用自己写的delay。用ucos要会用它的节拍,你都不了解它,怎么能灵活运用它。
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13123
金钱
13123
注册时间
2012-11-26
在线时间
3813 小时
发表于 2015-8-28 08:44:09 | 显示全部楼层
如果不是对flash操作,最好不要进临界区

临界区,进去要尽快出来,你那piapiapia的延迟了几秒,简直坑
学无止境
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1835
金钱
1835
注册时间
2014-6-27
在线时间
981 小时
发表于 2015-8-28 09:01:20 | 显示全部楼层
那个延时有调度的,延时多少到无妨。只是临界代码要是你自己的一小段代码,不影响UCOS系统的一些东西。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-8-27
在线时间
0 小时
 楼主| 发表于 2015-8-28 20:50:06 | 显示全部楼层
回复【5楼】TinyBoy:
---------------------------------
我知道肯定不能这么用,我就想试试这样会有什么后果,结果证明后果很严重
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-8-27
在线时间
0 小时
 楼主| 发表于 2015-8-28 20:57:35 | 显示全部楼层
回复【8楼】jiutianshenjian:
---------------------------------
太形象了,谢谢
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-8-27
在线时间
0 小时
 楼主| 发表于 2015-8-28 21:01:16 | 显示全部楼层
基本的原理我懂了,有没有大神能就事论事,分析下为什么会出现这种现象,非常感谢!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 11:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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