繁体   English   中英

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

[英]Recognizing ARM Software Interrupt (SWI) functions by Visual C++ compiler

因为我更喜欢Visual Studio编辑器而不是Keil和IAR编辑器,所以我尝试使用VS 2017编译基于ARM的项目。项目包括RealView运行时库的RTL.h头,它声明了软件中断(SWI)功能 据我所知, Visual C ++编译器支持SWI内部函数但我收到编译错误。

此外,我在使用默认编译器和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如何定义它的意义和语言语法完全不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM