打印
[STM32F1]

使用CJSON的时候掉进了HardFault_Handler

[复制链接]
1039|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
刚接触STM32F103的芯片,在使用cjson的时候遇到不知道为什么就掉进了HardFault_Handler,百度也只找到让查memory,也不懂得怎么看哪里出了问题,烦请各位大佬不吝指教(鞠躬),谢谢~

5.png (510.51 KB )

5.png

29.png (23.32 KB )

29.png

使用特权

评论回复
沙发
单片小菜| | 2020-9-14 18:14 | 只看该作者
你的指针乱了,我之前的时候,也遇到过这个问题,一个将启动的文件修改一下堆栈,另外,将编译后的文件看一下。

使用特权

评论回复
板凳
未成熟的小麦|  楼主 | 2020-9-15 10:23 | 只看该作者
单片小菜 发表于 2020-9-14 18:14
你的指针乱了,我之前的时候,也遇到过这个问题,一个将启动的文件修改一下堆栈,另外,将编译后的文件看一 ...

我已经把堆栈heap_size从原来的0x200修改到0x2000了还是出现这个问题

使用特权

评论回复
地板
yklstudent| | 2020-9-15 21:25 | 只看该作者
直接上代码,看你咋写的

使用特权

评论回复
5
未成熟的小麦|  楼主 | 2020-9-16 14:02 | 只看该作者
yklstudent 发表于 2020-9-15 21:25
直接上代码,看你咋写的

char buff[1024]= {0};
    char* rep;
    int rep_len;
    int len,i;

    cJSON *jsonpack = cJSON_CreateObject();
    cJSON *arraypack = cJSON_CreateArray();
    cJSON *datapack = cJSON_CreateObject();
    if(datapack == NULL)
    {
        if(datapack)
        {
            cJSON_Delete(datapack);

        }
        if(arraypack)
        {
            cJSON_Delete(arraypack);

        }
                if(jsonpack)
        {
            cJSON_Delete(jsonpack);

        }
        return;
    }
    if(arraypack == NULL)
    {
        delay_ms(1);
        if(datapack)
        {
            cJSON_Delete(datapack);

        }
        if(arraypack)
        {
            cJSON_Delete(arraypack);

        }
                if(jsonpack)
        {
            cJSON_Delete(jsonpack);

        }
        return;
    }
    if(jsonpack == NULL)
    {
        if(datapack)
        {
            cJSON_Delete(datapack);

        }
        if(arraypack)
        {
            cJSON_Delete(arraypack);

        }
                if(jsonpack)
        {
            cJSON_Delete(jsonpack);

        }
        delay_ms(1);
        return;
    }

    cJSON_AddStringToObject(datapack, "name", "IceA");
    cJSON_AddStringToObject(datapack, "m_id","123456");
    cJSON_AddStringToObject(datapack, "a_id", "");
    cJSON_AddNumberToObject(datapack, "price", 5);
    cJSON_AddNumberToObject(datapack, "num", 2);
    cJSON_AddNumberToObject(datapack, "subtotal", 10);

    cJSON_AddItemToArray(arraypack, datapack);




    cJSON_AddStringToObject(jsonpack, "id", "20200907090000000001");
    cJSON_AddStringToObject(jsonpack, "dev","34EAE7086A98");
    cJSON_AddStringToObject(jsonpack, "sec", temp3);
    cJSON_AddStringToObject(jsonpack, "state", "cancel");
    cJSON_AddStringToObject(jsonpack, "type", "0");
    cJSON_AddNumberToObject(jsonpack, "total", 10);
    cJSON_AddItemToObject(jsonpack, "data", arraypack);

    rep = cJSON_Print(jsonpack);
    rep_len = strlen(rep);
    uart2_sendstring(rep,rep_len);

    if(datapack)
    {
        cJSON_Delete(datapack);

    }
    if(arraypack)
    {
        cJSON_Delete(arraypack);

    }
    if(jsonpack)
    {
        cJSON_Delete(jsonpack);

    }
    if(rep)
    {
        free(rep);
        //rep = NULL;
    }

使用特权

评论回复
6
未成熟的小麦|  楼主 | 2020-9-16 14:04 | 只看该作者
本帖最后由 未成熟的小麦 于 2020-9-16 14:06 编辑
yklstudent 发表于 2020-9-15 21:25
直接上代码,看你咋写的

这段程序主要是创建了2个json对象,一个json数组,json对象A嵌套json数组,json数组再嵌套在json对象B里面,打印输出以后,删除创建的3个json。现在就卡在最后的cJSON_Delete(arraypack);那里

使用特权

评论回复
7
yklstudent| | 2020-9-17 19:34 | 只看该作者
if(datapack == NULL)
    {
        if(datapack)
        {
            cJSON_Delete(datapack);

        }
        if(arraypack)
        {
            cJSON_Delete(arraypack);

        }
                if(jsonpack)
        {
            cJSON_Delete(jsonpack);

        }
        return;
    }
这都写的啥代码,自己要好好想想啊

使用特权

评论回复
8
icecut| | 2020-9-17 19:47 | 只看该作者
字节数组容易触雷. 建议你二分法找到报错的语句. 或者查堆栈也可以.

arm的内存必须4字节一组进行读. 编译器优化不好,就不知道代码是否合规.

使用特权

评论回复
9
dalarang| | 2020-9-17 22:03 | 只看该作者
看得想吐槽
1、开局定义个1024深度的局部变量会爆栈的。
2、那前面那三个指针申请空间后跟着一坨判断的写法真是让人一言难尽啊,正常的做法是申请一个判断一个后再申请下一个,几句if嵌套一下就可以的楞让你写了一大坨。
CJOSN比较耗堆空间,注意堆不能太小。

我记得CJSON的DELETE会释放结构体下子所有子结构体申请的空间,按理说最后只需要cJSON_Delete(jsonpack)就可以了,cJSON_Delete(datapack)和cJSON_Delete(arraypack)应该是不用写了,具体记不清了你可以试一下。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

54

帖子

0

粉丝