9回答

0收藏

ucos下串口中断问题

#开源分享 #开源分享 5942 人阅读 | 9 人回复 | 2014-07-03

file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\782466187\QQ\WinTemp\RichOle\CPNNM{IZZH~0IX04UQZ(}IL.jpg
void USART2_IRQHandler(void)       
{
        u8 Res;
        OSIntEnter();
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  
        {
                Res =USART_ReceiveData(USART2);
                delay_ms(5);
                GPIO_SetBits(GPIOA,GPIO_Pin_1);i++;
                USART_SendData(USART2 ,Res);
                while(! USART_GetFlagStatus(USART2, USART_FLAG_TXE));
                delay_ms(8);
                GPIO_ResetBits(GPIOA,GPIO_Pin_1);
                EDIT_SetText(WM_GetDialogItem(Page1_hItem, ID_EDIT_0),IntToStr(i,temp));
        }         
        OSIntExit();
        USART_ClearFlag(USART2,USART_IT_RXNE);
}
1.  加了EDIT_SetText(WM_GetDialogItem(Page1_hItem, ID_EDIT_0),IntToStr(i,temp));这句,调出小键盘输入过程中会死机,去掉就没事,,,
2. 没有调出小键盘的时候,串口收到数据,返回正常,EDIT显示的数据会累加。
3. 复位之后,没有收到数据之前调出小键盘依然死机,这时候中断里面的东西应该是没有执行过的啊,和这个应该没有关系了吧,,,

分享到:
回复

使用道具 举报

回答|共 9 个

倒序浏览

沙发

韩解嘲

发表于 2014-7-3 10:40:33 | 只看该作者

IntToStr(i,temp);
这个是整数转字符串函数,啦啦建议,把这个去掉,换成固定字符串的时候正常了
换Sprintf
printf(temp,"%d",i);
EDIT_SetText(WM_GetDialogItem(Page1_hItem, ID_EDIT_0),temp);
写进去直接就死机,,,,
板凳

laoliang-67665

发表于 2014-7-4 16:52:55 | 只看该作者

问题有点多,如果单从原则上来讲,中断函数的响应应该是尽可能的短
因为中断服务程序的时间长,其他的低优先级的中断就得不到响应,这个系统就不是实时的
抛开这个原则,代码甚至调用了延时,我想你这个延时是死循环延时对吗?总之我认为延时是一定不能在这里头的。产生出错的原因很可能是最后的EDIT_SetText(WM_GetDialogItem(Page1_hItem, ID_EDIT_0),IntToStr(i,temp));因为这个处理很复杂,可以参考UCGUI的源代码

解决方法:采用信号量和任务的处理方案
1.写一个处理串口数据的任务,专门用来处理串口接收到的信息。创建一个信号量,改任务等待信号量,如果等待成功就处理,处理后继续等待PEND
2.在串口中断服务程序中,当获取到有效的数据的时候,POST信号量,而不是去处理

如果问我从POST到任务处理的时间间隔,我可以负责的告诉你,3-4微秒
嵌入式,ucos,FPGA系统书籍作者
地板

说不定

发表于 2014-7-11 16:45:52 | 只看该作者

亮点 发表于 2014-7-4 16:52
问题有点多,如果单从原则上来讲,中断函数的响应应该是尽可能的短
因为中断服务程序的时间长,其他的低优 ...

卢老师,对于你的处理办法我感觉有些迷糊的地方。
  1、     首先我们应该创建一个信号量,是否要另外建一个任务跟串口数据处理任务抢这个信号量,不然这个信号量总是串口数据处理这个任务的啊。pend使串口数据处理任务处于等待状态的前提条件是信号量为0,这个信号量的值为如何才能为0昵?
2、中断能使用post释放信号量,难道是中断手里占据这个信号量?
5#

说不定

发表于 2014-7-12 12:46:38 | 只看该作者

是不是这样
   (1)、首先创建一个信号量,2个任务,比喻一个是串口数据处理,一个是点亮led,数据处理优先级高。
   (2)、使用pend阻塞串口数据处理任务,从而使LED任务获得信号量运行。
   (3)、当串口中断来时,post信号量,从而使优先级高的串口数据处理任务得到运行,处理完数据继续pend自己,使led再次运行。
6#

说不定

发表于 2014-7-14 11:49:46 | 只看该作者

我的理解还是错的
7#

韩解嘲

发表于 2014-7-16 10:19:53 | 只看该作者

说不定 发表于 2014-7-14 11:49
我的理解还是错的

不用这么麻烦吧,,,,
8#

韩解嘲

发表于 2014-7-16 10:20:30 | 只看该作者

说不定 发表于 2014-7-14 11:49
我的理解还是错的

搞个邮箱完事
9#

franki

发表于 2014-8-14 10:59:31 | 只看该作者

卢老师  说的有道理   
10#

huangchao08

发表于 2014-8-22 15:51:50 | 只看该作者

信号量确实是个不错的选择
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条