在线时间0 小时
UID174876
注册时间2010-3-11
NXP金币0
该用户从未签到
版主
  
- 积分
- 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 |
|