首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ISR过程中不应发生uCOS任务删除的原因

ISR过程中不应发生uCOS任务删除的原因
EN

Stack Overflow用户
提问于 2012-09-27 12:46:20
回答 2查看 808关注 0票数 0

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

我发现当ISR调用OSTaskDel函数时,它什么也不做。

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

它所做的一切就是从现成列表中提取并释放所获得的资源,如TCB或信号量……

在处理中断时,有没有理由禁止它们?

EN

回答 2

Stack Overflow用户

发布于 2012-09-29 22:13:16

从文档中看不出为什么在这种情况下会禁止,但OSTaskDel()会显式调用OS_Sched(),而且只有在存在最外层的嵌套中断处理程序(由OSIntExit()处理)时才会发生这种情况。

我认为以下是不可取的,因为可能还有其他原因禁止这样做,但您可以删除:

代码语言:javascript
复制
if (OSIntNesting > 0) {
    return (OS_TASK_DEL_ISR);
}

然后使OS_Sched()调用具有条件,如下所示:

代码语言:javascript
复制
if (OSIntNesting == 0) {
    OS_Sched();
}

如果这个死得很可怕,记得我说过这是不明智的!

此操作在任何情况下都会延长您的中断处理时间,因此如果只是出于这个原因,可能不是一个好主意。

一般来说(不仅仅是从ISR)异步删除另一个任务而不管任务状态或资源使用情况都不是一个好主意。uC/OS-II提供了OSTaskDelReq()功能来管理任务删除,允许任务根据请求自行删除,从而能够正确地释放其所有资源。即使没有这一点,通过任务的正常IPC机制发送请求通常也更好(也更可移植)。

如果任务不是为按需自删除而设计的,那么您可以简单地使用OSSuspend()。

票数 1
EN

Stack Overflow用户

发布于 2012-09-27 12:58:36

通常,您不能在ISR中执行以下操作:

  1. 块在信号量等
  2. 块获取自旋锁时,如果它是单CPU系统
  3. 导致页面错误,则必须由虚拟内存子系统(具有虚拟磁盘上内存,即

)解决此问题

如果您在ISR中执行上述任一操作,将会出现死锁。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12614245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档