通过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)函数的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio Code可以编译c语言吗?怎么操作