FreeRTOS使用cJSON 芯片是STM32F1

请问大家有没有FreeRTOS使用cjson的程序?
我的程序只要调用cjson,FreeRTOS就会报
Error:..\FreeRTOS\portable\MemMang\heap_4.c,292
Error:..\FreeRTOS\portable\MemMang\heap_4.c,293
cJSON的内存管理也重定向到了
接受有偿

试一下这一个方法

https://blog.csdn.net/u010058695/article/details/118156884

FreeRTOS和cJSON是两个独立的库,通常来说是可以在FreeRTOS系统中使用cJSON的。

如果在使用cJSON时遇到了内存管理相关的错误,有可能是cJSON的内存管理函数与FreeRTOS的内存管理函数冲突了。这种情况下,可以尝试重定向cJSON的内存管理函数到FreeRTOS的内存管理函数,以避免冲突。

具体来说,可以在使用cJSON之前,调用cJSON_Hooks函数来设置cJSON的内存管理函数。例如:

cJSON_Hooks hooks;
hooks.malloc_fn = pvPortMalloc; // 重定向cJSON的malloc函数到FreeRTOS的pvPortMalloc函数
hooks.free_fn = vPortFree; // 重定向cJSON的free函数到FreeRTOS的vPortFree函数
cJSON_InitHooks(&hooks);

这样cJSON就会使用FreeRTOS的内存管理函数进行内存分配和释放,避免了冲突。

看下这个实例思路【基于STM32的FreeRTOS下使用cJSON库的坑】,链接:https://blog.csdn.net/flikyly/article/details/102835577

FreeRTOS的内存管理函数上,可能是因为cJSON和FreeRTOS的内存管理函数冲突导致的。

可以试试在使用cJSON之前,暂时关闭FreeRTOS的内存管理功能,然后再使用cJSON。可以使用FreeRTOS的宏定义configSUPPORT_DYNAMIC_ALLOCATION来控制是否启用FreeRTOS的内存管理功能。

如果想在FreeRTOS中使用cJSON,可以试试使用FreeRTOS的内存管理函数来代替cJSON的内存管理函数。可以使用FreeRTOS的内存管理函数来替换cJSON中的malloc、realloc、calloc和free函数。

例如可以使用FreeRTOS的pvPortMalloc函数来替换cJSON中的malloc函数,使用vPortFree函数来替换cJSON中的free函数。可以参考FreeRTOS官方文档来了解FreeRTOS的内存管理函数的使用方法。
望采纳。

望采纳!!点击该回答右侧的“采纳”按钮即可采纳!
FreeRTOS 的堆内存管理函数上,导致内存分配错误。

解决方法是,在调用 cJSON 函数之前,先手动将 cJSON 的内存管理函数指向 FreeRTOS 的堆内存管理函数,

cJSON_Hooks hooks;
hooks.malloc_fn = pvPortMalloc;
hooks.free_fn = vPortFree;
cJSON_InitHooks(&hooks);


然后再调用 cJSON 的函数就不会出错了。

下面是一个使用 cJSON 在 FreeRTOS 中解析 JSON 字符串的示例程序:



#include "cjson.h"
#include "FreeRTOS.h"
#include "task.h"

void json_task(void *pvParameters)
{
    char *json_str = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";
    cJSON *json = cJSON_Parse(json_str);

    if (json == NULL) {
        printf("Error parsing JSON string\n");
        return;
    }

    char *name = cJSON_GetObjectItem(json, "name")->valuestring;
    int age = cJSON_GetObjectItem(json, "age")->valueint;
    char *city = cJSON_GetObjectItem(json, "city")->valuestring;

    printf("name: %s, age: %d, city: %s\n", name, age, city);

    cJSON_Delete(json);
    vTaskDelete(NULL);
}

int main(void)
{
    cJSON_Hooks hooks;
    hooks.malloc_fn = pvPortMalloc;
    hooks.free_fn = vPortFree;
    cJSON_InitHooks(&hooks);

    xTaskCreate(json_task, "json_task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
    vTaskStartScheduler();

    return 0;
}


```

基于STM32的FreeRTOS下使用cJSON库的坑
借鉴下
https://blog.csdn.net/flikyly/article/details/102835577