请问大家有没有FreeRTOS使用cjson的程序?
我的程序只要调用cjson,FreeRTOS就会报
Error:..\FreeRTOS\portable\MemMang\heap_4.c,292
Error:..\FreeRTOS\portable\MemMang\heap_4.c,293
cJSON的内存管理也重定向到了
接受有偿
试一下这一个方法
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