OpenEdv-开源电子网

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

OS_Sched任务调度的疑问

[复制链接]

51

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2011-4-11
在线时间
43 小时
发表于 2013-1-12 22:07:43 | 显示全部楼层 |阅读模式
今天开始自习的看UC/OS II源码,看到OS_Sched的时候有一个疑问,网上没搜到答案。
void  OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
    OS_CPU_SR  cpu_sr;
#endif    
    INT8U      y;


    OS_ENTER_CRITICAL();
    if ((OSIntNesting == 0) && (OSLockNesting == 0))
   { 
        y             = OSUnMapTbl[OSRdyGrp];         
        OSPrioHighRdy = (INT8U)((y   <  < 3) + OSUnMapTbl[OSRdyTbl[y]]);
        if (OSPrioHighRdy != OSPrioCur) 
      {              
            OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
            OSCtxSwCtr++;                              
            OS_TASK_SW();                              /* erform a context switch                     */
        }
    }
    OS_EXIT_CRITICAL();
}
书上说执行完OS_TASK_SW()后,PC的值变了。那就是说程序要跳到另外的地方。我的疑问是:下面的OS_EXIT_CRITICAL()不就不执行了吗?中断可还是关着的啊,什么时候开呢,在哪开呢?因为对汇编不是理解,所以看不懂。

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165391
金钱
165391
注册时间
2010-12-1
在线时间
2112 小时
发表于 2013-1-13 00:28:47 | 显示全部楼层
回复【楼主位】Julius007:
---------------------------------
   OS_TASK_SW(); 只是触发PendSV异常,然后继续执行,当执行过OS_EXIT_CRITICAL();开启中断后,由于PendSV异常,进入PendSV中断服务函数,实现真正的任务切换.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

51

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2011-4-11
在线时间
43 小时
 楼主| 发表于 2013-1-13 10:53:04 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
哦,真是一语道破天机呀!不怎么懂汇编,所以没看懂。谢谢啦!!
回复 支持 反对

使用道具 举报

8

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2014-3-14
在线时间
40 小时
发表于 2017-7-19 09:39:22 | 显示全部楼层
正点原子 发表于 2013-1-13 00:28
回复【楼主位】Julius007:
---------------------------------
&nbsp;&nbsp;&nbsp;OS_TASK_SW();&nbsp;只是 ...

原子哥,也就是说,触发中断或者异常发生后,会有对应的中断状态位记录。而 OS_ENTER_CRITICAL()和  OS_EXIT_CRITICAL()之间的临界区只是保证在临界区之间保证中断处理不执行(即只是暂时挂起),但是出了临界区,对应的中断仍后正常进行。
我最近也在疑惑这个问题,既然OS_Sched是通过异常实现的(异常和中断我的理解只是前者属于系统的中断机制),那么临界区关中断期间OS_Sched为何还能实现任务的调用,我的理解是否正确
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-3 22:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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