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有关?