在写程序中突然遇到一个怪事情,我使用的ARM是LPC2148,操作系统用的是UCOS,程序是串口发送接收程序,其中数据的接收是用信号量来控制的,当中断中接收到数据后,向接收任务发送一个信号量,接收任务在接收到信号量后,对数据进行处理.程序可以正常运行,但运行一会儿后,PC指针不知道怎么就跑到 未定义指令异常中断那里了,然后在那里不停地循环,但如果不使用信号量,而是使用一个公共变量来控制这样一个过程,程序就完全没有问题,不知道为什么,有没有人遇到过,帮兄弟一把.
UCOS使用的是周立功公司移植的那.其他地方也有用到过信号量,都是正常的,就这一个有问题.相关的代码如下:
未定义指令异常中断处理语句:
;未定义指令
Undefined
B Undefined
中断中发送的信号量的地方:
if(tempChar == CHAR_LF) //收到LF符
{
RxBufEn = 0;
#ifdef RxSigEn //这个宏就是调试时用的,如果打开这个宏,使用信号量控制,程序就会跑到上面的undefined处,
//不启用时,一点问题没有,那样就是用RxBufEn变量来控制
OSSemPost(SemUartRec);//发信号量,接收完成
#endif
}
任务中等待信号量的地方:
#ifdef RxSigEn
OSSemPend(SemUartRec,0,&err); //一直等待到收到完整数据
Uart0Process();
#else
if(RxBufEn==0) //等待接收完成
{
Uart0Process();
}
OSTimeDly(10);
#endif
请各位帮我看一下,如果用了信号量,程序跑一会儿就死了,暂停调试会PC会停在Undefined处,值为0x00000040.
在中断函数第一行加上OSIntNesting++; 或者OSIntEnter();
如果你加了还是有问题,那我就不知道为什么了,如果没加,出现你说的现象的原因是:
OSSemPost(SemUartRec);里面调用了任务级调度函数。任务级和中断级调度的唯一区别就是,任务级多了一次压栈处理。因为中断本身已经压了一次栈,所以中断级调度函数里不能再压,否则栈定会越来越高,最后溢出。在中断函数里调用OSSemPost(SemUartRec);等于就是多压了一次栈,但是如果在发出信号量前加上OSIntNesting++; 或者OSIntEnter();任务级调度函数不会有任务调度动作,也就不会压栈,就不会出问题了。
欢迎指教
谢谢指教,我试了一下,加了这句话后,通信都断了,不知道为什么,我再研究研究.
我的问题已经解决了,可以查看我的BLOG查看原因,虽然不是www871所讲的原因,但分还是要加给他的,感谢他对我的支持,谢谢了.
其实是没有问题的,我是打的时候手误,呵呵,有个地方语法打错了.让大家失望了,我的BLOG地址是: http://blog.meijwang.com