我正在修改 uCos-ii 的一些功能(主要是调度)。
我发现 OSTaskDel 函数在被 ISR 调用时什么也不做。
虽然我了解了操作系统的一些基本功能,但我真的不明白为什么要禁止这样做。
它所做的只是从就绪列表中退出并释放获取的资源,如 TCB 或信号量......
在处理中断时是否有任何理由禁止他们?
我正在修改 uCos-ii 的一些功能(主要是调度)。
我发现 OSTaskDel 函数在被 ISR 调用时什么也不做。
虽然我了解了操作系统的一些基本功能,但我真的不明白为什么要禁止这样做。
它所做的只是从就绪列表中退出并释放获取的资源,如 TCB 或信号量......
在处理中断时是否有任何理由禁止他们?
从文档中不清楚为什么在这种情况下禁止它,而是OSTaskDel()
显式调用OS_Sched()
,并且在 ISR 中,这应该仅在存在最外层嵌套中断处理程序时发生(由 处理OSIntExit()
)。
我不认为以下是可取的,因为可能有其他原因禁止这样做,但您可以删除:
if (OSIntNesting > 0) {
return (OS_TASK_DEL_ISR);
}
然后使OS_Sched()
调用有条件,如下所示:
if (OSIntNesting == 0) {
OS_Sched();
}
如果这死得很惨,请记住我说过这是不明智的!
在任何情况下,此操作都会延长您的中断处理时间,因此仅出于这个原因可能是个坏主意。
通常(不仅仅是来自 ISR)异步删除另一个任务而不考虑该任务的状态或资源使用情况是一个坏主意。uC/OS-II 提供了OSTaskDelReq()
管理任务删除的功能,允许任务根据请求自行删除,从而能够正确释放其所有资源。即使没有这个,通过任务的正常 IPC 机制发送请求通常会更好(并且更便携)。
如果任务不是为按需自删除而设计的,那么您可以简单地使用 OSSuspend()。
一般来说,你不能在 ISR 中做一些事情:
如果您在 ISR 中执行上述任何操作,您将陷入僵局。
OSTaskDel()
可能正在做其中的一些事情。