5625|11

58

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

很郁闷的问题,谢谢大家帮忙,马上给分!!! [复制链接]

VxWorks的中断服务程序(ISR)运行在特定的空间。不同于一般的任务,中断服务程序没有任务上下文,不包含任务控制块,所有的中断服务程序使用同一中断堆栈。

ISR中不能调用可能导致blocking的函数,例如:

(a)不能以semTake获取信号量,因如果该信号量不可利用,内核会试图让调用者切换到blocking态;

(b)malloc和free可能导致blocking,因此也不能使用;

(c)应避免进行VxWorks I/O系统操作(除管道外);

一直不理解为什么ISR中不能调用会导致blocking的函数?????如果block了,它不是有堆栈呵,哪为能给我解释下吗?
那中断嵌套又是怎么回事呢?????


最新回复

没遇到过这种情况.  详情 回复 发表于 2008-5-1 15:50
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这个问题也太大了吧
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
中断具有最高优先级,如果中断 block 了,别的 task 没有机会去运行,谁去解除 block?
中断嵌套中同样不允许调用可能导致 block 的函数。
嵌套中断返回,被嵌套的中断自动获得运行机会。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
sterrys说的对,中断优先级最高,如果它被block了,就没有别的任务能运行了。中断栈和任务堆栈是不一样的。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 
还是不太明白,比如说在中断服务程序中申请了信号量,如果block了,不是有栈可入呵,就算block了,其他任务有可能释放信号量,中断服务程序不又可以继续往下执行了么!
那中断嵌套的时候,如果有更高优先级来了,它还不一样要停下来,让给别人,这个时候它的上下文保存到哪去了????这不跟block一样吗????
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
quote:
     比如说在中断服务程序中申请了信号量,如果block了,不是有栈可入呵,就算block了,其他任务有可能释放信号量..........

这里有问题:中断是高优先级的,别的程序运行不了,自然不能释放信号量!

上下文压进堆栈,中断要保护现场的

个人不成熟的见解,如有错误,望高手不吝赐教!多谢!
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

7
 
在某些操作系统中,是可以在一些特定的低优先级ISR里面进行pend操作的。这要求操作系统的中断,有线程上下文(线程(任务)上下文是任务调度的基础,注意任务上下文不等同于中断上下文)。称为“中断线程化”。
Vxworks的任务调度是依赖于中断的,同时,为了实时性考虑,Vxworks不支持中断线程化,ISR是没有任务(线程)上下文的。如果支持中断线程化,那么将导致中断响应时间不确定,实时性难以得到保证。
如果在vxworks里面,使用了可能blocking的代码,那么有2种情况:
一种是关中断运行。那么,在blocking的地方,将永远等待。因为这时候任务调度依赖的时钟中断都不能响应,也就是说任务调度器都不能运行了,系统就死在中断里了。
另一种是开中断进行。那么,在blocking的地方,任务调度器仍然可能运行。此时,任务调度器会企图把ISR的TCB属性改为pend。但是ISR没有TCB,必然也出错。

在Vxworks里,通常是这样处理的:在ISR里,除了对中断寄存器进行必要的操作之外,尽量简单的就是只释放一个信号量,通知一个高优先级的任务来完成可能引起blocking的工作。这类似于Linux的上下半部的处理方法。

在中断嵌套的情况下,中断上下文没有任务上下文那么复杂。只是保存了PC指针,和一些相应的寄存器的状态就够了。中断有的使用硬件堆栈,有的使用软件堆栈。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
很感谢ningxin的详细回答,让我受益很多,
还有一个不解的是,回答中提到:

一种是关中断运行。那么,在blocking的地方,将永远等待。因为这时候任务调度依赖的时钟中断都不能响应,也就是说任务调度器都不能运行了,系统就死在中断里了。

我一直理解当某一任务的执行不需要继续占用CPU时(等待资源或挂起或自杀或它想让别的任务执行等,总之从它想从运行态转到其他态),都会调用任务调度函数。那么ISR在申请信号量等待block的时候,虽然关中断了,但是它应该会去调用任务调度函数,然后会从就绪态中选取最高优先级的任务去执行。这样也就不会死在中断里面了。

不对的地方请大家指点。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
抱歉,是有点疏漏。
在Vxworks里,任务调度器的调用一般有两种情况。一种是从中断或系统调用返回的时候,另一种就是代码本身去调用了会引起调度的系统函数,比如taskDelay一类。
如果中断里关闭了自身的中断或者其它中断(甚至用了intlock一类函数),那么被关闭的中断再也不会正常打开。这样系统也无法正常工作。
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

10
 
我看大家讲了一堆理论,但好像没有去看VxWorks的具体实现(看源代码和测试均可)。实际上在VxWorks中多数
不能在中断中调用的操作如semTake都判断了是否在中断中调用了,如果调用了直接返回失败,不存在什么阻塞的
说法,只是有些地方没有判断返回值如malloc里面,会导致互斥不起作用而导致莫名其妙的错误。

实际上如果把那些判断去掉,根据VxWorks的实现,它会简单地处理taskIdCurrent而影响到中断执行时的当前任务,
中断本身还是不可能阻塞的,函数调用返回之后继续执行。有兴趣可以修改了taskDelay测试一下。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

11
 
关注 接分
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

12
 
没遇到过这种情况.
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表