硬汉嵌入式论坛

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

[μCOS-III] cJSON_PrintUnformatted调试坎坷经历【经验分享】

[复制链接]

28

主题

130

回帖

214

积分

高级会员

积分
214
发表于 2023-8-13 00:15:54 | 显示全部楼层 |阅读模式
本帖最后由 logo 于 2023-8-13 00:24 编辑

一直在裸机上使用cJSON_PrintUnformatted这个函数没有什么问题,最近在UCOS III上使用这个函数发现异常。异常表现为key对应的value值会变成小数点后有很多位数的浮点数。
1,一开始怀疑可能是单片机内存不够了,导致内存里的数据混乱了。于是注释掉一些非必须部分的代码发现问题可以得到解决。看来还真是内存不够引起的问题?
2,起初以为是多次调用cJSON相关的函数导致内存泄漏,以为是动态内存分配malloc导致内存碎片导致内存不够的问题,于是开始使用mymalloc这样的函数替代,但依然不行。看来好像也不是这里的问题。
3,那该怎么办呢,注释掉的代码将来也是必须要使用的,于是我开始优化程序代码,比如把存放数据的数组适当改小。虽然数组改小了,但是依然不行,也不能全部全部注释掉,于是我尝试开始编译器优化选项。经过测试发现这种方法的确管用。并且我发现只需要设置Size - Static clustering就可以了。

微信截图_20230812234433.jpg
4,但究竟什么是什么原因呢,后来经过单步跟踪代码终于发现问题出在print_number函数中sprintf格式话输出浮点数这里。
5,以 sprintf浮点数  为关键字进行搜索 发现一篇文章 Sprintf格式化float型引发的问题! 引出了8字节对齐问题。
6,由于现在用的是UCOS于是我以  ucos sprintf、ucos字节对齐 为关键字进行搜索,于是发现大量的关于UCOS字节对齐相关的问题讨论。
7,最后的解决方法站内就有,参考的这个链接现在网上各种uCOS的移植工程,没有把握住栈空间8字节对齐的精髓
微信截图_20230813002346.jpg

从发现异常到现在解决这个问题,用了将近两天时间。学习的道路上真是好多坑啊,分享给后来的人,这个算是宝贵的调试经验。让后来人少走弯路。


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-8-13 09:53:34 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 06:54 , Processed in 0.156173 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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