查看: 3385|回复: 7

时钟节拍中断,到底会不会进行一次任务调度。

[复制链接]

该用户从未签到

发表于 2014-3-23 17:08:19 | 显示全部楼层 |阅读模式
分享到:
各位尊敬的老师:
请教:要实现任务切换只有这几个方式吗?:1OSTimeDly  2任务间通信(如信号量,邮箱等)。
疑问:时钟节拍中断,到底会不会进行一次任务调度。
如果可以,那么时钟节拍函数也算是中断的一类,按理说也要进行一次任务切换。
本人做实验时,设计了任务A(优先级为5),任务B(优先级为9),A和B不通信,如果任务A和任务B中都调用osTimeDly( ),任务切换正常。
后来把实验改动,高优先级任务中还是调用OsTimeDly( ), 低优先级里去掉OsTimeDly( ) ;发现当任务切换到任务B,就一直再执行B的操作。
如果时钟节拍函数里面的中断可以触发一次任务调度的话,当任务A的延时到,应该要切换到这个高优先级的任务A才对。可是实验结果就是一直运行任务B。
由此,本人的疑问:实验结果表明,时钟节拍中断,是不能够触发一次任务调度的?但是查看OSTickISR() ,里面代码又有OSIntExit() ,那应该要任务调度才对啊。

但是查看:
时钟节拍中断函数OSTickISR()的示意性代码是:
void OSTickISR(void)
    保存CPU寄存器;
   调用OSIntEnter();            //记录中断嵌套层数
   if(OSIntNesting==1)
    {
       OSTCBcur->OSTCBStkPtr=sp;           //在任务TCB中保存堆栈指针
    }
    调用OSTimeTick();
    清除中断;
    开中断;
    调用OSIntExit();
    恢复CPU寄存器;
    中断返回;
}
这个OSIntExit()条件满足时会进行一次任务切换、、


回复

使用道具 举报

该用户从未签到

发表于 2014-4-14 10:16:43 | 显示全部楼层
OSIntExit()这个函数肯定是会进行任务调度的,我也不知道为什么只在b任务运行,求解
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2016-1-28 10:03
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2014-4-16 15:53:39 | 显示全部楼层
    本帖最后由 yilusuiyuan 于 2014-4-16 17:03 编辑

    看亮的回答,我打酱油的!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-1-8 15:51
  • 签到天数: 22 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2014-4-16 16:52:02 | 显示全部楼层
    A任务优先级高,调用OSTIMEDLY,B任务因此运行
    当延时时间到了,在OSTimeTick()中会重新将A任务就绪的,离开中断后就进入A任务运行了,因为A是当前优先级最高的任务
    所以,从楼主的描述来看,似乎你的移植或任务代码(任务堆栈)出现了一些问题,最好能仔细调试一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-1-28 10:03
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2014-4-16 17:14:18 | 显示全部楼层
    亮哥说的没错,我用亮哥的代码测试过的,代码如下
    /*实验使用的代码2*/
    void E2_task1(void *pParam)
    {
            extern OS_STK  TaskStk[OS_MAX_TASKS][512];    // Tasks stacks
        int i=0;
            OSTimeDly(1);
        printf("两个任务交替运行,E2task1,优先级%d\n",OSPrioCur);
            for(;;)
            {
                    printf("优先级为%d的任务输出%d\n",OSPrioCur,i++);
                    OSTimeDly(1);
                   
            }
    }

    void E2_task2(void *pParam)
    {
        int i=0;
            //OSTimeDly(100);
        printf("两个任务交替运行,E2task2,优先级%d\n",OSPrioCur);
            for(;;)
            {
                    printf("优先级为%d的任务输出%d\n",OSPrioCur,i++);
                    printf("system time %d\n",OSTimeGet());
            //        OSTimeDly(100);
            }
    }


            case 2://两个任务共享CPU
                            OSTaskCreate(E2_task1, 0, &TaskStk[5][TASK_STK_SIZE-1], 5);
                            OSTaskCreate(E2_task2, 0, &TaskStk[6][TASK_STK_SIZE-1], 6);
                break;


    结果如下:

    运行结果

    运行结果

    评分

    参与人数 1声望 +1 与非币 +10 收起 理由
    laoliang-67665 + 1 + 10 很给力!实验验证!

    查看全部评分

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-1-8 15:51
  • 签到天数: 22 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2014-4-16 17:41:50 | 显示全部楼层
    yilusuiyuan 发表于 2014-4-16 17:14
    亮哥说的没错,我用亮哥的代码测试过的,代码如下
    /*实验使用的代码2*/
    void E2_task1(void *pParam)

    感谢yilusuiyuan亲自实验验证!
    实践很说明问题!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-7-6 08:47
  • 签到天数: 43 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2014-6-3 16:19:32 | 显示全部楼层
    受用了,顶起
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2014-3-25 11:42
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2014-6-6 16:30:21 | 显示全部楼层
    本帖最后由 trochili 于 2014-6-6 16:48 编辑

    时钟节拍中断,只是定时让os介入任务调度检查的一种方式。但到底会不会进行一次任务调度还要看当时就绪的任务间的优先级关系。如果有比当前任务优先级更高的任务就绪则必定调度,如果当前任务优先级是最高则没有必要调度。不管有没有调度,os都做了调度检查。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-24 04:23 , Processed in 0.202613 second(s), 36 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.