查看: 7334|回复: 3

[MQX] mqx操作系统

[复制链接]

该用户从未签到

7

主题

12

帖子

0

新手上路

Rank: 1

积分
29
最后登录
1970-1-1
发表于 2011-9-5 15:03:25 | 显示全部楼层 |阅读模式
mqx操作系统传递信号量以后,传递信号量的任务是继续运行还是要被放入就绪队列呢?
我知道答案 目前已有2人回答
回复

使用道具 举报

该用户从未签到

2

主题

224

帖子

0

版主

Rank: 7Rank: 7Rank: 7

积分
322
最后登录
1970-1-1
发表于 2011-9-6 13:30:11 | 显示全部楼层

RE:mqx操作系统

通常来说
post:
1.当sem=0时,如果在等待sem的任务优先级比当前任务高,将会立即发生任务调度,调用post的任务将被放入就绪队列;
2.当sem>0时,只简单将sem++,不会发生任务调度;
wait:
1.当sem=0时,无论当前任务优先级高低,都将会把当前任务阻塞;
2.当sem>1时,只简单将sem--,不会发生任务调度;
应用的时候需要注意的是:MQX中信号量支持优先级(优先级反转、高优先级插入)。

该用户从未签到

7

主题

12

帖子

0

新手上路

Rank: 1

积分
29
最后登录
1970-1-1
 楼主| 发表于 2011-9-8 13:43:39 | 显示全部楼层

回复:mqx操作系统

回复第 2 楼 于2011-09-06 05:30:11发表:
通常来说
post:
1.当sem=0时,如果在等待sem的任务优先级比当前任务高,将会立即发生任务调度,调用post的任务将被放入就绪队列;
2.当sem>0时,只简单将sem++,不会发生任务调度;
wait:
1.当sem=0时,无论当前任务优先级高低,都将会把当前任务阻塞;
2.当sem>1时,只简单将sem--,不会发生任务调度;
应用的时候需要注意的是:MQX中信号量支持优先级(优先级反转、高优先级插入)。 

非常感谢您在mqx论坛上的回答。我还有几个问题不是太明白。
1. post 当sem=0时候,如果等待sem的任务的优先级和当前任务一样,那会发生任务调度吗?发生任务调度时候会把调用post的函数放入就绪队列吗?这时候如果有其他等待时间更长的就绪的任务会不会抢占当前的任务运行呢?
 

该用户从未签到

2

主题

224

帖子

0

版主

Rank: 7Rank: 7Rank: 7

积分
322
最后登录
1970-1-1
发表于 2011-9-8 19:12:09 | 显示全部楼层

RE:mqx操作系统

MQX是完全免费的和开源的OS,所有问题均可以在其源代码中找到答案;另外,也可以自己动手做个实验来证实自己的想法是否正确。
至于post,当sem=0时,如果等待sem的任务的优先级跟当前任务一样,那么不会发生调度。
具体参见ta_init.c,_task_ready_internal():
   if ( (uchar _PTR_)ready_q_ptr >
      (uchar _PTR_)(kernel_data->CURRENT_READY_Q) )
   {
      kernel_data->CURRENT_READY_Q = ready_q_ptr;
   }
判断是否需要发生调度的函数_CHECK_RUN_SCHEDULER()在dispatch.s(以下代码为M4版本,coldfire版本类似)
_sched_check_scheduler_internal:
               
                GET_KERNEL_DATA r0
               
                cpsid.n i
                ldrh r1, [r0, #KD_IN_ISR]
                cbnz r1, _sched_execute_scheduler_internal_end
               
                ldr r1, [r0, #KD_CURRENT_READY_Q]
                ldr r2, [r0, #KD_ACTIVE_PTR]
                ldr r3, [r2, #TD_MY_QUEUE]
                cmp r1, r3
                beq _sched_execute_scheduler_internal_end       ; current task is still the active task
               
                cpsie.n i
_sched_execute_scheduler_internal:
                svc SVC_TASK_SWITCH
               
_sched_execute_scheduler_internal_end:
                cpsie.n i               
                bx lr
可见,只有等待sem任务优先级高于当前任务时,才会马上发生任务调度;否则只是将等待sem任务中的最高优先级的任务或者等待时间最长的那个任务(取决于该sem的属性)放入就绪队列。
第二个问题,取决于等待任务在调用wait时是否发生过优先级反转。
楼主请自己动动手吧,或者read the fxxking code
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-27 03:27 , Processed in 0.088033 second(s), 23 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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