vxworks中断服务
任务锁和中断锁 https://blog.csdn.net/qq2012qiao/article/details/37561797
任务状态转换 https://blog.csdn.net/laoqiuge/article/details/78468447
今天看到关于是否能在中断中semTake的表述,感觉很不错。不过如果semtake不用等待的信号,应该也是可以的,不会导致调用者切换到blocking态
VxWorks的中断服务程序(ISR)运行在特定的空间。不同于一般的任务,中断服务程序没有任务上下文,不包含任务控制块,所有的中断服务程序使用同一中断堆栈。
ISR中不能调用可能导致blocking的函数,例如: (a)不能以semTake获取信号量,因如果该信号量不可利用,内核会试图让调用者切换到blocking态; (b)malloc和free可能导致blocking,因此也不能使用; (c)应避免进行VxWorks I/O系统操作(除管道外); 引伸 : 1,在Vxworks里,任务调度器的调用一般有两种情况。一种是从中断或系统调用返回的时候,另一种就是代码本身去调用了会引起调度的系统函数,比如taskDelay一类。 2,在某些操作系统中,是可以在一些特定的低优先级ISR里面进行pend操作的。这要求操作系统的中断,有线程上下文(线程(任务)上下文是任务调度的基础,注意任务上下文不等同于中断上下文)。称为“中断线程化”。 Vxworks的任务调度是依赖于中断的,同时,为了实时性考虑,Vxworks不支持中断线程化,ISR是没有任务(线程)上下文(TCB)的。如果支持中断线程化,那么将导致中断响应时间不确定,实时性难以得到保证。 如果在vxworks里面,使用了可能blocking的代码,那么有2种情况: (a)一种是关中断运行。那么,在blocking的地方,将永远等待。因为这时候任务调度依赖的时钟中断都不能响应,也就是说任务调度器都不能运行了,系统就死在中断里了。 (b)另一种是开中断进行。那么,在blocking的地方,任务调度器仍然可能运行。此时,任务调度器会企图把ISR的TCB属性改为pend。但是ISR没有TCB,必然也出错。 在Vxworks里,通常是这样处理的:在ISR里,除了对中断寄存器进行必要的操作之外,尽量简单的就是只释放一个信号量,通知一个高优先级的任务来完成可能引起blocking的工作。
|
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具