4.7.34.  __semihost

此内在函数在编译器生成的指令流中插入 SVCBKPT 指令。 它允许从 C 或 C++ 中进行与目标体系结构无关的半主机调用。

语法


int __semihost(int val, const void *ptr)

其中:

val

是半主机请求的请求代码。

有关详细信息,请参阅开发指南中的第 9 章 半主机

ptr

是一个指向自变量/结果块的指针。

有关详细信息,请参阅开发指南中的第 9 章 半主机

返回值

有关半主机调用结果的详细信息,请参阅开发指南中的第 9 章 半主机

用法

可以从 C 或 C++ 中使用此内在函数为目标和指令集生成相应的半主机调用:

SVC 0x123456

对于所有体系结构,在 ARM 状态下。

SVC 0xAB

在 Thumb 状态下,不包括 ARMv7-M。不能保证来自 ARM 或第三方的所有 调试目标上均会出现这种行为。

BKPT 0xAB

对于 ARMv7-M,仅限 Thumb-2。

限制

ARMv7 之前的 ARM 处理器使用 SVC 指令进行半主机调用。 不过,如果为 Cortex-M3 处理器进行编译,则会使用 BKPT 指令实现半主机。

示例


char buffer[100];

...

void foo(void)

{

    __semihost(0x01, (const void *)buf); // equivalent in thumb state to 

                                         // int __svc(0xAB) my_svc(int, int *);

                                         // result = my_svc(0x1, &buffer);

}

使用选项 --thumb 编译此代码时,将生成以下内容:


||foo|| PROC

    ...

    LDR      r1,|L1.12|

    MOVS     r0,#1

    SVC      #0xab

    ...



|L1.12|

    ...

buffer

    %        400

另请参阅

Copyright © 2007 ARM Limited. All rights reserved. ARM DUI 0348AC
Non-Confidential