关于stm32报错Library reports error: __use_no_semihosting was requested

这几天在做个地下停车场管理系统,用到了正点原子的usmart组件
编译时候报错..
Library reports error: __use_no_semihosting was requested, but _ttywrch was referenced

在usart.c文件的

_sys_exit(int x) 
{ 
    x = x; 
} 

大约47行后面加入

//__use_no_semihosting was requested, but _ttywrch was 
_ttywrch(int ch)
{
ch = ch;
}

即可解决问题

### 编译错误 L6915E 的原因分析 在使用 ARM 编译器时,如果禁用了半主机模式(semi-hosting),可能会触发类似的链接错误 `L6915E`。具体来说,当项目请求启用标志 `__use_no_semihosting` 后,仍然存在对某些标准库函数的调用(如 `_ttywrch` 或时间相关的函数),这会导致链接阶段报告未解析符号的问题。 #### 错误的核心原因 该问题的根本原因是,在关闭半主机模式的情况下,ARM 编译器不再提供默认实现的标准 C 库功能[^2]。因此,任何依赖于这些功能的代码都需要开发者手动重新定义相应的接口函数。 --- ### 解决方案 为了消除此错误并成功完成编译过程,需采取以下措施: #### 1. 手动重写必要的标准库函数 对于 `_ttywrch` 函数,可以通过自定义其实现来解决问题。以下是推荐的实现方式: ```c int _ttywrch(int ch) { // 如果不需要实际输出字符,则可以直接返回输入值 (void)ch; return ch; } ``` 此外,还需要定义其他可能被引用到的相关函数,例如 `_sys_exit()`,用于处理程序退出逻辑: ```c void _sys_exit(int x) { // 防止警告:变量未使用的提示 (void)x; // 可在此处添加额外的清理操作或其他行为 while (1); // 进入死循环以停止运行 } ``` 以上两段代码应放置在一个 `.c` 文件中,并确保其包含在整个项目的构建过程中[^2]。 #### 2. 替代时间相关函数的时间管理机制 由于禁用半主机模式可能导致无法访问基于操作系统的服务(如获取当前时间和日期的功能),建议采用硬件定时器作为替代解决方案。例如,利用 Cortex-M 微控制器中的 SysTick 定时器或外部计数模块实现精确的时间测量。 下面是一个简单的例子展示如何通过 HAL 库初始化和读取系统滴答计数值: ```c #include "stm32f4xx_hal.h" // 初始化SysTick定时器 void MX_SysTick_Init(void) { HAL_SYSTICK_Config(SystemCoreClock / 1000); // 设置每毫秒中断一次 } uint32_t GetElapsedTimeMs(void) { static uint32_t lastTickCount = 0; uint32_t currentTickCount = HAL_GetTick(); if (currentTickCount < lastTickCount) { // 处理溢出情况 return UINT32_MAX - lastTickCount + currentTickCount; } return currentTickCount - lastTickCount; } ``` 注意:上述代码片段适用于 STM32F4 系列微控制器及其配套的 HAL 库;如果是 AT91SAM7X 平台,则需要调整为对应的寄存器级操作或者查阅官方文档找到适合的方法[^3]。 #### 3. 修改链接脚本排除冲突项 有时即使提供了所有必需的支持函数仍会遭遇类似问题,此时可尝试编辑链接描述文件(`.sct` 或者 `.ld` 格式),显式指定忽略特定节区的内容。比如增加如下指令至适当位置: ```assembly --remove-section .ARM.exidx.* --gc-sections ``` 这样做的目的是让链接器自动移除那些无用的部分从而减少潜在干扰因素的存在几率。 --- ### 总结说明 综上所述,针对因设置选项 `__use_no_semihosting` 而引发的一系列编译期异常状况,最有效的办法是从源头出发——即自行补充缺失的基础服务组件的同时优化整体架构设计思路以便更好地适应目标平台特性需求。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值