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

时间:2012-09-27 04:46:20

标签: operating-system rtos ucos

我正在修改uCos-ii的一些功能(主要是调度)。

我发现OSTaskDel函数在被ISR调用时什么都不做。

虽然我学到了操作系统的一些基本功能,但我真的不明白为什么要禁止它。

所有这一切都是从读取列表中获取并释放获得的资源,如TCB或信号量......

在处理中断时是否有理由禁止它们?

2 个答案:

答案 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中做一些事情:

  1. 阻止信号量等
  2. 获取自旋锁时阻止,如果它是单CPU系统
  3. 导致页面错误,必须由虚拟内存子系统解析(具有虚拟磁盘内存,即)
  4. 如果您在ISR中执行上述任何操作,则会出现死锁。

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