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

时间:2017-12-20 19:56:17

标签: c compiler-errors arm visual-studio-2017 intrinsics

因为我更喜欢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 ++编译器是否能够识别这些声明?如果是,应该改变什么?

1 个答案:

答案 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定义它的方式和语言语法完全不同。