ARM Semihosting 簡介與範例

前言 – What is semihosting?

Semihosting 是 ARM 中的一個機制,使得 ARM target 可以藉由運行 debugger 的 host computer 的 Input/Output 裝置來進行溝通。

Semihost 的實作是透過使用定義好的軟體中斷 (SVCs),使程式在執行過程中產生中斷。一旦目標系統上的程式呼叫到對應的指令 (semihosting call),便產生軟體中斷,接著 Debug Agent 就會負責處理此中斷,進行與主機的溝通。[1]

Semihosting Interface

Semihosting 透過 SVC 指令來調用相關的命令, 以下為三種不同的使用方式:

SVC 0x123456

In ARM state for all architectures.

SVC 0xAB

In ARM state and Thumb state, excluding ARMv6-M and ARMv7-M. This behavior is not guaranteed on all debug targets from ARM or from third parties.

BKPT 0xAB

For ARMv6-M and ARMv7-M, Thumb state only.

同時,Operations type 被存放於 R0 暫存器,parameters 之位置存放於 R1 暫存器

可用的 semihosting operation number 如下列表:

0x00-0x31

Used by ARM.

0x32-0xFF

Reserved for future use by ARM.

0x100-0x1FF

Reserved for user applications. These are not used by ARM.

If you are writing your own SVC operations, however, you are advised to use a different SVC number rather than using the semihosted SVC number and these operation type numbers.

0x200-0xFFFFFFFF

Undefined and currently unused. It is recommended that you do not use these.

範例

以下範例可用於 Cortex-M4 系列之 ARM CPU

Reference

[1] Lab7: On-Chip Debugger + semihosting, http://wiki.csie.ncku.edu.tw/embedded/Lab7

[2] debug.h, https://github.com/zhiyb/SRAMLoader/blob/0d38d09c973e88df3a9060dbbe02c2f5020e99bc/debug.h

[3] Semihosting on ARM with GCC and OpenOCD, http://bgamari.github.io/posts/2014-10-31-semihosting.html

[4]: What is semihosting?, http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0471c/Bacbedji.html




如果你覺得這篇文章不錯,歡迎打賞 IOTA:RFHEIVXVIZWJFXTZORZZRCMHZF9PSGFUFWAAKXTFNZE9JQUY9HFQREJYYSPSXDRLECKXCAQQDOMSMYJYDKPCKWXBKD

或是點選下方圖片贊助我一杯咖啡:

Leave a reply:

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.