OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6424|回复: 8

ucos串口接收中断发送信号量或嵌套信号量程序会卡死

[复制链接]

14

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
168
金钱
168
注册时间
2020-9-2
在线时间
41 小时
发表于 2021-1-8 16:31:43 | 显示全部楼层 |阅读模式
1金钱

串口1接收函数只在第一次产生串口中断,然后串口再接收数据就会卡在中断程序里,请问这该怎么修改?


//任务1的任务函数
void task1_task(void *p_arg)
{
        u8 key;
        u8 num;
        OS_ERR err;
        while(1)
        {

                //OSTaskSemPost(&Task2_TaskTCB,OS_OPT_POST_NONE,&err);        //使用系统内建信号量向任务task2发送信号量
                       
                num++;
                if(num==50)
                {
                        num=0;
                        LED0=~LED0;
                }
                OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err);                   //延时10ms
        }
}

//任务2的任务函数
void task2_task(void *p_arg)
{       
        u8 num;
        OS_ERR err;
        while(1)
        {
                OSTaskSemPend(0,OS_OPT_PEND_BLOCKING,0,&err);                //请求任务内建的信号量
                num++;
                printf("任务信号量获取成功!\r\n");
                LED1 = ~LED1;
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
        }
}
void USART1_IRQHandler(void)        
{
        unsigned char r;
        OS_ERR err;
        OSIntEnter();
       
        if(USART_GetFlagStatus(USART1,USART_IT_RXNE)!=RESET)
        {
                r=USART_ReceiveData(USART1);
               
                 
                printf("数据接收完成,释放一个任务信号量到数据分析任务\r\n");
                        OSTaskSemPost((OS_TCB  *)&Task2_TaskTCB,           //目标任务
                                                        (OS_OPT   )OS_OPT_POST_NONE,        //没选项要求
                                                        (OS_ERR  *)&err);
               
        }       
               
        //USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志
        OSIntExit();
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4471
金钱
4471
注册时间
2013-4-22
在线时间
335 小时
发表于 2021-1-8 16:42:01 | 显示全部楼层
你这是接收发送同时进中断导致的错误
回复

使用道具 举报

14

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
168
金钱
168
注册时间
2020-9-2
在线时间
41 小时
 楼主| 发表于 2021-1-8 16:55:52 | 显示全部楼层
三叶草 发表于 2021-1-8 16:42
你这是接收发送同时进中断导致的错误

该怎么处理?发送信号量之前加入退出串口中断?
回复

使用道具 举报

14

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
168
金钱
168
注册时间
2020-9-2
在线时间
41 小时
 楼主| 发表于 2021-1-8 16:59:33 | 显示全部楼层
三叶草 发表于 2021-1-8 16:42
你这是接收发送同时进中断导致的错误

OSIntEnter();
       
        if(USART_GetFlagStatus(USART1,USART_IT_RXNE)!=RESET)
        {
                USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志
                r=USART_ReceiveData(USART1);                 
                printf("数据接收完成,释放一个任务信号量到数据分析任务\r\n");
                OSIntExit();
                OSTaskSemPost((OS_TCB  *)&Task2_TaskTCB,           //目标任务
                                         (OS_OPT   )OS_OPT_POST_NONE,        //没选项要求
                                            (OS_ERR  *)&err);
                //USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//关闭中断
        }       

这样的吧?试了不卡死了!
回复

使用道具 举报

14

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
168
金钱
168
注册时间
2020-9-2
在线时间
41 小时
 楼主| 发表于 2021-1-8 17:03:16 | 显示全部楼层
binzhang 发表于 2021-1-8 16:59
OSIntEnter();
       
        if(USART_GetFlagStatus(USART1,USART_IT_RXNE)!=RESET)

不知道这种方法是不是正确的?
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4471
金钱
4471
注册时间
2013-4-22
在线时间
335 小时
发表于 2021-1-8 20:14:51 | 显示全部楼层
binzhang 发表于 2021-1-8 17:03
不知道这种方法是不是正确的?

其实没有必要加临界段代码,因为中断的优先级都高于任务的优先级。获取状态没有错,但是你这样导致发送和接收处于同一个中断。stm32其实不支持同时接收和发送,只能软件上避免。建议直接参考原子的历程,它里面有发送接收的处理。
回复

使用道具 举报

14

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
168
金钱
168
注册时间
2020-9-2
在线时间
41 小时
 楼主| 发表于 2021-1-8 21:26:28 | 显示全部楼层
三叶草 发表于 2021-1-8 20:14
其实没有必要加临界段代码,因为中断的优先级都高于任务的优先级。获取状态没有错,但是你这样导致发送和 ...

好的,谢谢
回复

使用道具 举报

14

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
168
金钱
168
注册时间
2020-9-2
在线时间
41 小时
 楼主| 发表于 2021-1-9 09:24:44 | 显示全部楼层
本帖最后由 binzhang 于 2021-1-9 09:31 编辑
三叶草 发表于 2021-1-8 20:14
其实没有必要加临界段代码,因为中断的优先级都高于任务的优先级。获取状态没有错,但是你这样导致发送和 ...



回复

使用道具 举报

14

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
168
金钱
168
注册时间
2020-9-2
在线时间
41 小时
 楼主| 发表于 2021-3-30 08:44:54 | 显示全部楼层
三叶草 发表于 2021-1-8 16:42
你这是接收发送同时进中断导致的错误

老哥,麻烦看下我串口又出现问题了,我发送的是以0xff 0xff开头的,怎么接收后就变成了0x0d 0x0a开头的了。
串口接收程序
void USART1_IRQHandler(void)   
{
        u8 r;
        OS_ERR err;
        OSIntEnter();  
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
        {
                Rx_buff[Rx_Cnt]=USART_ReceiveData(USART1);//(USART1->DR);        //读取接收到的数据;
                Rx_Cnt++;
                if(Rx_Cnt>(Rx_len-1))
                {
                        OSTaskSemPost((OS_TCB  *)&AnalyDataTaskTCB,           //目标任务
                                                        (OS_OPT   )OS_OPT_POST_NONE,        //没选项要求
                                                        (OS_ERR  *)&err);       
                        Rx_Cnt=0;
                }
        }
        //USART_ClearITPendingBit(USART1,USART_IT_RXNE);
        OSIntExit();  
}



QQ图片20210330084325.png
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表