这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 软件与操作系统 » 【已解决】关于互斥体中顶置优先级的一点问题

共5条 1/1 1 跳转至

【已解决】关于互斥体中顶置优先级的一点问题

高工
2013-06-27 11:50:05     打赏

在实验中碰到了个问题。就是顶置优先级时候,任务的优先级在什么时候切换。

在实验中,使用优先级顶置协议时候,两个任务,任务A和任务B是怎样切换的?

第一个实验是这样的:顶置优先级设置成15,任务AB优先级设置成20.

实验结果是当任务A释放mtx时候,任务B立即获得了执行权。此时任务B还没有开始申请mtx,不会将自己的优先级提升。根据输出,B的优先级仍然是20,但它竟然得到了优先权将A抢断。

再次实验,顶置优先级设置成20,任务AB的优先级仍认识20.

实验结果是,任务A即使释放了mtx,任务B也不会执行。为什么上个实验,B在优先级为20的时候能抢断A,而这次却不行了?

我的问题是,两个任务的优先级是在什么时候切换的?优先权分配机制是怎样的?




关键词: 解决     关于     互斥     体中     顶置     优先级     一点     问题         

菜鸟
2013-06-27 12:17:04     打赏
2楼

首先说一下互斥体的顶置优先级必须要比任务的优先级高,如果相等,内核代码不做任务处理,如果小于任务的优先级,那么会返回错误代码E_ILUSE!

然后说一下我们互斥体的实验例子:任务A和任务B优先级都是20,互斥体的顶置优先级为15!例子首先启动任务B,然后进入任务B,任务B启动任务A,由于两个人的优先级一样,所以任务A无法运行,处于ready状态!
任务B锁定互斥体之后,如果任务处于ready或wait状态就会改变任务的优先级,变成互斥体的顶置优先级:
void knl_change_task_priority( TCB *tcb, INT priority )改变任务优先级函数:
EXPORT void knl_change_task_priority( TCB *tcb, INT priority )
{
        INT        oldpri;

        if ( tcb->state == TS_READY ) {
                /*
                 * When deleting a task from the ready queue, 
                 * a value in the 'priority' field in TCB is needed. 
                 * Therefore you need to delete the task from the
                 * ready queue before changing 'tcb->priority.'
                 */
                knl_ready_queue_delete(&knl_ready_queue, tcb);
                tcb->priority = (UB)priority;
                knl_ready_queue_insert(&knl_ready_queue, tcb);
                knl_reschedule();
        } else {
                oldpri = tcb->priority;
                tcb->priority = (UB)priority;

                /* If the hook routine at the task priority change is defined,
                   execute it */
                if ( (tcb->state & TS_WAIT) != 0 && tcb->wspec->chg_pri_hook) {
                        (*tcb->wspec->chg_pri_hook)(tcb, oldpri);
                }
        }
}

首先从ready队列中删除原来的优先级所处的位置,然后向队列中插入新的优先级!
锁定互斥体没有问题,那么在解锁互斥体的时候,同样的到道理,也会改变任务的优先级!

正如问题所在,在调用tk_unl_mtx的时候,改变任务的优先级,从15变为20,那么此时任务
B和任务A优先级是一样的,那么任务A为何抢占任务B得意执行呢?

这是问题所在:改变任务优先级的时候也会调用上面的函数,从ready队列中删除原来的优先级所处的位置,
然后向队列中插入到新的优先级的位置。在ready队列优先级20的位置此时是任务A,但是任务B优先级也是20,所以
任务B插入队列的时候,只能插入到优先级20,排在任务A之后(按照FIFO插入),然后任务重新调度,所以任务A就会
执行,抢占任务B!


高工
2013-06-27 12:25:13     打赏
3楼

是这样的机制啊。还是优先级排队。。。

解锁时候,从OS的优先级队列中删除当前任务。然后根据优先级重新排队。任务A和任务B优先级相同,只能排到任务B后边了。。。

因此,任务B获得优先权。


代码没看懂,机制理解了。谢谢


院士
2013-06-27 13:15:17     打赏
4楼

NND,一点看不懂了


高工
2013-06-27 13:37:44     打赏
5楼
目前没看内核的代码,不过解释得很清楚,顶一个。

共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]