因为我更喜欢 Visual Studio 编辑器而不是 Keil 和 IAR 编辑器,所以我尝试使用 VS 2017 编译基于 ARM 的项目。项目包含 RealView 运行时库的 RTL.h header ,其中声明 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 文档,__swi()
是 SVC 指令的内在函数,用于生成软件中断,而不是为其编写处理程序。
__swi
不是一个可以用作声明另一个函数的一部分的属性,它是一个自己的函数,其原型(prototype)为 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 的定义完全不同,含义和语言语法用法也不同。
关于c - 通过 Visual C++ 编译器识别 ARM 软件中断 (SWI) 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47913488/