通过视觉C 编译器识别ARM软件中断(SWI)功能



,因为我更喜欢Visual Studio编辑器而不是Keil和IAR编辑器,所以我尝试使用VS 2017来编译基于ARM的项目。一个项目包括Realview Run-time库的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();

默认情况下生成的错误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

视觉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的定义方式完全不同。

最新更新