使用场景
项目中使用stm32f1系列芯片+FreeRTOS系统,需要解析json格式数据。
问题
在网上找到了cJson库,cJson库相对来说还是比较简单方便的,具体怎么用的,网上很多介绍,这里说一下遇到的问题:
直接引用头文件,把c文件加入工程,编译使用,但在解析某些数据的时候直接返回空指针,如下:
root = cJSON_Parse((char*)source);
if(root==cJSON_Invalid)
{
//报错
}
直接报错,有些时候又正常。后来发现跟数据长度有关,长的会报错,短的不会。所以马上想到是因为内存申请不够的原因,后面分析cJson的代码发现,它申请和释放内存是直接调用的C的标准函数malloc和free,但我们在FreeRTOS里面的内存申请和释放是要用pvPortMalloc和vPortFree的,因为FreeRTOS 的pvPortMalloc 和 C的标准函数malloc的区别是:pvPortMalloc是从configTOTAL_HEAP_SIZE中申请内存,而malloc是直接从SRAM 堆 中申请内存,是和全局变量一个地位。我们在定义操作系统的时候已经把堆占得差不多了,所以自然申请不了多少就不够用了。
解决方案
其实cJson也给出了解决方案,只是我没注意,在它的头文件中有定义:结构体cJSON_Hooks和函数cJSON_InitHooks,用这两个就可以把我们的pvPortMalloc和vPortFree函数指针替换它原来的申请和释放内存了。具体