Keil MDK中禁用半主机(No Semihosting)

ARM 编译器(如 Keil MDK) 中禁用半主机(Semihosting)并实现标准库的基本功能,需要以下步骤:


1. 禁用半主机

#pragma import(__use_no_semihosting)  // 禁用半主机模式
  • 作用:防止标准库函数(如 printfscanf)依赖调试器进行 I/O 操作。
  • 后果:必须手动实现底层函数(如 _sys_exitfputc),否则会链接失败。

2. 定义简化 FILE 结构体

struct __FILE {int handle;  // 占位符,无实际用途(可简化)
};
FILE __stdout, __stdin;  // 标准输入/输出流
  • 说明
    • 标准库需要 FILE 结构体,但禁用半主机后无需复杂实现,仅需满足编译要求。
    • 如果不需要文件操作,可直接定义为空结构体:
      struct __FILE { int dummy; };
      

3. 必须实现的系统函数

(1) 程序退出处理 _sys_exit
#include "stm32f10x.h"  // 假设使用 STM32void _sys_exit(int x) {// NVIC_SystemReset();  // 硬件复位(推荐)// 或 while(1);      // 简单死循环
}
  • 作用:覆盖库的默认退出函数,避免链接错误。
  • 注意
    • 如果调用 exit() 或程序结束,会执行此函数。
(2) 输出重定向 fputc(支持 printf
int fputc(int ch, FILE *f) {USART_SendData(USART1, (uint8_t)ch);  // 发送到 USART1while (!USART_GetFlagStatus(USART1, USART_FLAG_TXE));  // 等待发送完成return ch;
}
  • 关键点
    • printf 依赖此函数输出字符。
    • 需提前初始化 USART(波特率、引脚等)。
(3) 输入重定向 fgetc(支持 scanf
int fgetc(FILE *f) {while (!USART_GetFlagStatus(USART1, USART_FLAG_RXNE));  // 等待接收数据return (int)USART_ReceiveData(USART1);
}
  • 关键点
    • scanf 依赖此函数读取字符。
    • 检查 USART_FLAG_RXNE(接收标志),而非 TC(发送完成)。

4. 完整示例代码

#pragma import(__use_no_semihosting)#include <stdio.h>
#include "stm32f10x.h"  // STM32 头文件// 简化 FILE 结构体
struct __FILE { int dummy; };
FILE __stdout, __stdin;// 系统函数
void _sys_exit(int x) { NVIC_SystemReset(); //也可以为空 }// 输出重定向(printf)
int fputc(int ch, FILE *f) {USART_SendData(USART1, (uint8_t)ch);while (!USART_GetFlagStatus(USART1, USART_FLAG_TXE));return ch;
}// 输入重定向(scanf)
int fgetc(FILE *f) {while (!USART_GetFlagStatus(USART1, USART_FLAG_RXNE));return (int)USART_ReceiveData(USART1);
}int main() {// 初始化 USART1(需自行实现)USART_InitTypeDef USART_InitStruct = { ... };USART_Init(USART1, &USART_InitStruct);USART_Cmd(USART1, ENABLE);printf("Hello, No-Semihosting!\n");  // 通过 USART1 输出int num;scanf("%d", &num);                  // 从 USART1 读取输入return 0;
}

5. 关键注意事项

功能实现要求
禁用半主机#pragma import(__use_no_semihosting)
FILE 结构体定义 struct __FILE__stdout/__stdin(可简化)
_sys_exit必须实现,建议硬件复位(NVIC_SystemReset())或死循环(while(1)
fputc重定向 printf 到硬件(如 UART)
fgetc重定向 scanf 从硬件读取(需检查 USART_FLAG_RXNE
硬件初始化确保 USART/UART 已正确配置(波特率、引脚模式等)

6. 常见问题解决

  • 问题1:printf 无输出
    • 检查 fputc 是否实现,并确认 USART 初始化正确。
  • 问题2:链接错误 undefined _sys_exit
    • 确保所有必需函数(_sys_exitfputc 等)均已实现。
  • 问题3:scanf 无法接收数据
    • 检查 fgetc 是否使用 USART_FLAG_RXNE,而非 TC 标志。

7. 扩展适配其他硬件

  • USB-CDC 重定向:替换 fputc/fgetc 为 USB 通信函数。
  • LCD 输出:修改 fputc 将字符显示到 LCD。
  • GCC 编译器:需实现 _write_read 而非 fputc/fgetc

如果需要针对 特定硬件平台(如 STM32、ESP32、NXP) 的详细配置代码,请提供具体型号!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

github | 仓库权限管理 | 开权限

省流版总结&#xff1a; github 给别人开权限&#xff1a;仓库 -> Setting -> Cllaborate -> Add people GitHub中 将公开仓库改为私有&#xff1a;仓库 -> Setting -> Danger Zone&#xff08;危险区&#xff09; ->Change repository visibility( 更改仓…

快速部署大模型 Openwebui + Ollama + deepSeek-R1模型

背景 本文主要快速部署一个带有web可交互界面的大模型的应用&#xff0c;主要用于开发测试节点&#xff0c;其中涉及到的三个组件为 open-webui Ollama deepSeek开放平台 首先 Ollama 是一个开源的本地化大模型部署工具,提供与OpenAI兼容的Api接口&#xff0c;可以快速的运…

极狐GitLab 项目导入导出设置介绍?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 导入导出设置 (BASIC SELF) 导入和导出相关功能的设置。 配置允许的导入源 在从其他系统导入项目之前&#xff0c;必须为该…

信奥还能考吗?未来三年科技特长生政策变化

近年来&#xff0c;科技特长生已成为名校录取的“黄金敲门砖”。 从CSP-J/S到NOI&#xff0c;编程竞赛成绩直接关联升学优势。 未来三年&#xff0c;政策将如何调整&#xff1f;家长该如何提前布局&#xff1f; 一、科技特长生政策趋势&#xff1a;2025-2027关键变化 1. 竞…

AI测试用例生成平台

AI测试用例生成平台 项目背景技术栈业务描述项目展示项目重难点 项目背景 针对传统接口测试用例设计高度依赖人工经验、重复工作量大、覆盖场景有限等行业痛点&#xff0c;基于大语言模型技术实现接口测试用例智能生成系统。 技术栈 LangChain框架GLM-4模型Prompt Engineeri…

操作系统-PV

&#x1f9e0; 背景&#xff1a;为什么会有 PV&#xff1f; 类比&#xff1a;内存&#xff08;生产者&#xff09; 和 CPU&#xff08;消费者&#xff09; 内存 / IO / 磁盘 / 网络下载 → 不断“生产数据” 例如&#xff1a;读取文件、下载视频、从数据库加载信息 CPU → 负…

工厂方法模式详解及在自动驾驶场景代码示例(c++代码实现)

模式定义 工厂方法模式&#xff08;Factory Method Pattern&#xff09;是一种创建型设计模式&#xff0c;通过定义抽象工厂接口将对象创建过程延迟到子类实现&#xff0c;实现对象创建与使用的解耦。该模式特别适合需要动态扩展产品类型的场景。 自动驾驶感知场景分析 自动驾…

基于 S2SH 架构的企业车辆管理系统:设计、实现与应用

在企业运营中&#xff0c;车辆管理是一项重要工作。随着企业规模的扩大&#xff0c;车辆数量增多&#xff0c;传统管理方式效率低下&#xff0c;难以满足企业需求。本文介绍的基于 S2SH 的企业车辆管理系统&#xff0c;借助现代化计算机技术&#xff0c;实现车辆、驾驶员和出车…

IntelliJ IDEA download JDK

IntelliJ IDEA download JDK 自动下载各个版本JDK&#xff0c;步骤 File - Project Structure &#xff08;快捷键 Ctrl Shift Alt S&#xff09; 如果下载失败&#xff0c;换个下载站点吧。一般选择Oracle版本&#xff0c;因为java被Oracle收购了 好了。 花里胡哨&#…

MCP协议在纳米材料领域的深度应用:从跨尺度协同到智能研发范式重构

MCP协议在纳米材料领域的深度应用&#xff1a;从跨尺度协同到智能研发范式重构 文章目录 MCP协议在纳米材料领域的深度应用&#xff1a;从跨尺度协同到智能研发范式重构一、MCP协议的技术演进与纳米材料研究的适配性分析1.1 MCP协议的核心架构升级1.2 纳米材料研发的核心挑战与…

OpenAI发布GPT-4.1:开发者专属模型的深度解析 [特殊字符]

最近OpenAI发布了GPT-4.1模型&#xff0c;却让不少人感到困惑。今天我们就来深入剖析这个新模型的关键信息&#xff01; 重要前提&#xff1a;API专属模型 &#x1f4bb; 首先需要明确的是&#xff0c;GPT-4.1仅通过API提供&#xff0c;不会出现在聊天界面中。这是因为该模型主…

DemoGen:用于数据高效视觉运动策略学习的合成演示生成

25年2月来自清华、上海姚期智研究院和上海AI实验室的论文“DemoGen: Synthetic Demonstration Generation for Data-Efficient Visuomotor Policy Learning”。 视觉运动策略在机器人操控中展现出巨大潜力&#xff0c;但通常需要大量人工采集的数据才能有效执行。驱动高数据需…

界面控件DevExpress WPF v25.1新功能预览 - 文档处理类功能升级

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

Muduo网络库实现 [十六] - HttpServer模块

目录 设计思路 类的设计 模块的实现 公有接口 私有接口 疑问点 设计思路 本模块就是设计一个HttpServer模块&#xff0c;提供便携的搭建http协议的服务器的方法。那么这个模块需要如何设计呢&#xff1f; 这还需要从Http请求说起。 首先从http请求的请求行开始分析&…

多模态记忆融合:基于LSTM的连续场景生成——突破AI视频生成长度限制

一、技术背景与核心挑战 2025年视频生成领域面临的关键难题是长时程连贯性——传统方法在生成超过5分钟视频时会出现场景跳变、物理规则不一致等问题。本研究提出时空记忆融合架构&#xff08;ST-MFA&#xff09;&#xff0c;通过LSTM记忆门控与多模态对齐技术&#xff0c;在R…

LabVIEW油气井井下集成监测系统

LabVIEW平台开发的油气井井下集成监测系统通过实时监控油气井的井下环境参数&#xff0c;如温度、压力和有害气体含量&#xff0c;有效提高了油气采收率并确保了作业安全。系统利用高精度传感器和强大的数据处理能力&#xff0c;通过综合监测和分析&#xff0c;实现了对油气井环…

【python画图】:从入门到精通绘制完美柱状图

目录 Python数据可视化&#xff1a;从入门到精通绘制完美柱状图一、基础篇&#xff1a;快速绘制柱状图1.1 使用Matplotlib基础绘制1.2 使用Pandas快速绘图 二、进阶篇&#xff1a;专业级柱状图定制2.1 多系列柱状图2.2 堆叠柱状图2.3 水平柱状图 三、专业参数速查表Matplotlib …

【 解决Cline插件无法激活及DeepSeek模型请求卡顿或者无法加载问题】

解决Cline插件无法激活及DeepSeek模型请求卡顿问题 问题描述 在VSCode中使用Cline插件时遇到以下问题&#xff1a; 插件长时间卡在"activating"激活状态成功激活后发起DeepSeek对话时&#xff0c;API请求阶段持续卡顿夜间时段问题出现频率较低 环境信息 Cline版…

聊透多线程编程-线程互斥与同步-9.C# 线程互斥实现方式

目录 1. 锁机制 (Locking Mechanisms) (1) lock 关键字 (2) Monitor 类 2. 跨进程互斥机制 3. 信号量机制 (1) Semaphore 和 SemaphoreSlim 4. 读写锁机制 (1) ReaderWriterLockSlim 5. 原子操作机制 (1) Interlocked 类 6. 自旋锁机制 (1) SpinLock 线程互斥是一种…

eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】

问题&#xff1a; 已经尝试过eNSP的帮助手册&#xff0c;发现都没用&#xff01; eNSP启动AR设备报错码40且常规排查无效时&#xff0c;可尝试以下解决方案&#xff08;按优先级排序&#xff09;&#xff1a; 1. 关闭Hyper-V和Windows沙盒&#xff08;我是这个问题&#xff0…