380091044 发表于 2024-3-5 08:42:31

UCOSII中执行B任务中,恢复C任务,是不是等于挂起B??

本帖最后由 380091044 于 2024-3-5 08:43 编辑

UCOSII中执行B任务中,恢复C任务就开始执行C任务了,同时是不是等于挂起B??因为我发现:C执行结束时,又使用了恢复B任务函数,具体代码如下:

gentleman 发表于 2024-3-5 08:57:39

任务B的最后一行



挂起了B自己

tzz1983 发表于 2024-3-5 09:06:03

本帖最后由 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:03:15

本帖最后由 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),这三个任务切换关系,请老师指点一下,

380091044 发表于 2024-3-5 11:04:57

gentleman 发表于 2024-3-5 08:57
任务B的最后一行




是的,

tzz1983 发表于 2024-3-5 11:29:20

本帖最后由 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


gentleman 发表于 2024-3-5 12:24:03

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:27:52

本帖最后由 gentleman 于 2024-3-5 12:28 编辑

380091044 发表于 2024-3-5 11:03
感谢老师的指点,我的理解偏差太大了,这个例程里面牵扯到三个任务分别是A、B、C,优先级分别是234即是我 ...
恢复C 只是 恢复到就绪列表

只有高优先级B 挂起自己,C才能运行

380091044 发表于 2024-3-5 13:08:17

tzz1983 发表于 2024-3-5 11:29
三个任务, 其中任务A是一个独立的任务,与任务B和C没有关系,任务A的优先级是最高,他用的是阻塞延时,作 ...

感谢老师的鼎力支持,明白了,

380091044 发表于 2024-3-5 13:09:09

gentleman 发表于 2024-3-5 12:24
A 运行 ->A阻塞 等500ms 后运行

500ms内B运行-> B结束挂起自己(如果不挂起,C永远不执行)


感谢老师的指点,让我对这个有了更深入了解,
页: [1] 2
查看完整版本: UCOSII中执行B任务中,恢复C任务,是不是等于挂起B??