OpenEdv-开源电子网

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

ucos测试例程中有关在临界区挂起自身的疑惑

[复制链接]

4

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-6-5
在线时间
0 小时
发表于 2013-6-5 21:56:56 | 显示全部楼层 |阅读模式
//开始任务
void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;
u8 err;        
pdata = pdata;
msg_key=OSMboxCreate((void*)0); //创建消息邮箱
q_msg=OSQCreate(&MsgGrp[0],256); //创建消息队列
  flags_key=OSFlagCreate(0,&err); //创建信号量集  
 
OSStatInit(); //初始化统计任务.这里会延时1秒钟左右
  OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)    
  OSTaskCreate(led_task,(void *)0,(OS_STK*)&LED_TASK_STK[LED_STK_SIZE-1],LED_TASK_PRIO);   
  OSTaskCreate(touch_task,(void *)0,(OS_STK*)&TOUCH_TASK_STK[TOUCH_STK_SIZE-1],TOUCH_TASK_PRIO);   
  OSTaskCreate(qmsgshow_task,(void *)0,(OS_STK*)&QMSGSHOW_TASK_STK[QMSGSHOW_STK_SIZE-1],QMSGSHOW_TASK_PRIO);   
  OSTaskCreate(main_task,(void *)0,(OS_STK*)&MAIN_TASK_STK[MAIN_STK_SIZE-1],MAIN_TASK_PRIO);   
  OSTaskCreate(flags_task,(void *)0,(OS_STK*)&FLAGS_TASK_STK[FLAGS_STK_SIZE-1],FLAGS_TASK_PRIO);   
  OSTaskCreate(key_task,(void *)0,(OS_STK*)&KEY_TASK_STK[KEY_STK_SIZE-1],KEY_TASK_PRIO);   
  OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
}

临界区内中断一直关闭,这时候suspend自身,任务被调度走,感觉最后一句

OS_EXIT_CRITICAL();
应该没机会执行到啊,中断始终处于关闭状态,是这样吗?



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-6-5 23:05:04 | 显示全部楼层
回复【楼主位】csduan:
---------------------------------
会执行的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2612
金钱
2612
注册时间
2011-1-25
在线时间
176 小时
发表于 2013-6-6 09:31:29 | 显示全部楼层
我曾经也有你这样的疑问,后来做个实验确实是会执行的。
一直努力就很好。
回复 支持 反对

使用道具 举报

4

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-6-5
在线时间
0 小时
 楼主| 发表于 2013-6-6 14:56:03 | 显示全部楼层
哦 仔细想了想 懂了
这个case   因为schedule并不是像linux那样做一个真正的调度,而仅仅是激活一个中断,由于中断在临界区内是关的,所以无法立即执行,那么sched会继续向下执行, 到出临界区打开中断,再执行真正的调度。

一开始没想明白是忘了这个schedule和linux的不一样。。。 但个人不喜欢这种方式,逻辑上就很不顺。。。
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2014-9-16
在线时间
0 小时
发表于 2014-10-9 14:16:36 | 显示全部楼层
回复【4楼】csduan:
---------------------------------
我认为你的解释不对 sched确实不直接调度 而是要判断好多条件  但也不是激活中断  至于你的主帖问题 我也没想明白如何继续执行下去

我也曾被sched纠结过   也觉得逻辑不是很顺  名为“切换”  实际是“满足某些条件才切换”
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2014-9-16
在线时间
0 小时
发表于 2014-10-10 10:12:45 | 显示全部楼层
我弄清除了 3楼说对了  SCHED确实激活了一个中断  系统的切换是依靠被激活的这个中断才能实现的  但由于之前关闭中断了 所以无法切换 只能继续执行到开中断 然后立即切换
回复 支持 反对

使用道具 举报

1

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-7-1
在线时间
0 小时
发表于 2014-10-11 10:39:30 | 显示全部楼层
这个问题很深入啊,我倒感觉最后那句话没有执行,调用Sched本身就有开放中断了,而任务切换一般是靠软中断触发,当执行完Sched后因为中断已经开放,所以立刻执行切换操作。而楼主的最后一句OS_EXIT_CRITICAL();执行与否其实对系统没有任何影响
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 04:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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