www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > > 痞子衡嵌入式
[導(dǎo)讀]在嵌入式世界里,輸出打印信息是一種非常常用的輔助調(diào)試手段,借助打印信息,我們可以比較容易地定位和分析程序問題。在嵌入式應(yīng)用設(shè)計里實現(xiàn)打印信息輸出的方式有很多,本系列將以 IAR 環(huán)境為例逐一介紹 ARM Cortex-M 內(nèi)核 MCU 下打印信息輸出方法。


大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是**IAR下調(diào)試信息輸出機(jī)制之半主機(jī)(Semihosting)**。

在嵌入式世界里,輸出打印信息是一種非常常用的輔助調(diào)試手段,借助打印信息,我們可以比較容易地定位和分析程序問題。在嵌入式應(yīng)用設(shè)計里實現(xiàn)打印信息輸出的方式有很多,本系列將以 IAR 環(huán)境為例逐一介紹 ARM Cortex-M 內(nèi)核 MCU 下打印信息輸出方法。

上一篇文章 《IAR下調(diào)試信息輸出機(jī)制之硬件UART外設(shè)》 里我們介紹了利用 MCU 芯片內(nèi)的硬件 UART 外設(shè)去做打印輸出的方式,這種方式很簡單,還可以脫離在線調(diào)試環(huán)境去使用,但畢竟占用了芯片內(nèi)部的外設(shè)資源,而且調(diào)試的時候還需要額外連接串口線路,稍微麻煩了一點(diǎn)。今天痞子衡介紹一種在 IDE 中結(jié)合仿真器直接做打印輸出的方式,即半主機(jī)(Semihosting)技術(shù)。

  • Note:本文使用的 IAR EWARM 軟件版本是 v9.10.2。

一、打印輸出整體框圖

老規(guī)矩先簡介下本文介紹的打印輸出方法整體軟硬件框圖,硬件上主要是 PC 主機(jī)、MCU 目標(biāo)板、一個 ARM 仿真器(DAP-Link 或者 J-Link 都可以)。

軟件上 PC 這邊就需要 IAR 開發(fā)環(huán)境即可,這里在編譯目標(biāo)板 MCU 應(yīng)用程序時,除了需要包含打印輸出相關(guān)代碼(標(biāo)準(zhǔn) I/O 庫接口),底層接口實現(xiàn)必須選用 IAR 的 Semihosting 庫。當(dāng) MCU 程序運(yùn)行起來后(需要保持在線調(diào)試狀態(tài)),仿真器實時捕獲代碼里的打印輸出需求,將這種 I/O 訪問需求轉(zhuǎn)移到 PC 主機(jī)上來完成,然后我們在 IAR 的 Terminal I/O 窗口里可以看到打印信息。

上圖里 MCU 應(yīng)用程序中的 printf() 打印輸出需求到底是如何轉(zhuǎn)移到 PC 主機(jī)上 IAR 軟件里去完成的,這是本文要研究的重點(diǎn)。

二、Semihosting機(jī)制原理

Semihosting 中文為半主機(jī)(半托管),這是一個在嵌入式系統(tǒng)中已經(jīng)流傳了幾十年的技術(shù)。Semihosting 技術(shù)將應(yīng)用程序中的 I/O 請求通過一定的通道傳送到主機(jī)(host),由主機(jī)上的資源響應(yīng)應(yīng)用程序的 I/O 請求,而不是像在主機(jī)上執(zhí)行本地應(yīng)用程序一樣,由應(yīng)用程序所在的硬件系統(tǒng)來響應(yīng)應(yīng)用程序 I/O請求,簡單說就是將目標(biāo)板的輸入/輸出請求從應(yīng)用程序代碼傳遞到遠(yuǎn)程運(yùn)行調(diào)試器的主機(jī)上的一種機(jī)制。

ARM 也定義了這種 Semihosting 機(jī)制實現(xiàn),我們在目標(biāo) ARM 開發(fā)板代碼中加入 printf,scanf 等函數(shù)調(diào)用時,這些函數(shù)并不是鏈接到目標(biāo)開發(fā)板的庫函數(shù),而是遠(yuǎn)程主機(jī)交叉編譯器中帶有的庫函數(shù),并且這些庫函數(shù)被編譯時會額外插入軟件中斷指令,早期的 ARMv7 架構(gòu)下軟中斷使用得是 SVC 指令(SWI 指令),而對于 Cortex-M 處理器(ARMv6-M 或者 ARMv7-M 架構(gòu)),這個軟件中斷指令是 BKPT。

我們可以在 ARMv6/7/8-M Architecture RM 手冊里找到 BKPT 指令定義,其中 imm8 是指定存儲在指令中的 8 位值,這個值會被處理器忽略,但是調(diào)試器可以使用它來存儲關(guān)于斷點(diǎn)的附加信息。

如果 BKPT 指令是用于觸發(fā) Semihosting 請求,其 imm8 值應(yīng)該被設(shè)為 0xAB,這是 ARM 的規(guī)定。因此當(dāng)仿真器捕獲到 BKPT #0xab 指令時便會讓主機(jī)響應(yīng)接下來的 I/O 請求。

現(xiàn)在可以觸發(fā) Semihosting 請求了,但是 I/O 請求的種類很多,主機(jī)該如何區(qū)分呢?別擔(dān)心,ARM 還規(guī)定了 R0 寄存器來存放請求的類型(編譯器應(yīng)該在 BKPT 指令前,將請求類型值放到 R0 寄存器里),我們可以在 ARM 開發(fā)者官網(wǎng)找到這些請求類型定義以及詳細(xì)解釋。整個 Semihosting 機(jī)制至此就清楚了,各大 IDE 只需要按照這個規(guī)定去具體實現(xiàn)即可。

https://developer.arm.com/documentation/dui0471/g/Semihosting/Semihosting-operations?lang=en

關(guān)于更詳細(xì)的 Semihosting 機(jī)制,可以參考 SEGGER 整理的一篇博客 https://wiki.segger.com/Semihosting 。

三、IAR 對 Semihosting 機(jī)制的支持

IAR 對 ARM 定義的 Semihosting 機(jī)制是有完善支持的,我們按上一篇的老辦法,看工程編譯鏈接后生成的 .map 文件,找到 IAR 實現(xiàn) Semihosting 的相關(guān)源文件。

3.1 Terminal I/O 查看打印效果

繼續(xù)以上一篇文章使用的 \SDK_2.11.0_EVK-MIMXRT1060\boards\evkmimxrt1060\demo_apps\hello_world\iar 工程為例,簡單改造一下工程里 hello_world.c 文件里的 main() 函數(shù),將原來代碼全部刪掉(原來的打印輸出涉及恩智浦 SDK 封裝,本文沒必要關(guān)心其實現(xiàn)),只要如下一句打印即可:

#include  int main(void) { printf("hello world.\r\n"); while (1);
}

然后注意工程選項里 Library low-level interface implementation 選項,這里我們選 Semihosted 方式,并且 stdout/stderr 選擇 Via semihosting。這時候底層 I/O 完全由 IAR 內(nèi)置 Semihosting 庫來搞定了。

我們將 MCU 目標(biāo)板供上電,并連接調(diào)試器在線跑起來看看效果,在 IAR 菜單欄 View 里打開 Terminal I/O 窗口,全速運(yùn)行,可以看到有 hello world. 字樣打印輸出,沒有真實的串口線路物理連接,照樣能實現(xiàn)打印了。

3.2 Semihosting庫I/O響應(yīng)設(shè)計

IAR 的 Terminal I/O 窗口里怎么就能看到打印輸出的呢?我們在 \IAR Systems\Embedded Workbench 9.10.2\arm\doc\EWARM_DevelopmentGuide.ENU 手冊里找到了玄機(jī),其實是 IAR 里的調(diào)試組件 C-SPY 負(fù)責(zé)響應(yīng)調(diào)試器捕捉到的來自 MCU 的 I/O 訪問需求,并負(fù)責(zé)解釋 Semihosting 庫源碼,然后模擬了對應(yīng) I/O 操作。

3.3 Semihosting庫相關(guān)源碼實現(xiàn)

現(xiàn)在我們再來查看生成的 hello_world.map 文件,除了 dl7M_tln.a 部分多了 XShttio.o 目標(biāo)文件外,還增加了 shb_l.a 庫(里面有一系列 .o 文件),這些增加的 .o 文件均是 Semihosting 庫相關(guān)源碼實現(xiàn)。我們可以在 \IAR Systems\Embedded Workbench 9.10.2\arm\src\lib\semihosting 目錄下找到 XShttio.c 源文件,這個主要是 ARM 標(biāo)準(zhǔn) Semihosting 實現(xiàn)層,但是偏 IAR 這一層的 iarttio.o、iarwrite.o、iarwstd.o 并沒有公開源碼,這可能屬于 IAR 軟件商業(yè)機(jī)密了吧。

*******************************************************************************
*** MODULE SUMMARY
***

    Module                ro code  ro data  rw data
    ------                -------  -------  -------
dl7M_tln.a: [10]
    XShttio.o                   8        8        8
    abort.o                     6
    exit.o                      4
    low_level_init.o            4
    printf.o                   40
    putchar.o                  32
    xfail_s.o                  64                 4
    xprintfsmall_nomb.o     1'281
    xprout.o                   22
    -----------------------------------------------
    Total:                  1'461        8       12

shb_l.a: [13]
    dwrite.o                   30
    exit.o                     20
    iarttio.o                 124
    iarwrite.o                 34
    iarwstd.o                  32
    write.o                    16
    -----------------------------------------------
    Total:                    256

3.4 從反匯編文件看Semihosting實現(xiàn)

最后我們再從工程反匯編文件角度看一下 Semihosting 機(jī)制是不是如第二小節(jié)原理里介紹得那樣,先借助 IAR 小工具 ielfdumparm.exe 將工程可執(zhí)行文件 hello_world.out 轉(zhuǎn)換成反匯編文件 hello_world.dump。

ielfdumparm.exe --source --code .\hello_world.out -o .\hello_world.dump

然后使用任意文本編輯器打開這個反匯編文件 hello_world.dump,在里面搜索 BKPT 指令,確實能夠看到插入了多處軟中斷指令用于觸發(fā) Semihosting,并且軟中斷指令前都裝載了 R0 寄存器,痞子衡截取的片段里 R0 裝載的值是 5,從 ARM 文檔里查詢,這對應(yīng)了 SYS_WRITE 訪問請求。

至此,IAR下調(diào)試信息輸出機(jī)制之半主機(jī)(Semihosting)痞子衡便介紹完畢了,掌聲在哪里~~~


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

本屆年會將在上海(11月13-14日)、北京(11月19-20日)和深圳(11月27-28日)舉行,面向嵌入式設(shè)計工程師推出25門技術(shù)課程

關(guān)鍵字: 嵌入式 MCU 模擬

上海2025年9月5日 /美通社/ -- 由紐倫堡會展(上海)有限公司舉辦的上海國際嵌入式會議將于 2025 年 10 月 16-17 日在上海世博展覽館舉辦。 此次會議將由三個版塊組成:嵌入式技術(shù)會議、汽...

關(guān)鍵字: 嵌入式 CE CHINA EMBEDDED

從外部看,電子系統(tǒng)仿佛一個統(tǒng)一的學(xué)科或設(shè)備,各組成部分協(xié)同工作,渾然一體。然而揭開表象,其內(nèi)在卻是另一番景象:一個碎片化、多層次的世界——其中每一層都獨(dú)立且復(fù)雜,衍生出各自特有的工具、專家、工作流程,甚至哲學(xué)體系。

關(guān)鍵字: 嵌入式 電子系統(tǒng) 半導(dǎo)體

8位單片機(jī)在嵌入式設(shè)計領(lǐng)域已經(jīng)成為半個多世紀(jì)以來的主流選擇。盡管嵌入式系統(tǒng)市場日益復(fù)雜,8位單片機(jī)依然不斷發(fā)展,積極應(yīng)對新的挑戰(zhàn)和系統(tǒng)需求。如今,Microchip推出的8位PIC?和AVR?單片機(jī)系列,配備了先進(jìn)的獨(dú)立...

關(guān)鍵字: 單片機(jī) 嵌入式 CPU

深圳2025年8月28日 /美通社/ -- 8月26日,2025 ELEXCON深圳國際電子展盛大啟幕。本屆大會以"All for AI"為主題,深圳市德...

關(guān)鍵字: AI 工業(yè)級 SSD 嵌入式

深圳2025年8月26日 /美通社/ -- 8月26日,由博聞創(chuàng)意會展主辦的 第22屆深圳國際電子展暨嵌入式展(elexcon2025)在深圳(福田)會展中心隆重開幕。 作為中國電子與嵌入式技術(shù)領(lǐng)域的專業(yè)大展,本屆展會...

關(guān)鍵字: 嵌入式 電子 高通 AI

模塊化設(shè)計作為一種將系統(tǒng)拆分為獨(dú)立、可復(fù)用組件的方法,能夠在低代碼平臺中實現(xiàn)功能的靈活組合,并最大限度地提升系統(tǒng)性能。本文將探討如何通過模塊化設(shè)計,使得低代碼平臺既能快速適應(yīng)變化,又能保持高效穩(wěn)定的運(yùn)行。

關(guān)鍵字: 模塊化設(shè)計 嵌入式

CPU親和度通過限制進(jìn)程或線程可以運(yùn)行的CPU核心集合,使得它們只能在指定的CPU核心上執(zhí)行。這可以減少CPU緩存的失效次數(shù),提高緩存命中率,從而提升系統(tǒng)性能。

關(guān)鍵字: Linux 嵌入式

加密算法分對稱加密和非對稱算法,其中對稱加密算法的加密與解密密鑰相同,非對稱加密算法的加密密鑰與解密密鑰不同,此外,還有一類不需要密鑰的散列算法。

關(guān)鍵字: 算法 嵌入式

從本質(zhì)上講,算法是一種有條不紊、分步驟解決問題或完成任務(wù)的方法。無論是簡單的數(shù)字相加公式,還是復(fù)雜的機(jī)器學(xué)習(xí)協(xié)議,算法都是軟件應(yīng)用的基礎(chǔ),確保任務(wù)能夠高效有效地執(zhí)行。

關(guān)鍵字: 算法 嵌入式
關(guān)閉