UCOSII中执行B任务中,恢复C任务,是不是等于挂起B??
本帖最后由 380091044 于 2024-3-5 08:43 编辑UCOSII中执行B任务中,恢复C任务就开始执行C任务了,同时是不是等于挂起B??因为我发现:C执行结束时,又使用了恢复B任务函数,具体代码如下:
任务B的最后一行
挂起了B自己
本帖最后由 tzz1983 于 2024-3-5 09:26 编辑
首先B的优先级比C高
OSTaskResume(4); 这个是恢复C, 但C没B优先高,所以继续执行B
到下一句: OSTaskSuspend(OS_PRIO_SELF); 时, B挂起自己, 此时B就不是最高优先级了,在此处转到任务C执行
到任务C的 OSTaskResume(3);语句时,恢复了任务B, 因为B比C的优先高, 所以立即切换至任务B, 如此循环住复。
想问题不要太复杂,一句就是一句的意思, “恢复C任务就开始执行C任务了” 这个理解是错误的,“同时是不是等于挂起B” 这个理解也是错误的,挂起B在另外的一句 本帖最后由 380091044 于 2024-3-5 11:05 编辑
tzz1983 发表于 2024-3-5 09:06
首先B的优先级比C高
OSTaskResume(4); 这个是恢复C, 但C没B优先高,所以继续执行B
到下一句: OSTaskSusp ...
感谢老师的指点,我的理解偏差太大了,这个例程里面牵扯到三个任务分别是A、B、C,优先级分别是234即是我标的A2、B3、C4,其中,任务A的代码如下图所示,A是通过延时来切换到下一个任务(我的理解是B3),这三个任务切换关系,请老师指点一下, gentleman 发表于 2024-3-5 08:57
任务B的最后一行
是的, 本帖最后由 tzz1983 于 2024-3-5 11:34 编辑
380091044 发表于 2024-3-5 11:03
感谢老师的指点,我的理解偏差太大了,这个例程里面牵扯到三个任务分别是A、B、C,优先级分别是234即是我 ...
三个任务, 其中任务A是一个独立的任务,与任务B和C没有关系,任务A的优先级是最高,他用的是阻塞延时,作用是每过0.5秒就让P22翻转。
阻塞OSTimeDly() 这个概念明白吗,当任务遇到阻塞延时的时候,会切换任务。直到延时的时间到了,OS会自动切换回来。
阻塞 和普通延时区别,阻塞不会停留到原地等待,就是阻塞发生时, CPU没有停留到原处,而是去执行别的任务去了。阻塞延时是基于OS时钟滴答的,时间到了,OS自动切换回来。
普通的延时(非阻塞) 比如Delay_MS(100) 这个就是非阻塞延时, 此时的CPU是一直原地打转,循环执行无意义的NOP指令。直到拖到延时的时间到。所以非阻塞延时是独占CPU的。
任务B和C的切换逻辑上一楼讲过了,要注意的是B和C都是使用非阻塞延时,B和C是轮流执行的。B让P1口的LED交替闪烁, C让P3口的LED走流水灯样式。三个任务就是这样了
另外要注意的是,虽然B和C都是独占CPU, 但是不会影响任务A, 因为A的优先级是最高的, 只要延时时间到, 就是立即获得即行权。反转P22
并且因为A使用的是阻塞延时,实际执行代码的时间非常短,几乎可以忽略不计, 所以任务A不也不影响B和C
380091044 发表于 2024-3-5 11:03
感谢老师的指点,我的理解偏差太大了,这个例程里面牵扯到三个任务分别是A、B、C,优先级分别是234即是我 ...
A 运行 ->A阻塞 等500ms 后运行
500ms内B运行-> B结束挂起自己(如果不挂起,C永远不执行)
C运行 -> C恢复B
重复 第2~3 行直到500ms
500ms后 A 运行 ->A阻塞 等500ms 后运行
回到第2行 B运行
本帖最后由 gentleman 于 2024-3-5 12:28 编辑
380091044 发表于 2024-3-5 11:03
感谢老师的指点,我的理解偏差太大了,这个例程里面牵扯到三个任务分别是A、B、C,优先级分别是234即是我 ...
恢复C 只是 恢复到就绪列表
只有高优先级B 挂起自己,C才能运行
tzz1983 发表于 2024-3-5 11:29
三个任务, 其中任务A是一个独立的任务,与任务B和C没有关系,任务A的优先级是最高,他用的是阻塞延时,作 ...
感谢老师的鼎力支持,明白了, gentleman 发表于 2024-3-5 12:24
A 运行 ->A阻塞 等500ms 后运行
500ms内B运行-> B结束挂起自己(如果不挂起,C永远不执行)
感谢老师的指点,让我对这个有了更深入了解,
页:
[1]
2