当前位置: 首页 > article >正文

KEIL开发中遇到__use_no_semihosting报错?3种解决方法实测有效

KEIL开发中__use_no_semihosting报错的深度解析与实战解决方案在嵌入式开发领域KEIL作为一款广受欢迎的集成开发环境为开发者提供了强大的工具链支持。然而当我们在项目中使用MicroLiB库时偶尔会遇到一个令人头疼的编译错误__use_no_semihosting was requested, but _ttywrch was referenced。这个错误看似简单实则涉及到KEIL底层库的工作机制和嵌入式系统的输入输出重定向原理。本文将深入剖析这一问题的根源并提供三种经过实际验证的解决方案帮助开发者快速定位并解决问题。1. 理解报错的本质原因在深入解决方案之前我们需要先理解这个错误信息的含义。当编译器提示__use_no_semihosting was requested, but _ttywrch was referenced时实际上是在告诉我们一个矛盾的情况代码中既声明了不使用半主机模式(__use_no_semihosting)又引用了半主机模式下的函数(_ttywrch)。半主机模式(Semihosting)是ARM架构提供的一种机制允许目标设备通过调试接口使用主机(如PC)的输入输出功能。这在开发初期非常有用因为它不需要在目标硬件上实现完整的输入输出驱动。然而半主机模式有以下显著缺点性能影响每次IO操作都需要与调试器通信速度较慢依赖性必须连接调试器才能正常工作资源占用会增加代码体积MicroLiB是KEIL提供的一个精简C库专为资源受限的嵌入式系统设计。与标准C库相比它有以下特点特性MicroLiB标准C库代码大小小(~20KB)大(~100KB)功能完整性精简完整半主机支持可选默认依赖内存需求低较高当我们在代码中使用printf等标准IO函数时如果选择了不使用半主机模式就必须提供这些函数在目标硬件上的具体实现否则就会出现上述编译错误。2. 解决方案一启用MicroLiB库最简单的解决方法是直接启用MicroLiB库。这种方法适合那些对代码大小有严格要求且不需要复杂标准库功能的项目。具体操作步骤打开KEIL MDK开发环境在Project窗口中右键点击目标项目选择Options for Target在弹出的对话框中选择Target选项卡在Code Generation区域勾选Use MicroLIB选项点击OK保存设置重新编译项目注意启用MicroLiB后某些标准库功能可能不可用。如果项目中使用了这些功能可能需要调整代码。这种方法的主要优点是简单直接不需要修改任何代码。但它有以下限制某些标准C库功能不可用浮点数格式化支持有限可能影响与其他库的兼容性3. 解决方案二添加必要的支持代码如果你因为各种原因不能或不想使用MicroLiB那么可以通过添加必要的支持代码来解决这个问题。这种方法提供了更大的灵活性同时避免了半主机模式的开销。完整实现方案#pragma import(__use_no_semihosting) // 标准库需要的支持结构体 struct __FILE { int handle; }; FILE __stdout; // 定义_sys_exit()以避免使用半主机模式 void _sys_exit(int x) { x x; } // 重定义fputc函数实现串口输出 int fputc(int ch, FILE *f) { while((USART2-SR 0X40) 0); // 等待发送缓冲区空 USART2-DR (uint8_t)ch; // 发送字符 return ch; } // 实现_ttywrch函数避免链接错误 void _ttywrch(int ch) { while((USART2-SR 0X40) 0); // 等待发送缓冲区空 USART2-DR (uint8_t)ch; // 发送字符 }这段代码完成了以下几个关键任务明确声明不使用半主机模式(__use_no_semihosting)提供了标准IO需要的__FILE结构体和__stdout实例实现了_sys_exit空函数以满足库的要求重定义了fputc函数将输出重定向到USART2实现了_ttywrch函数解决原始报错问题关键点解析fputc是标准库中用于字符输出的底层函数printf等高级函数最终会调用它_ttywrch是调试相关的字符输出函数通常用于错误消息输出USART2的访问需要根据实际硬件进行调整发送前的忙等待(while循环)可以替换为更高效的DMA传输4. 解决方案三完全自定义IO实现对于追求极致控制和性能的项目我们可以完全抛弃标准库的IO机制实现自己的打印函数。这种方法虽然工作量大但能带来最好的性能和最小的代码体积。自定义printf实现示例#include stdarg.h void my_printf(const char *fmt, ...) { va_list args; va_start(args, fmt); while (*fmt) { if (*fmt %) { fmt; switch (*fmt) { case d: { int val va_arg(args, int); // 实现整数转字符串并发送 break; } case s: { char *str va_arg(args, char*); while (*str) { USART2_SendChar(*str); } break; } // 添加更多格式支持... } } else { USART2_SendChar(*fmt); } fmt; } va_end(args); } void USART2_SendChar(char ch) { while((USART2-SR 0X40) 0); USART2-DR (uint8_t)ch; }这种方法的优势包括完全控制功能实现只包含需要的功能最小的代码体积和最优的性能不依赖任何库兼容性最好但缺点也很明显需要自行实现所有格式化功能工作量大容易引入错误缺乏标准化可能影响代码可移植性5. 方案比较与选择建议为了帮助开发者选择最适合的解决方案我们对三种方法进行了全面比较评估维度启用MicroLiB添加支持代码完全自定义实现难度非常简单中等复杂代码体积较小中等最小功能完整性有限完整自定义性能一般较好最优维护成本低中等高移植性依赖KEIL较好最好选择建议对于快速原型开发和小型项目启用MicroLiB是最简单快捷的方案对于需要标准库功能的中大型项目添加支持代码提供了最佳平衡对于资源极其有限或性能要求极高的项目完全自定义IO是最佳选择在实际项目中我们还需要考虑团队的技术栈、项目的长期维护计划以及硬件资源限制等因素。例如如果项目需要跨平台移植那么避免使用KEIL特有的MicroLiB可能是更好的选择。

相关文章:

KEIL开发中遇到__use_no_semihosting报错?3种解决方法实测有效

KEIL开发中__use_no_semihosting报错的深度解析与实战解决方案 在嵌入式开发领域,KEIL作为一款广受欢迎的集成开发环境,为开发者提供了强大的工具链支持。然而,当我们在项目中使用MicroLiB库时,偶尔会遇到一个令人头疼的编译错误&…...

黑丝空姐-造相Z-Turbo部署排错指南:解决403 Forbidden等网络问题

黑丝空姐-造相Z-Turbo部署排错指南:解决403 Forbidden等网络问题 最近在星图GPU平台上部署“黑丝空姐-造相Z-Turbo”这个AI图像生成镜像时,不少朋友都卡在了网络访问这一步。最常见的就是启动应用后,浏览器里弹出一个冷冰冰的“403 Forbidde…...

避开虚高分数线陷阱:手把手教你评估北理工计算机考研真实难度

避开虚高分数线陷阱:北理工计算机考研真实难度评估指南 每年考研季,总有一批考生被名校"看似友好"的复试线所吸引,却忽略了实际录取的隐形门槛。北京理工大学计算机专业近年来复试线波动明显,特别是专硕分数线表面下降的…...

SparkFun OWire LED控制库:两线制RGB灯效驱动原理与实践

1. 项目概述SparkFun OWire Arduino Library 是一款专为“OWire”(One-Wire,但需注意:此非 Dallas/Maxim 标准 1-Wire 协议,而是 SparkFun 自定义的 2 线制 LED 控制协议)或称“0-Wire”LED 设计的轻量级嵌入式控制库。…...

Mac用户必看:解决VMware Fusion高版本虚拟机在降级系统后无法打开的3个技巧

Mac用户必看:解决VMware Fusion高版本虚拟机在降级系统后无法打开的3个技巧 作为一名长期使用Mac进行开发和测试的技术人员,我深知虚拟机环境对于工作流程的重要性。然而,当我们在macOS系统降级后,经常会遇到一个令人头疼的问题&a…...

GPEN在证件照制作中的应用:快速美化人像,提升专业度

GPEN在证件照制作中的应用:快速美化人像,提升专业度 1. 为什么你需要一个专业的证件照工具? 你有没有过这样的经历?明天就要交简历或者办证件了,翻遍手机相册,却找不到一张能用的照片。要么是光线太暗&am…...

CLAP音频分类控制台实战:构建自动化音频质检流水线(ASR预过滤+CLAP语义校验)

CLAP音频分类控制台实战:构建自动化音频质检流水线(ASR预过滤CLAP语义校验) 1. 项目概述 CLAP音频分类控制台是一个基于LAION CLAP模型构建的交互式音频分类应用。这个工具最大的特点是无需针对特定类别重新训练模型,只需要输入…...

Janus-Pro-7B惊艳效果:建筑图纸要素识别+施工要点结构化提取

Janus-Pro-7B惊艳效果:建筑图纸要素识别施工要点结构化提取 1. 模型效果惊艳展示 Janus-Pro-7B在多模态理解领域展现出了令人印象深刻的能力,特别是在建筑图纸识别和施工信息提取方面。这个模型能够准确识别建筑图纸中的各种要素,并将复杂的…...

手机玩转Linux数据分析:Termux中Bash脚本读取txt文件并计算平均值的避坑指南

手机玩转Linux数据分析:Termux中Bash脚本读取txt文件并计算平均值的避坑指南 在移动互联网时代,手机已经不仅仅是通讯工具,更成为了便携式生产力设备。对于数据分析初学者来说,Termux这款Android终端模拟器提供了一个绝佳的Linux学…...

PP-DocLayoutV3模型蒸馏实践:基于Transformer的小型化方案

PP-DocLayoutV3模型蒸馏实践:基于Transformer的小型化方案 最近在做一个文档智能处理的项目,客户那边对性能要求挺高,但给的硬件资源又比较有限,服务器上跑不动太大的模型。这让我想起了之前用过的PP-DocLayoutV3,它在…...

纯CPU环境福音!CosyVoice-300M Lite语音合成服务搭建教程

纯CPU环境福音!CosyVoice-300M Lite语音合成服务搭建教程 1. 为什么选择CosyVoice-300M Lite 在资源受限的环境中部署语音合成服务一直是个挑战。传统TTS解决方案通常需要高性能GPU和大量存储空间,这让许多开发者望而却步。CosyVoice-300M Lite正是为解…...

告别‘炼丹’:手把手教你用Stable-Baselines3调参,让强化学习轨迹规划训练更稳定

深度强化学习实战:用Stable-Baselines3解决轨迹规划中的训练难题 当你在CARLA仿真环境中反复调整PPO算法的超参数,却看到奖励曲线像心电图一样上下波动时,是否怀疑自己更像是在"炼丹"而非做工程?这种挫败感正是许多强化…...

Qwen-Image RTX4090D镜像多场景验证:覆盖12类真实业务图像理解需求

Qwen-Image RTX4090D镜像多场景验证:覆盖12类真实业务图像理解需求 1. 开箱即用的视觉语言模型推理环境 当我们需要快速验证一个视觉语言模型在实际业务中的表现时,最头疼的往往是环境配置问题。不同版本的CUDA、PyTorch、驱动之间的兼容性问题常常让人…...

YOLOE官版镜像5分钟快速上手:零基础部署开放词汇表检测模型

YOLOE官版镜像5分钟快速上手:零基础部署开放词汇表检测模型 你是不是经常遇到这样的问题:想用AI识别图片里的东西,但模型只能认识训练过的那些类别?比如训练时只有“猫、狗、人”,它就不认识“长颈鹿”或者“无人机”…...

5分钟搞定:在x86_64上运行ARM64 Docker镜像的保姆级教程(附常见错误排查)

5分钟搞定:在x86_64上运行ARM64 Docker镜像的保姆级教程(附常见错误排查) 最近在帮朋友调试一个ARM架构的容器应用时,发现他的开发机是x86_64平台。本以为直接docker run就能搞定,结果遇到了经典的"exec格式错误&…...

AudioSeal Pixel Studio代码实例:调用audioseal_wm_16bits模型API详解

AudioSeal Pixel Studio代码实例:调用audioseal_wm_16bits模型API详解 1. 专业级音频水印工具介绍 AudioSeal Pixel Studio 是一款基于Meta开源的AudioSeal算法构建的音频保护与检测工具。它能在几乎不影响音质的情况下,为音频添加隐形的数字水印&…...

Alpamayo-R1-10B部署教程:远程服务器IP替换与防火墙端口开放指南

Alpamayo-R1-10B部署教程:远程服务器IP替换与防火墙端口开放指南 1. 项目概述 Alpamayo-R1-10B是专为自动驾驶研发设计的开源视觉-语言-动作(VLA)模型系统,由100亿参数核心模型、AlpaSim模拟器和Physical AI AV数据集组成完整工具链。该系统通过类人因…...

5分钟快速集成指南:使用PayJS Golang SDK轻松实现个人支付收款

5分钟快速集成指南:使用PayJS Golang SDK轻松实现个人支付收款 【免费下载链接】payjs 个人支付收款解决方案PayJS的Golang版本SDK 项目地址: https://gitcode.com/gh_mirrors/pa/payjs 想要为你的Go项目快速接入微信支付和支付宝支付功能吗?PayJ…...

Freetronics LCD Shield底层驱动与STM32/FreeRTOS移植指南

1. Freetronics LCD Shield 底层驱动技术解析Freetronics LCD Shield 是一款面向 Arduino 生态的低成本、即插即用型字符液晶显示扩展板,广泛应用于教学实验、原型验证及轻量级人机交互场景。该 Shield 基于 HD44780 兼容控制器(典型为 ST7066U 或 KS006…...

CEF4Delphi 实战宝典:从组件详解到高级应用开发

1. CEF4Delphi入门指南:为什么选择这个框架? 如果你正在寻找一个能在Delphi应用中嵌入现代浏览器功能的解决方案,CEF4Delphi绝对是你的首选。这个基于Chromium Embedded Framework(CEF)的组件库,让我在过去…...

Lingbot-Depth-Pretrain-ViTL-14 处理长尾分布场景效果:夜间、雨雾及低纹理区域

Lingbot-Depth-Pretrain-ViTL-14 处理长尾分布场景效果:夜间、雨雾及低纹理区域 深度估计,简单来说就是让计算机像人眼一样,判断出画面中每个物体离我们有多远。这项技术在自动驾驶、机器人导航、增强现实等领域至关重要。但现实世界并不总是…...

ELK vs EFK:如何选择最适合你的日志分析方案?

ELK vs EFK:架构师视角下的日志分析方案选型指南 当企业系统规模从几台服务器扩展到数百个节点时,日志管理就会从简单的文本查看演变为需要专业工具支撑的复杂工程。我曾见证过一家电商企业在促销活动期间,因为日志系统不堪重负而导致故障排查…...

M2LOrder效果展示:跨语言情感识别——中英日韩文本统一情绪分类实测

M2LOrder效果展示:跨语言情感识别——中英日韩文本统一情绪分类实测 1. 核心能力概览 M2LOrder情感识别系统是一个基于.opt模型文件的智能情绪分析服务,它最令人印象深刻的能力是跨语言情感识别。这个系统能够准确识别中文、英文、日文、韩文等多种语言…...

深入解析PCIE数据链路层:DL_Active与DL_UP状态机制及其应用

1. PCIe数据链路层基础概念 PCIe(Peripheral Component Interconnect Express)作为现代计算机系统中最重要的高速串行总线标准之一,其架构采用分层设计理念。数据链路层(Data Link Layer)作为承上启下的关键层级&#…...

新手必看:开关电源中正激和反激变压器的5个关键差异(附电路图解析)

开关电源设计实战:正激与反激变压器的深度对比与应用指南 在电源设计领域,正激和反激变压器就像两位性格迥异的工程师——一个直来直往,一个迂回巧妙。刚入行的硬件工程师常常会困惑:为什么看似相似的电路结构,在实际应…...

保姆级教程:Ollama+translategemma-27b-it,快速搭建本地图文翻译工具

保姆级教程:Ollamatranslategemma-27b-it,快速搭建本地图文翻译工具 1. 准备工作:环境与模型简介 1.1 为什么选择translategemma-27b-it translategemma-27b-it是Google基于Gemma 3架构开发的开源翻译模型,专为多模态翻译任务优…...

51单片机一主多从通信系统设计与实现

1. 51单片机一主多从通信系统概述 第一次接触51单片机多机通信时,我也被各种专业术语搞得一头雾水。简单来说,一主多从通信就像老师(主机)和多个学生(从机)的课堂互动。老师可以点名特定学生回答问题&#…...

3大核心革新:Screenbox如何重新定义Windows媒体播放体验

3大核心革新:Screenbox如何重新定义Windows媒体播放体验 【免费下载链接】Screenbox LibVLC-based media player for the Universal Windows Platform 项目地址: https://gitcode.com/gh_mirrors/sc/Screenbox 在数字媒体日益丰富的今天,Windows用…...

实时数据目录技术:应对大数据流处理的挑战

实时数据目录技术:应对大数据流处理的挑战 一、引言:当“实时”成为刚需,我们却卡在了“找数据”上 去年双11零点,我在某电商公司的监控大屏前目睹了一场“惊魂时刻”: 实时推荐系统突然宕机——原因是负责用户行为流的Kafka Topic悄悄新增了一个字段,而Flink处理作业的…...

【Unity】跨平台本地推送 Mobile Notifications 实战指南

1. 为什么需要跨平台本地推送? 在移动应用开发中,推送通知是最直接的触达用户方式之一。想象一下,你正在开发一款健身应用,需要提醒用户"该运动了";或者是一款游戏,想要告诉玩家"限时活动开…...