找回密码
 立即注册
查看: 284|回复: 24

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

[复制链接]
  • TA的每日心情
    奋斗
    2 小时前
  • 签到天数: 172 天

    [LV.7]常住居民III

    116

    主题

    475

    回帖

    638

    积分

    高级会员

    积分
    638
    发表于 2024-3-5 08:42:31 | 显示全部楼层 |阅读模式
    本帖最后由 380091044 于 2024-3-5 08:43 编辑

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-5-5 08:35
  • 签到天数: 143 天

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2144

    积分

    荣誉版主

    积分
    2144
    发表于 2024-3-5 08:57:39 | 显示全部楼层
    任务B的最后一行



    挂起了B自己

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    20

    主题

    576

    回帖

    1201

    积分

    荣誉版主

    积分
    1201
    发表于 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在另外的一句
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2 小时前
  • 签到天数: 172 天

    [LV.7]常住居民III

    116

    主题

    475

    回帖

    638

    积分

    高级会员

    积分
    638
     楼主| 发表于 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),这三个任务切换关系,请老师指点一下,
    3.png
    4.png

    点评

    恢复C 只是 恢复到就绪列表 只有B挂起自己,C才能运行  详情 回复 发表于 2024-3-5 12:27
    A 运行 ->A阻塞 等500ms 后运行 500ms内 B运行 -> B结束挂起自己(如果不挂起,C永远不执行) C运行 -> C恢复B 重复 第2~3 行直到500ms 500ms后 A 运行 ->A阻塞 等500ms 后运行  详情 回复 发表于 2024-3-5 12:24
    三个任务, 其中任务A是一个独立的任务,与任务B和C没有关系,任务A的优先级是最高,他用的是阻塞延时,作用是每过0.5秒就让P22翻转。 阻塞 OSTimeDly() 这个概念明白吗,当任务遇到阻塞延时的时候,会切换任务。直  详情 回复 发表于 2024-3-5 11:29
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2 小时前
  • 签到天数: 172 天

    [LV.7]常住居民III

    116

    主题

    475

    回帖

    638

    积分

    高级会员

    积分
    638
     楼主| 发表于 2024-3-5 11:04:57 | 显示全部楼层
    gentleman 发表于 2024-3-5 08:57
    任务B的最后一行

    是的,
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    20

    主题

    576

    回帖

    1201

    积分

    荣誉版主

    积分
    1201
    发表于 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


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-5-5 08:35
  • 签到天数: 143 天

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2144

    积分

    荣誉版主

    积分
    2144
    发表于 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运行


    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-5-5 08:35
  • 签到天数: 143 天

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2144

    积分

    荣誉版主

    积分
    2144
    发表于 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才能运行
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2 小时前
  • 签到天数: 172 天

    [LV.7]常住居民III

    116

    主题

    475

    回帖

    638

    积分

    高级会员

    积分
    638
     楼主| 发表于 2024-3-5 13:08:17 | 显示全部楼层
    tzz1983 发表于 2024-3-5 11:29
    三个任务, 其中任务A是一个独立的任务,与任务B和C没有关系,任务A的优先级是最高,他用的是阻塞延时,作 ...

    感谢老师的鼎力支持,明白了,
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2 小时前
  • 签到天数: 172 天

    [LV.7]常住居民III

    116

    主题

    475

    回帖

    638

    积分

    高级会员

    积分
    638
     楼主| 发表于 2024-3-5 13:09:09 | 显示全部楼层
    gentleman 发表于 2024-3-5 12:24
    A 运行 ->A阻塞 等500ms 后运行

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

    感谢老师的指点,让我对这个有了更深入了解,
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-21 10:32 , Processed in 0.071157 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表