我正在修改uCos-ii的一些功能(主要是调度)。
我发现当ISR调用OSTaskDel函数时,它什么也不做。
虽然我学习了操作系统的一些基本功能,但我真的不明白为什么要禁止它。
它所做的一切就是从现成列表中提取并释放所获得的资源,如TCB或信号量……
在处理中断时,有没有理由禁止它们?
发布于 2012-09-29 22:13:16
从文档中看不出为什么在这种情况下会禁止,但OSTaskDel()会显式调用OS_Sched(),而且只有在存在最外层的嵌套中断处理程序(由OSIntExit()处理)时才会发生这种情况。
我认为以下是不可取的,因为可能还有其他原因禁止这样做,但您可以删除:
if (OSIntNesting > 0) {
return (OS_TASK_DEL_ISR);
}然后使OS_Sched()调用具有条件,如下所示:
if (OSIntNesting == 0) {
OS_Sched();
}如果这个死得很可怕,记得我说过这是不明智的!
此操作在任何情况下都会延长您的中断处理时间,因此如果只是出于这个原因,可能不是一个好主意。
一般来说(不仅仅是从ISR)异步删除另一个任务而不管任务状态或资源使用情况都不是一个好主意。uC/OS-II提供了OSTaskDelReq()功能来管理任务删除,允许任务根据请求自行删除,从而能够正确地释放其所有资源。即使没有这一点,通过任务的正常IPC机制发送请求通常也更好(也更可移植)。
如果任务不是为按需自删除而设计的,那么您可以简单地使用OSSuspend()。
发布于 2012-09-27 12:58:36
通常,您不能在ISR中执行以下操作:
)解决此问题
如果您在ISR中执行上述任一操作,将会出现死锁。
OSTaskDel()可能正在做其中的一些事情。
https://stackoverflow.com/questions/12614245
复制相似问题