STM32使用cJSON库遇到的问题总结
最近做项目用到了JSON报文,原来接触过一点就自己简单的写了一下处理数据的程序,但是效果一般,简单几个键值还可以,为了让程序功能更标准就使用了JSON文件库。
出现的问题:
1、在键值比较少的时候,没什么问题,运行也还稳定,当键值增加后在调用cJSON_Print();函数时返回的指针为0x00000000。
解决办法:
最后查到问题应该是出在内存申请和释放上面,于是借鉴了正点原子的内存分配程序,把cJSON.c中的
static void *(*cJSON_malloc)(size_t sz) = malloc;
static void (*cJSON_free)(void *ptr) = free;
改为
static void *(*cJSON_malloc)(size_t sz) = mymalloc;
static void (cJSON_free)(void ptr) = myfree;
把函数
void cJSON_InitHooks(cJSON_Hooks hooks)
{
if (!hooks) { / Reset hooks */
cJSON_malloc = malloc;
cJSON_free = free;
return;
}
cJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:malloc;
cJSON_free = (hooks->free_fn)?hooks->free_fn:free;
}
改为
void cJSON_InitHooks(cJSON_Hooks* hooks)
{
if (!hooks) { /* Reset hooks */
cJSON_malloc = malloc;
cJSON_free = free;
return;
}
cJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:mymalloc;
cJSON_free = (hooks->free_fn)?hooks->free_fn:myfree;
}
最后在P = cJSON_Print(buf);后释放内存myfree§;
改完之后程序可以正常运行。
其他问题:
整个调试过程中程序长时间运行时过一段时间会死在HardFault_Handler();中,由于出现的时间间隔不确定还没查出具体是哪的问题,怀疑可能是两个串口收发数据量太大或者还是因为内存分配的原因,有待继续查找原因。暂时只是加了看门狗临时过滤掉这个问题。
补充:死机应该是多次调用一个函数。而函数入口参数都是同一个指针造成的,重新修改程序流程之后没出现过死机情况