嵌入式开发中用于调试的技术Semihosting

Semihosting是嵌入式开发中用于调试的技术,允许程序通过调试器与主机通信,实现输入输出操作。在Keil环境中使用printf等函数时,若程序无法运行,通常与Semihosting配置有关。 ‌

问题原因

当在Keil中启用标准C库(未使用MicroLIB)并调用printf时,编译器会默认启用Semihosting功能。该功能通过SVC/BKPT指令与调试器交互,若初始化失败(如调试环境未连接或配置错误),程序会停止执行。 ‌

解决方案

使用MicroLIB库‌

在Keil工程设置中勾选"Use MicroLIB"选项,可避免启用Semihosting。 ‌

若不使用MicroLIB,需通过以下方式禁用Semihosting:

添加编译器指令#pragma import(__use_no_semihosting)到代码中 ‌‌

定义必要函数(如:ml-search-more[_ttywrch]{text="嵌入式 _ttywrch函数"})以兼容Semihosting调用 ‌‌

重定向输出‌

若需保留printf功能,可重定向到串口:

定义fputc函数:int fputc(int ch, FILE *f) { uart_send_char(ch); return ch; } ‌‌

配置串口驱动(如FlexIO或FLEXCOMM) ‌‌

注意事项

Semihosting仅在调试阶段启用,发布产品时需完全关闭以避免性能损耗。 ‌‌

使用:ml-search-more[CMSIS]{text="CMSIS"}或:ml-search-more[CMSIS-Compiler pack]{text="CMSIS-Compiler pack"}可简化配置,避免手动修改代码。 ‌‌

相关推荐
宵时待雨1 天前
STM32笔记归纳8:时钟
笔记·stm32·单片机·嵌入式硬件
JJRainbow1 天前
SN75176 芯片设计RS-232 转 RS-485 通信模块设计原理图
stm32·单片机·嵌入式硬件·fpga开发·硬件工程
花月mmc1 天前
CanMV K230 波形识别——整体部署(4)
人工智能·python·嵌入式硬件·深度学习·信号处理
宁静致远20211 天前
STM32模拟IIC读取PCF8563
stm32·单片机·嵌入式硬件
三佛科技-134163842121 天前
宠物洗澡打泡机方案,宠物泡泡机MCU方案开发设计分享
单片机·嵌入式硬件·物联网·智能家居·pcb工艺·宠物
芯岭技术1 天前
低成本315/433M接收芯片 XL420 SOP8封装,支持 1527 等常见 OOK编码
单片机·嵌入式硬件
Wangshanjie_981 天前
【通讯协议】-01、Modbus协议
单片机·信息与通信
听风吹雨yu1 天前
STM32F407-MD5码计算/Digest认证计算
stm32·单片机·嵌入式硬件
yugi9878381 天前
RN8302B电表芯片驱动开发指南(基于SPI通信)
驱动开发·单片机·嵌入式硬件
youcans_1 天前
【STM32-MBD】(15)Simulink 模型开发之三相互补 PWM
stm32·单片机·嵌入式硬件·matlab·foc