因为我更喜欢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行
第2行
第4行
第5行
第7行
第8行
Visual C ++编译器是否能够识别这些声明?如果是,应该改变什么?
答案 0 :(得分:2)
在您链接的文档中,两个编译器都有一个__swi
关键字或内在关键字,但它在两个语言扩展中的含义却截然不同。因此,除非您可以将VS2017设置为使用ARM编译器而不是该IDE附带的MS编译器,否则它似乎无法做您想做的事情。
这是使用仅由单个编译器提供的语言扩展的代价,尤其是非自由编译器,假设情况确实如此。
详情:
根据您链接的MS文档,__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定义它的方式和语言语法完全不同。