查看: 5568|回复: 9

ucos下串口中断问题

[复制链接]
  • TA的每日心情
    慵懒
    2014-8-8 09:37
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2014-7-3 10:03:17 | 显示全部楼层 |阅读模式
    分享到:
    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. 复位之后,没有收到数据之前调出小键盘依然死机,这时候中断里面的东西应该是没有执行过的啊,和这个应该没有关系了吧,,,

    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2014-8-8 09:37
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

     楼主| 发表于 2014-7-3 10:40:33 | 显示全部楼层
    IntToStr(i,temp);
    这个是整数转字符串函数,啦啦建议,把这个去掉,换成固定字符串的时候正常了
    换Sprintf
    printf(temp,"%d",i);
    EDIT_SetText(WM_GetDialogItem(Page1_hItem, ID_EDIT_0),temp);
    写进去直接就死机,,,,
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-1-8 15:51
  • 签到天数: 22 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 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微秒
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-8-7 16:04
  • 签到天数: 40 天

    连续签到: 1 天

    [LV.5]常住居民I

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

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

    使用道具 举报

  • TA的每日心情
    开心
    2014-8-7 16:04
  • 签到天数: 40 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2014-7-12 12:46:38 | 显示全部楼层
    是不是这样
       (1)、首先创建一个信号量,2个任务,比喻一个是串口数据处理,一个是点亮led,数据处理优先级高。
       (2)、使用pend阻塞串口数据处理任务,从而使LED任务获得信号量运行。
       (3)、当串口中断来时,post信号量,从而使优先级高的串口数据处理任务得到运行,处理完数据继续pend自己,使led再次运行。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-8-7 16:04
  • 签到天数: 40 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2014-7-14 11:49:46 | 显示全部楼层
    我的理解还是错的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2014-8-8 09:37
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

     楼主| 发表于 2014-7-16 10:19:53 | 显示全部楼层
    说不定 发表于 2014-7-14 11:49
    我的理解还是错的

    不用这么麻烦吧,,,,
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2014-8-8 09:37
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

     楼主| 发表于 2014-7-16 10:20:30 | 显示全部楼层
    说不定 发表于 2014-7-14 11:49
    我的理解还是错的

    搞个邮箱完事
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2022-6-22 23:57
  • 签到天数: 943 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2014-8-14 10:59:31 | 显示全部楼层
    卢老师  说的有道理   
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2014-8-22 15:51:50 | 显示全部楼层
    信号量确实是个不错的选择
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-24 03:24 , Processed in 0.212196 second(s), 33 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.