7回答

0收藏

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

#开源分享 #开源分享 3774 人阅读 | 7 人回复 | 2014-03-23

各位尊敬的老师:
请教:要实现任务切换只有这几个方式吗?: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()条件满足时会进行一次任务切换、、


分享到:
回复

使用道具 举报

回答|共 7 个

倒序浏览

沙发

andylfg

发表于 2014-4-14 10:16:43 | 只看该作者

OSIntExit()这个函数肯定是会进行任务调度的,我也不知道为什么只在b任务运行,求解
板凳

yilusuiyuan

发表于 2014-4-16 15:53:39 | 只看该作者

本帖最后由 yilusuiyuan 于 2014-4-16 17:03 编辑

看亮的回答,我打酱油的!
地板

laoliang-67665

发表于 2014-4-16 16:52:02 | 只看该作者

A任务优先级高,调用OSTIMEDLY,B任务因此运行
当延时时间到了,在OSTimeTick()中会重新将A任务就绪的,离开中断后就进入A任务运行了,因为A是当前优先级最高的任务
所以,从楼主的描述来看,似乎你的移植或任务代码(任务堆栈)出现了一些问题,最好能仔细调试一下
嵌入式,ucos,FPGA系统书籍作者
5#

yilusuiyuan

发表于 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;


结果如下:

交替.jpg (60.14 KB, 下载次数: 37)

运行结果

运行结果

评分

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

查看全部评分

6#

laoliang-67665

发表于 2014-4-16 17:41:50 | 只看该作者

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

感谢yilusuiyuan亲自实验验证!
实践很说明问题!
嵌入式,ucos,FPGA系统书籍作者
7#

735054479_3015043

发表于 2014-6-3 16:19:32 | 只看该作者

受用了,顶起
8#

wanass

发表于 2014-6-6 16:30:21 | 只看该作者

本帖最后由 trochili 于 2014-6-6 16:48 编辑

时钟节拍中断,只是定时让os介入任务调度检查的一种方式。但到底会不会进行一次任务调度还要看当时就绪的任务间的优先级关系。如果有比当前任务优先级更高的任务就绪则必定调度,如果当前任务优先级是最高则没有必要调度。不管有没有调度,os都做了调度检查。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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