uCOS的任务删除不应在ISR期间发生的原因



我正在修改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中做一些事情:

  1. 对信号量的阻塞等
  2. 如果是单CPU系统,则在获取旋转锁定时阻止
  3. 导致页面错误,该错误必须由虚拟内存子系统(即磁盘上的虚拟内存)解决

如果在ISR中执行上述任何操作,则会出现死锁。

OSTaskDel()可能正在做其中的一些事情。

相关内容

  • 没有找到相关文章

最新更新