硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3252|回复: 8
收起左侧

[有问必答] cJSON接收解析多次后失败

[复制链接]

36

主题

142

回帖

255

积分

高级会员

积分
255
发表于 2018-1-11 16:22:28 | 显示全部楼层 |阅读模式
最近移植了cJSON代码作为数据交换,发现接收解析数据几十次后,就不能再解析数据。
增大堆栈都到十多K也不行。不知大家遇到过吗?谢谢!
回复

使用道具 举报

36

主题

142

回帖

255

积分

高级会员

积分
255
 楼主| 发表于 2018-1-11 16:42:48 | 显示全部楼层
本帖最后由 takent 于 2018-1-11 17:09 编辑

接收数据和格式是正确,就是不能解析了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107098
QQ
发表于 2018-1-12 12:48:30 | 显示全部楼层
不出意外是你动态内存分配问题,cJSON里面有个动态内存分配,使用要注意,用完了一定要记得释放。
回复

使用道具 举报

36

主题

142

回帖

255

积分

高级会员

积分
255
 楼主| 发表于 2018-1-12 14:47:08 | 显示全部楼层
我估计也是内存问题,已经用cJSON_Delete释放内存,暂时用原子内存管理,硬汉有CJSON例程吗
回复

使用道具 举报

2

主题

134

回帖

140

积分

初级会员

积分
140
发表于 2018-1-12 14:56:30 | 显示全部楼层
内存不够了吧  解析完之后记得释放内存   要不再多内存不够用
回复

使用道具 举报

2

主题

134

回帖

140

积分

初级会员

积分
140
发表于 2018-1-12 15:00:22 | 显示全部楼层
root = cJSON_Parse(message_body);
    if(root != NULL)
    {      
        
        pSub = cJSON_GetObjectItem(root, "billId");
        if(pSub != NULL)
        {         
                                    
        pSub = cJSON_GetObjectItem(root, "time");
        if(pSub != NULL)
        {
            if(MQTT_Debug_EN)
                printf("time:%lld\r\n", pSub->valueint);
        }
  }
cJSON_Delete(root);


/*********************修改cJson内存为外部sdram内存*******************/
void cJSON_InitHooks(cJSON_Hooks* hooks)
{
    if (!hooks) { /* Reset hooks */
        cJSON_malloc = SRAMEXmalloc;
        cJSON_free = SRAMEXfree;
        return;
    }

        cJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:SRAMEXmalloc;
        cJSON_free         = (hooks->free_fn)?hooks->free_fn:SRAMEXfree;
}


回复

使用道具 举报

36

主题

142

回帖

255

积分

高级会员

积分
255
 楼主| 发表于 2018-1-13 16:00:35 | 显示全部楼层
已解决,确实内存问题。看CJSON官方教程,即使遇到(root == NULL)仍然要cJSON_Delete(root)
网上大部分遇到(root == NULL)则直接return,是没释放内存,楼上也是OK的,谢谢大家!
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2018-1-17 10:41:39 | 显示全部楼层
内存申请不要用原子的my_free和my_mallco,

static void *(*cJSON_malloc)(size_t sz) =malloc;
static void (*cJSON_free)(void *ptr) =free;

我之前也测试过,使用原子的内存管理测试60来条指令就不行,但是使用正常的这个测试了1天没有什么问题,你可以试试
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2018-1-17 10:44:33 | 显示全部楼层
堆栈也要适当增加一些,我现在的一个项目就一直这么用的,和上午通讯没有什么问题,希望对你有帮助
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-17 10:15 , Processed in 0.330572 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表