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.pswp.cn/web/76362.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76362.shtml
英文地址,請注明出處:http://en.pswp.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…