我正在修改uCos ii的一些功能(主要是调度)。
我发现OSTaskDel函数在被ISR调用时什么也不做。
虽然我学习了操作系统的一些基本功能,但我真的不明白为什么要禁止它。
它所做的只是从readylist中提取并释放获取的资源,如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中做一些事情:
- 对信号量的阻塞等
- 如果是单CPU系统,则在获取旋转锁定时阻止
- 导致页面错误,该错误必须由虚拟内存子系统(即磁盘上的虚拟内存)解决
如果在ISR中执行上述任何操作,则会出现死锁。
OSTaskDel()
可能正在做其中的一些事情。