嵌入式学习小组
直播中

王春梅

7年用户 187经验值
私信 关注

求解答使用信号量之后的任务切换疑问!

问题1:在UCOSIII的例10-1直接访问共享例程当中,当“任务1”,“任务2”,和第一个”second task Running“字符串输出到串口助手之后,我可以理解为,下一步是通过task1_task中的OStimeDlyHMSM函数进行的任务切换至task2_task中,才输出的第二个”second task Running“字符串的吗?之后再通过task2_task中的OSTimeDlyHMSM函数切换至task1_task中又重新开始的吗?如果不是,请问是如何进行任务1和2之间的切换的?
问题2:请问例10-2中,加入信号量之后的task1和task2的任务是如何切换的,因为当任务一使用OSSemPend的时候,信号量减一,但是delay_ms是有任务切换的,此时切换到任务2,但是任务2中OSSemPend中请求的信号量此时为0,而且其参数OS_OPT_PEND_BLOCKING为阻塞型,任务也无法向下进行了,此时任务2无法进行,也切换不到任务1,那程序下面是如何运行的?
希望各位大神能够帮助解答,非常感谢。

回帖(4)

李润基

2019-9-6 07:15:00
OS在这各种情况下,为了仿止你说的卡住的情况, 会让获得信号量的任务优先级自动提升到最高优先级, 以最快最优先的状态运行获得信号量的任务, 然后当任务释放信号量后, 自动改为原先设置的优先级, 这就是OS的仿锁死处理方法!
举报

俞敏东

2019-9-6 07:32:11
任务切换发生在延时和高优先级任务的抢占。
举报

乔占宽

2019-9-6 07:37:16
  非常感谢,但是还是有一块没有懂。
  我知道延时的时候进行了任务切换,但是比如例10-2中,由于task1中调用delay_ms延时函数切换到task2时的信号量为0,而由于task2中的OSSemPend的opt参数为OS_OPT_PEND_BLOCKING,我理解这个是堵塞型的,就是信号量如果一直为0,它就继续等待信号量,堵塞当前任务,既然此时任务被堵塞了,那么task2不就卡在这里了吗,也运行不到task2中的延时函数delay_ms来进行切换到任务1啊,那么这里是怎么切换到任务1的。难道是假如任务2堵塞了,task1由于优先级较高来抢占了?
  非常感谢。
举报

庞书娟

2019-9-6 07:50:03
好的,我明白了,非常感谢你,也谢谢原子哥。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分