解决STM32+cJSON+FreeRTOS中解析或者输出的结果为NULL的问题

硬件平台 STM32F103ZET6
开发工具KEIL5
任务堆栈1024
程序逻辑:每秒构造一个json字符串,然后用串口发出去。
问题描述:刚开始的几分钟可以,之后就出现了问题,每次在构造玩json后调用cJSON_PrintUnformatted函数总是返回NULL。系统也不崩溃。该任务剩余堆栈888.

问题排查,先跟踪cJSON_PrintUnformatted源代码,每个节点都创建成功,但是在最后组成总体json字符串时申请内存空间失败,导致了每次返回都是NULL。
检查代码的内存释放部分发现,调用的free函数,使用FreeRTOS后应该使用vPortFree函数来释放内存的。
修改为vPortFree函数后再次测试,问题未再出现。 特此记录

关于cJSON中使用FreeRTOS来管理内存的修改部分如下:
修改内容都在cjson.c中

修改点一:
static void *(*cJSON_malloc)(size_t sz) = pvPortMalloc;
static void (*cJSON_free)(void *ptr) = vPortFree;
修改点二:
void cJSON_InitHooks(cJSON_Hooks* hooks)
{
    if (!hooks) { /* Reset hooks */
        cJSON_malloc = pvPortMalloc;
        cJSON_free = vPortFree;
        return;
    }
	cJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:pvPortMalloc;
	cJSON_free	 = (hooks->free_fn)?hooks->free_fn:vPortFree;
}

你可能感兴趣的:(FreeRTOS)