解决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;
}

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值