我正在修改uCos-ii的一些功能(主要是调度)。
我发现OSTaskDel函数在被ISR调用时什么都不做。
虽然我学到了操作系统的一些基本功能,但我真的不明白为什么要禁止它。
所有这一切都是从读取列表中获取并释放获得的资源,如TCB或信号量......
在处理中断时是否有理由禁止它们?
答案 0 :(得分:1)
从文档中不清楚为什么在这种情况下禁止它,但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()。
答案 1 :(得分:0)
一般来说,你不能在ISR中做一些事情:
如果您在ISR中执行上述任何操作,则会出现死锁。
OSTaskDel()
可能正在做其中的一些事情。