通过Visual C ++编译器识别ARM软件中断(SWI)函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过Visual C ++编译器识别ARM软件中断(SWI)函数相关的知识,希望对你有一定的参考价值。

因为我更喜欢Visual Studio编辑器而不是Keil和IAR编辑器,所以我尝试使用VS 2017编译基于ARM的项目。项目包括RealView运行时库的RTL.h头,它声明了Software Interrupt (SWI) functions。据我了解Visual C++ compiler supports SWI intrinsic function但我收到了编译错误。

此外,我在使用默认编译器和Clang编译器的主要应用程序中尝试了这一点 - 两者都是Visual Studio:

1: void __swi(1) test1();
2: void __swi_2 test2();
3: 
4: void test3() __swi(3);
5: void test4() __swi_4;
6:
7: __swi(5) test5();
8: __swi_6 void test6();

默认Visual C ++编译器生成的错误是:

  • 第1行 错误C2182'__swi':非法使用'void'类型 错误C2146语法错误:缺少';'在标识符'test1'之前 错误C4430缺少类型说明符 - 假定为int。注意:C ++不支持default-int
  • 第2行 错误C2182'__swi_2':非法使用'void'类型 错误C2146语法错误:缺少';'在标识符'test2'之前 错误C4430缺少类型说明符 - 假定为int。注意:C ++不支持default-int
  • 第4行 错误C3646'__swi':未知的覆盖说明符 错误C2059语法错误:'('
  • 第5行 错误C3646'__swi_4':未知的覆盖说明符
  • 第7行 错误C4430缺少类型说明符 - 假定为int。注意:C ++不支持default-int 错误C2374'__swi':重新定义;多次初始化 错误C2146语法错误:缺少';'在标识符'test5'之前
  • 第8行 错误C2144语法错误:'void'前面应加';' 错误C4430缺少类型说明符 - 假定为int。注意:C ++不支持default-int

Visual C ++编译器是否能够识别这些声明?如果是,应该改变什么?

答案

从您链接的文档中,两个编译器都有一个__swi关键字或内在关键字,但它在两个语言扩展中具有非常不同的含义。因此,除非您可以将VS2017设置为使用ARM的编译器而不是该IDE附带的MS编译器,否则似乎无法执行您想要的操作。

这是使用仅由单个编译器提供的语言扩展的代价,尤其是非自由编译器,假设情况确实如此。


细节:

根据您链接的MS doc,__swi()是SVC指令的内在函数,用于生成软件中断,而不是为它们编写处理程序。

__swi不是一个属性,你可以用它作为声明另一个函数的一部分,它是它自己的函数,原型unsigned int __swi(unsigned int, ...)。您可以从另一个函数内部使用它来进行系统调用,如下所示:

int swi1(int a) {
    return __swi(1, a);    // I didn't check any system-call lists to find out what args actually make sense
}

void __swi(1) test1();与语法错误相同 void sqrt(2.0) test1();。同样,__swi_2只是另一个无法识别的标识符。

无论你想做什么,__swi()都不是Visual Studio中的正确方法。


在ARM的编译器中,__swi(8)是一个函数属性,意味着调用者应该使用swi 8而不是BL function_name(普通调用指令)来调用它。它显然也设置了中断表以指向使用该属性定义的函数。

这与MSVC如何定义它的意义和语言语法完全不同。

以上是关于通过Visual C ++编译器识别ARM软件中断(SWI)函数的主要内容,如果未能解决你的问题,请参考以下文章

在ARM汇编编程中如何指定某段程序的存储地址

通过命令行编译C / C ++ / Visual C程序

涨知识,全面深入了解嵌入式C语言可靠性设计

Visual Studio Code可以编译c语言吗?怎么操作

ARM探索之旅 03 | 如何使用 ARM FPU 加速浮点计算

资深码农谈:嵌入式C语言可靠性设计之我见