文章目录
1 互斥信号量的删除与状态查询
互斥信号量的删除:

状态查询:

/**********************************************************************************************************
** Function name : tMutexDestroy
** Descriptions : 销毁信号量
** parameters : mutex 销毁互斥信号量
** Returned value : 因销毁该信号量而唤醒的任务数量
***********************************************************************************************************/
uint32_t tMutexDestroy (tMutex * mutex)
{
uint32_t count = 0;
uint32_t status = tTaskEnterCritical();
// 信号量是否已经被锁定,未锁定时没有任务等待,不必处理
if (mutex->lockedCount > 0)
{
// 是否有发生优先级继承?如果发生,需要恢复拥有者的原优先级
if (mutex->ownerOriginalPrio != mutex->owner->prio)
{
// 有发生优先级继承,恢复拥有者的优先级
if (mutex->owner->state == TINYOS_TASK_STATE_RDY)
{
// 任务处于就绪状态时,更改任务在就绪表中的位置
tTaskSchedUnRdy(mutex->owner);
mutex->owner->prio = mutex->ownerOriginalPrio;
tTaskSchedRdy(mutex->owner);
}
else
{
// 其它状态,只需要修改优先级
mutex->owner->prio = mutex->ownerOriginalPrio;
}
}
// 然后,清空事件控制块中的任务
count = tEventRemoveAll(&mutex->event, (void *)0, tErrorDel);
// 清空过程中可能有任务就绪,执行一次调度
if (count > 0)
{
tTaskSched();
}
}
tTaskExitCritical(status);
return count;
}
/**********************************************************************************************************
** Function name : tMutexGetInfo
** Descriptions : 查询状态信息
** parameters : mutex 查询的互斥信号量
** parameters : info 状态查询存储的位置
** Returned value : 无
***********************************************************************************************************/
void tMutexGetInfo (tMutex * mutex, tMutexInfo * info)
{
uint32_t status = tTaskEnterCritical();
// 拷贝需要的信息
info->taskCount = tEventWaitCount(&mutex->event);
info->ownerPrio = mutex->ownerOriginalPrio;
if (mutex->owner != (tTask *)0)
{
info->inheritedPrio = mutex->owner->prio;
}
else
{
info->inheritedPrio = TINYOS_PRO_COUNT;
}
info->owner = mutex->owner;
info->lockedCount = mutex->lockedCount;
tTaskExitCritical(status);
}
参考资料:
本文详细介绍了互斥信号量的删除及状态查询方法,包括如何销毁信号量并唤醒相关任务,以及如何获取信号量的状态信息,如任务计数、所有者优先级等。
956

被折叠的 条评论
为什么被折叠?



