STM32
直播中

周棠亨

7年用户 1047经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

使用stm32h745zi-q nucleo开发板调试时,发现使用-specs=nano.specs时sscanf返回值错误,为什么?

使用STM32h745zi-q nucleo开发板调试时,发现使用-specs=nano.specs时sscanf返回值错误,使用标准c库时返回值正确,但内存溢出了,请教如何查找问题。

回帖(2)

石栓成

2024-4-1 15:41:21
我刚才使用 STM32CubeIde 基于cube库测试了下,可以正常输入输出的。


测试代码如下,很简单。


uint8_t buf15];


sscanf("123456TESTn", "%s", buf);


  printf("%srn", buf);


  sscanf("123456abcdedfBCDEF", "%1-9a-z]", buf);


  printf("%srn", buf);

我测试是可以的。
举报

h1654155272.9717

2024-4-1 16:53:53
使用 '-specs=nano.specs' 选项时,会链接使用新libnano.a库,替代了原来的libc.a,而libnano.a会对编译的库进行尺寸优化,包括一些内存管理方面的减少。sscanf在使用 '-specs=nano.specs' 选项时,返回值可能会出现错误,是因为该函数在读取字符串时,需要动态分配内存来存放读取的结果。使用libnano.a库中的版本进行编译时,可能会发生内存分配不足,导致返回值错误。

另外,当使用标准c库时,返回值正确但发生内存溢出问题,可能是因为你使用了太多的内存,超过了开发板的可用内存大小。这可能会导致内存溢出,破坏其他数据或引发其他错误。

为了解决问题,你可以尝试以下几点:

1. 尝试使用 '-specs=nosys.specs' 选项,该选项使用标准libc.a库,而不是libnano.a库,可能会解决sscanf返回值错误的问题。

2. 针对内存溢出问题,你可以检查是否有其他地方也在使用过多的内存。可以考虑使用动态内存分配函数(如malloc)来管理内存,确保分配的大小合适并及时释放内存。

3. 对代码进行逐步调试,定位到内存溢出问题发生的具体位置。可以使用调试工具(如GDB)来单步调试程序,监视变量的值,查找内存溢出的原因。

4. 如果仍然无法解决问题,可以考虑修改代码逻辑,减少内存使用量,优化代码结构,提高内存利用率。

最后,确保你的开发板设置正确,并且你的代码和库版本是兼容的,可以参考开发板和库的文档或官方论坛以获取更多的支持和指导。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分