一,前言
之前仅了解到资源共享的task在某个task执行的时候,会出现优先级翻转,而优先级就是拥有这个资源的最高task的优先级,这样可以保证有这些资源的其它task不会抢占,那么资源就可以被某个task独享了。但是资源有3中类型除了标准类型还有内部资源和link资源这2种不是很理解,之后再看。
二,源码分析
- 获取资源
主要就是保存当前任务优先级,然后资源的优先级大于当前任务的优先级,就把当前任务对象的优先级设置为这个资源的优先级。主要代码如下
/* Task-only resource */
/* Save the current task priority mask */
ResID->dynamic->saved_priority.tpmask = Os_RunningTPMask;
/* Change the task priority iff higher. [$UKS 186] */
if ((0U == (previous_imask & 0xFFU) ) && (ResID->tpmask.t0 > Os_RunningTPMask.t0)) {
Os_RunningTPMask = ResID->tpmask;
}
- 释放资源
就是把当前任务对象的优先级还原,然后和core中的就绪任务中的优先级进行比较,若还原后优先级变低了,那么就切换为高优先级任务。
/* Task-only resource */
Os_RunningTPMask = ResID->dynamic->saved_priority.tpmask; /* Change the task priority. [$UKS 187] */
if ((0U == (previous_imask & 0xFFU) )) {
want_dispatch = (Os_ReadyTasks.p0 > Os_RunningTPMask.t0) /*lint !e931 PC-lint thinks there are side effects here */;
if (want_dispatch) {
Os_Dispatch();
}
}
三,小结
这个标准资源获取和释放的代码看起来比较简单,和我之前理解的需求一样。
网友评论