[ZLG-ARM] UCOS-II(中断中发送信号量的疑问)

[复制链接]
 楼主| id001 发表于 2008-5-27 10:56 | 显示全部楼层 |阅读模式
实验板使用的是:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SmartARM2300<br />看到一段代码如下:<br />等待信号量的代码:<br />void&nbsp;&nbsp;&nbsp;TaskBeep(void&nbsp;*pdata)<br />{<br />.....<br />&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSSemPend(Sem1,0,&err);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.........<br />&nbsp;&nbsp;&nbsp;}<br />}<br />中断服务程序:(中断服务程序这样发送信号量是否不对????)<br />void&nbsp;&nbsp;&nbsp;ExInt_Exception(void)<br />{<br />&nbsp;&nbsp;&nbsp;OSSemPost(Sem1);&nbsp;&nbsp;&nbsp;&nbsp;???/*如果TaskBeep的信号量已处于等待状态,那么这里其不是要进行任务切换入TaskBeep中?而这是在中断服务程序中????*/<br />&nbsp;&nbsp;&nbsp;IO0IntClr=&nbsp;KEY1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0;<br />}<br /><br />谢谢。<br />&nbsp;
qiqiang 发表于 2008-5-27 13:11 | 显示全部楼层

re

不会进入,中断程序的优先级是最高的,要执行完中断服务程序,且没有中断嵌套,并且TaskBee又是就绪队列中优先级最高的任务,才会转到它去
 楼主| id001 发表于 2008-5-27 20:45 | 显示全部楼层

谢谢2楼

先谢谢2楼,但我觉得不对,<br />用实现2楼所说的情况,应该是:<br /><br />void&nbsp;&nbsp;&nbsp;ExInt_Exception(void)<br />{<br />&nbsp;&nbsp;&nbsp;OSIntENTER();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//加上这<br />&nbsp;&nbsp;&nbsp;OSSemPost(Sem1);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;IO0IntClr=&nbsp;KEY1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;OSIntExit();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//退出时任务调度!!(如此才可以吧)<br />}<br /><br />LPC新手,谢谢,恳请指教!<br /><br />所以我觉得1楼那样在中断中发送信号量不对。<br />恳请ZLG_arm出来解释一下阿~~~~~~~~~~~~~~~<br />
sufeng983 发表于 2008-5-28 09:54 | 显示全部楼层

111

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在OSSemPost里面会调用这2个函数。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_EventTaskRdy(pevent,&nbsp;(void&nbsp;*)0,&nbsp;OS_STAT_SEM);&nbsp;使任务就绪&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_Sched();&nbsp;任务切换<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在OS_Sched()中会做<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((OSIntNesting&nbsp;==&nbsp;0)&nbsp;&&&nbsp;(OSLockNesting&nbsp;==&nbsp;0))这个判断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSIntNesting这个是中断嵌套层数,只有嵌套为0的时候,也就是,没任何&nbsp;&nbsp;&nbsp;&nbsp;中断函数没处理完的时候,才进行任何切换。&nbsp;
 楼主| id001 发表于 2008-5-28 10:39 | 显示全部楼层

谢谢4楼

还是不明白。<br />由于进入ExInt_Exception()中断程序中没有调用OSIntENTER(),也就是说<br />此时OSIntNesting=0。<br />那么必然在调用OSSemPost()时将发生任务调度阿~~~~~~~~~~~~<br /><br />再次问是否要让中断服务程序参与任务管理,因该加上OSIntENTER()与OSIntExit()两个函数???<br /><br />如果不加,请解释一下是为什么???<br />
zlgarm 发表于 2008-5-28 20:14 | 显示全部楼层

您好

楼主您好:<br />&nbsp;&nbsp;&nbsp;您的问题已经在您发的另外一个帖子中给您解释了,请去查阅。<br />by:lrk
sufeng983 发表于 2008-5-29 10:07 | 显示全部楼层

LZ

&nbsp;&nbsp;&nbsp;&nbsp;这个函数要加,而且要在每个比你当前中断低级,能被你的中断抢断的中断服务程序中加。比你当前中断高级的服务程序就不用加了,这样过多的调用势必为影响中断响应速度,就看你自己斟酌了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

107

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部