OpenEdv-开源电子网

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

ucos 运行啦OS_TASK_SW()是否直接跳转,下面的出临界区函数是否还运行?

[复制链接]

4

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-8-16
在线时间
6 小时
发表于 2016-8-16 12:09:58 | 显示全部楼层 |阅读模式
1金钱
下面两个系统调度函数运行完切换函数XX——SW(),是否就直接跳转任务啦,因为任务切换函数是用的BX LR,直接跳转啦。那么后面还有一句OS_EXIT_CRITICAL();退出临界区函数还没执行?
请问具体的操作顺序是什么样的?

void  OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3u                           /* Allocate storage for CPU status register     */
    OS_CPU_SR  cpu_sr = 0u;
#endif



    OS_ENTER_CRITICAL();
    if (OSIntNesting == 0u) {                          /* Schedule only if all ISRs done and ...       */
        if (OSLockNesting == 0u) {                     /* ... scheduler is not locked                  */
            OS_SchedNew();
            OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
            if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy     */
#if OS_TASK_PROFILE_EN > 0u
                OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task      */
#endif
                OSCtxSwCtr++;                          /* Increment context switch counter             */
                OS_TASK_SW();                          /* Perform a context switch                     */
            }
        }
    }
    OS_EXIT_CRITICAL();
}


void  OSIntExit (void)
{
#if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr = 0u;
#endif



    if (OSRunning == OS_TRUE) {
        OS_ENTER_CRITICAL();
        if (OSIntNesting > 0u) {                           /* Prevent OSIntNesting from wrapping       */
            OSIntNesting--;
        }
        if (OSIntNesting == 0u) {                          /* Reschedule only if all ISRs complete ... */
            if (OSLockNesting == 0u) {                     /* ... and not locked.                      */
                OS_SchedNew();
                OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
                if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy */
#if OS_TASK_PROFILE_EN > 0u
                    OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task  */
#endif
                    OSCtxSwCtr++;                          /* Keep track of the number of ctx switches */
                    OSIntCtxSw();                          /* Perform interrupt level ctx switch       */
                }
            }
        }
        OS_EXIT_CRITICAL();
    }
}

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

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-8-16 14:45:45 | 显示全部楼层
汇编不懂,但是既然OS_ENTER_CRITICAL锁住了,应该是OS_EXIT_CRITICAL之后才能真正切换任务。不然设计没意义了
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-8-16
在线时间
6 小时
 楼主| 发表于 2016-8-16 15:11:32 | 显示全部楼层
我现在是按照流水线理解的,因为退出临界区的汇编为:
MSR PRIMASK,R0
BX LR

这两条指令应该在取指、译码器里。所以正好能执行。
回复

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2016-8-14
在线时间
15 小时
发表于 2016-8-17 13:52:33 | 显示全部楼层
这块 我也不明白,帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-1 20:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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