[开发工具] 调用 printf 之后报错

[复制链接]
34|15
封存into 发表于 2026-7-16 16:24 | 显示全部楼层 |阅读模式
我用 STM32CubeIDE调用 printf 之后,在newlib_lock_glue.c内的函数触发断言,跳入 main.c 中的Error_Handler。
出错位置:
__retarget_lock_acquire_recursive(_LOCK_T lock)
{
STM32_LOCK_BLOCK_IF_NULL_ARGUMENT(lock); // 该行触发,进入Error_Handler
stm32_lock_acquire(STM32_LOCK_PARAMETER(lock));
}
我切换工具链版本:
GNU Tools 10.3-2021.10(旧版):printf 一切正常
GNU Tools 11.3.rel1(CubeIDE 1.13.1 默认新版):出现上面的崩溃
请问在新版 GNU 工具链中如何规避这个问题?

今天会画卧蚕吗 发表于 2026-7-17 15:53 | 显示全部楼层
换回旧版工具链就能用,说明新版工具链的libc实现变了,你的代码没跟上。
elephant00 发表于 2026-7-17 15:55 | 显示全部楼层
如果用了FreeRTOS,需要实现__retarget_lock_*系列函数,把锁映射到RTOS的信号量。
classroom 发表于 2026-7-17 16:25 | 显示全部楼层
__retarget_lock_acquire_recursive这个函数是给多线程用的,你开了多线程支持但没提供锁的实现
cr315 发表于 2026-7-17 16:57 | 显示全部楼层
STM32CubeIDE默认新版工具链开启了多线程兼容,但你的工程配置还是单线程模式。
duo点 发表于 2026-7-17 17:28 | 显示全部楼层
在编译选项里加--specs=nosys.specs可以绕过这个锁相关的实现。
flycamelaaa 发表于 2026-7-17 18:10 | 显示全部楼层
Error_Handler触发说明断言失败,lock参数传进来是NULL,系统没初始化就调了printf。
jcky001 发表于 2026-7-17 18:42 | 显示全部楼层
printf在main之前被调用了,比如在全局变量的构造函数里,此时锁还没初始化。
onlycook 发表于 2026-7-17 19:13 | 显示全部楼层
新版newlib把锁的初始化延迟了,你需要在系统启动早期手动调用__retarget_lock_init。
powerantone 发表于 2026-7-17 19:46 | 显示全部楼层
不用多线程的话,在链接脚本里把所有__retarget_lock_*函数重定向为空函数。
probedog 发表于 2026-7-17 20:20 | 显示全部楼层
CubeIDE的工程设置里有个"Use float with printf from newlib"选项,勾选状态会影响链接的libc版本。
solty 发表于 2026-7-17 20:57 | 显示全部楼层
检查启动文件里的__libc_init_array是否被正确调用,锁初始化依赖这个。
stormwind123 发表于 2026-7-17 21:30 | 显示全部楼层
把printf换成它底层的_write函数直接输出,绕过整个stdio锁机制。
七毛钱 发表于 2026-7-17 22:10 | 显示全部楼层
旧版能用是因为它是用--specs=nano.specs编译的,新版你忘了加这个参数。
今天会画卧蚕吗 发表于 2026-7-17 22:42 | 显示全部楼层
这个锁是用于线程安全的,单线程裸机程序根本不需要,配置成"nosys"就能禁用。
内政奇才 发表于 2026-7-17 22:59 | 显示全部楼层
在syscalls.c里提供空的__retarget_lock_acquire_recursive实现,别让它调用断言。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

205

主题

263

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0