STM32中vPortFree()出现异常的问题解决(未完成)

Posted 429512065qhq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32中vPortFree()出现异常的问题解决(未完成)相关的知识,希望对你有一定的参考价值。

1. 先从常见的vPortFree()出现异常有那几种可能性?本次使用FREERTOS系统,

从发送的源头开始找起

 1 static void sendToQueue(const char *data,uint16_t len){
 2   //这是个临时变量,是否OK?
 3   NB_Raw_Data *send = NULL;
 4 //  send=(NB_Raw_Data *) malloc(sizeof(NB_Raw_Data));
 5   //分配的空间是512+2个字节
 6   send=(NB_Raw_Data *) pvPortMalloc(sizeof(NB_Raw_Data));
 7   if(!send){
 8     return ;
 9   }
10   send->len=len;
11   if(len > 514)
12   {
13     vPortFree(send);
14     return;
15   }
16   memcpy(send->data,data,len);
17   send->data[len]=0;
18   if(sendToSendQueue(send)==false){
19     vPortFree(send);
20   }
21 }

看下发送的函数,既然是2级指针,那么创建的队列是什么?

1 BaseType_t  sendToSendQueue(NB_Raw_Data  *data){
2   bool state=false;
3   if(sendQueue){
4   //这里使用的2级指针,是否OK?
5     state =  xQueueSend(sendQueue,( void * ) &data,SEND_MAX_WAIT); 
6   }
7   return state;
8 }

看下接收的函数,不过这里的2个疑问,其中一个是NB_Raw_Data 是否需要字节对齐?

 1 void dealQueueRecieve(){
 2   NB_Raw_Data   *recieve=NULL;
 3   if(sendQueue){
 4     //这样的写法,是否能完成对recieve的赋值?2级指针的机制是什么?
 5     BaseType_t  xResult = xQueueReceive(sendQueue,                   
 6                                         (void *)&recieve, 
 7                                         (TickType_t)RECIEVE_MAX_WAIT);
 8     if((xResult == pdPASS)&&(recieve!=0)) //优先级是否OK?
 9     {
10       uart_bc95_send( recieve->data,  recieve->len);
11       vPortFree(recieve);
12     }
13   }
14 }

2. 从系统栈的入栈空间进行分析?

3. 在释放函数局部临时变量指向的地址,是否会有问题?

4. STM32是怎么记录分配的内存,机制是什么?

5. STM32的内存分配是否和heap4.c有关?

以上是关于STM32中vPortFree()出现异常的问题解决(未完成)的主要内容,如果未能解决你的问题,请参考以下文章

STM32低功耗串口接受数据异常

STM32低功耗串口接受数据异常

STM32 485通讯

STM32 485通讯

Rtos 的 Stm32 硬故障异常

stm32异常复位重启