基于STM32的FreeRTOS下使用cJSON库的坑

在STM32F1系列芯片的FreeRTOS系统上使用cJSON库解析JSON数据时遇到问题,由于cJSON库内部使用malloc/free进行内存管理,与FreeRTOS的pvPortMalloc/vPortFree不兼容,导致解析长数据时返回空指针。通过定义cJSON_Hooks结构体并替换内存管理函数为FreeRTOS的函数,解决了内存申请失败的问题。确保任务栈大小足够,并使用cJSON_Delete释放资源。
摘要由CSDN通过智能技术生成

使用场景

项目中使用stm32f1系列芯片+FreeRTOS系统,需要解析json格式数据。

问题

在网上找到了cJson库,cJson库相对来说还是比较简单方便的,具体怎么用的,网上很多介绍,这里说一下遇到的问题:
直接引用头文件,把c文件加入工程,编译使用,但在解析某些数据的时候直接返回空指针,如下:

root = cJSON_Parse((char*)source);
    if(root==cJSON_Invalid)
	{
		//报错
	}

直接报错,有些时候又正常。后来发现跟数据长度有关,长的会报错,短的不会。所以马上想到是因为内存申请不够的原因,后面分析cJson的代码发现,它申请和释放内存是直接调用的C的标准函数malloc和free,但我们在FreeRTOS里面的内存申请和释放是要用pvPortMalloc和vPortFree的,因为FreeRTOS 的pvPortMalloc 和 C的标准函数malloc的区别是:pvPortMalloc是从configTOTAL_HEAP_SIZE中申请内存,而malloc是直接从SRAM 堆 中申请内存,是和全局变量一个地位。我们在定义操作系统的时候已经把堆占得差不多了,所以自然申请不了多少就不够用了。

解决方案

其实cJson也给出了解决方案,只是我没注意,在它的头文件中有定义:结构体cJSON_Hooks和函数cJSON_InitHooks,用这两个就可以把我们的pvPortMalloc和vPortFree函数指针替换它原来的申请和释放内存了。具体

cjson是一个轻量级的JSON解析器和生成器。它适用于嵌入式系统,特别是在FreeRTOS实时操作系统中使用。 cjson是一个简单且易于使用,因此它在FreeRTOS中得到了广泛的应用。它提供了一组函数,可以将JSON字符串解析为一个C语言中的对象,或者将C语言对象转换为JSON字符串。这些功能非常有用,可以在嵌入式系统中处理JSON数据。 使用cjson,我们可以轻松地解析和生成JSON数据。例如,我们可以使用cjson将传感器数据以JSON格式发送到远程服务器。在服务器端,可以使用cjson将该JSON数据解析为对象,以便进行进一步的处理和分析。 另外,cjson还提供了一些功能,可以让我们在C语言中方便地访问JSON数据。例如,我们可以通过cjson获取JSON对象的键值对,或者在JSON数组中遍历元素。这些功能对于处理复杂的JSON数据结构非常有帮助。 在FreeRTOS使用cjson并不复杂。我们只需要将cjson的源文件添加到FreeRTOS项目中,并在需要的地方包含相应的头文件。然后,我们就可以调用cjson中的函数来解析和生成JSON数据。 总之,cjson是一个非常实用的组件,它为嵌入式系统中处理JSON数据提供了便利。使用cjson,可以轻松地解析和生成JSON数据,并且可以方便地在C语言中访问JSON数据的各个部分。在FreeRTOS使用cjson可以提高开发效率并简化代码实现。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值