OpenEdv-开源电子网

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

中断发送任务通知死机问题

[复制链接]

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-5-4
在线时间
13 小时
发表于 2019-8-5 14:38:21 | 显示全部楼层 |阅读模式
5金钱
利用串口空闲中断发送任务通知(模拟二值信号量),然后利用任务进行数据的处理,但是发生了死机现象,求解大神是不是遗漏了什么。
求解答   


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-8-6 02:13:58 | 显示全部楼层
仿真找问题,看卡死在哪里
回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-5-4
在线时间
13 小时
 楼主| 发表于 2019-8-6 08:01:20 | 显示全部楼层
正点原子 发表于 2019-8-6 02:13
仿真找问题,看卡死在哪里

进入了HardFault死循环,我查找资料进入HardFault的原因有很多。E:\
回复

使用道具 举报

3

主题

93

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1070
金钱
1070
注册时间
2018-12-24
在线时间
111 小时
发表于 2019-8-6 09:10:29 | 显示全部楼层
相关代码贴出来看看
回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-5-4
在线时间
13 小时
 楼主| 发表于 2019-8-6 09:50:53 | 显示全部楼层
小灰灰Veni 发表于 2019-8-6 09:10
相关代码贴出来看看
  1. void USART2_IRQHandler(void)

  2. {

  3.         BaseType_t xHigherPriorityTaskWoken;
  4.        
  5.         if(USART_GetITStatus(USART2, USART_IT_TC) != RESET)  
  6.         {       
  7.                
  8.                 printf("发送完成中断2\r\n");
  9.                 USART2_TX_EN=0;                        //设置为接收模式       
  10.                 UART2_RX_DMA_Enable(); //使能DMA,等待接收
  11.                 USART_ITConfig(USART2, USART_IT_IDLE, ENABLE); //开启空闲中断
  12.                 USART_ClearITPendingBit(USART2, USART_IT_TC); //清除中断标志
  13.         }               

  14.                 else if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)
  15.                 {


  16.                 USART_ClearITPendingBit(USART2, USART_IT_IDLE); //清除中断标志
  17.                
  18.                        
  19.                        
  20.                 xSemaphoreGiveFromISR(BinarySemaphore1,&xHigherPriorityTaskWoken);
  21. //        if(Task4Task_Handler!=NULL)//接收到数据,并且接收任务通知的任务有效       
  22. //       
  23. //        {   vTaskNotifyGiveFromISR(Task4Task_Handler,&xHigherPriorityTaskWoken);//发送任务通知
  24. //                       
  25. //               
  26. //       
  27. //                                portYIELD_FROM_ISR(xHigherPriorityTaskWoken);//如果需要的话进行一次任务切换
  28. //                                printf("发送通知成功");
  29. //                       
  30. //        }       
  31.                     printf("串口2空闲中断\r\n");
  32.                 USART_ITConfig(USART2, USART_IT_IDLE, DISABLE); //关闭空闲中断
  33.        
  34.                 }
  35. }











  36. /*------------------------------------------------------------------------------------------------------------------------------------------------------*/
  37. void Frequency_Modebus_Recive_task(void *pvParameters)
  38. {

  39.         unsigned short int FRE_RX_DATE;
  40. while(1)
  41. {
  42.        
  43.         xSemaphoreTake(BinarySemaphore1,portMAX_DELAY);
  44.                
  45. //      ulTaskNotifyTake(pdTRUE,portMAX_DELAY);        //获取任务通知
  46.                                

  47.                         printf("调用成功4");
  48.                        
  49.                        
  50.                
  51.                        
  52.                 /* 1.读取DMA */
  53.                 USART_ReceiveData(USART2); //读取数据
  54.                 FRE_RX_CNT = DMA_Rec_Len - DMA_GetCurrDataCounter(DMA1_Channel6); //接收个数等于接收缓冲区总大小减已经接收的个数
  55.        
  56.           
  57.                 /* 3.搬移数据进行其他处理 */
  58.                 memcpy(FRE_HANDLE_BUF, FRE_MDBS_RX_BUF, FRE_RX_CNT); //数组复制
  59.                 FRE_RX_DATE=Frequency_Modbus_Recive_Event(FRE_HANDLE_BUF,FRE_RX_CNT);//CRC校验,取出数据
  60. ////                switch(Fre_flag)
  61. //                        {
  62. //                       
  63. //                               
  64. //                                case 2:Mid_Date.Speed=FRE_RX_DATE;break;
  65. //                                case 3:Mid_Date.Voltage=FRE_RX_DATE;break;
  66. //                                case 4:Mid_Date.Current=FRE_RX_DATE;break;
  67. //                                case 5:Mid_Date.Power=FRE_RX_DATE;break;
  68. //                                case 6:Mid_Date.Freq_Temper=FRE_RX_DATE;break;
  69. //                                case 7:Mid_Date.Torque=FRE_RX_DATE;break;
  70. //                               
  71. //                               
  72. //                               
  73. //        default:   break;
  74. //                        }
  75.                
  76.        
  77.        
  78.                
  79. vTaskDelay(10);  
  80.        

  81. }
  82.         }
复制代码
回复

使用道具 举报

3

主题

93

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1070
金钱
1070
注册时间
2018-12-24
在线时间
111 小时
发表于 2019-8-6 14:21:02 | 显示全部楼层
xSemaphoreTake(BinarySemaphore1,portMAX_DELAY);
你这里不用判断的吗
回复

使用道具 举报

10

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2016-4-9
在线时间
97 小时
发表于 2019-9-3 10:46:14 | 显示全部楼层
xSemaphoreTake(BinarySemaphore1,portMAX_DELAY);
这之前判断下  返回空  就死机
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 21:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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