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

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

因为我更喜欢 Visual Studio 编辑器而不是 Keil 和 IAR 编辑器,所以我尝试使用 VS 2017 编译基于 ARM 的项目。项目包含 RealView 运行时库的 RTL.h header ,其中声明 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 文档,__swi() 是 SVC 指令的内在函数,用于生成软件中断,而不是为其编写处理程序。

__swi 不是一个可以用作声明另一个函数的一部分的属性,它是一个自己的函数,其原型(prototype)为 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 的定义完全不同,含义和语言语法用法也不同。

关于c - 通过 Visual C++ 编译器识别 ARM 软件中断 (SWI) 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47913488/

相关文章:

iphone - 生成错误 : expected a property attribute before 'unsafe_unretained'

opencv - 在 x86_64 主机上为 ARM 交叉编译 opencv 2.4.11

c - 有什么方法可以将值分配给变量,使得分配的值是另一个变量的前两位数?

c - 使用 AT89S51 串行传输整数值

c - 倒带(文件指针)然后 fwrite。 fwrite 不会覆盖文件内容吗? C

C# CS0019 IntPtr

c - 尝试将结构实例写入文件时出现段错误

python - 对于仅包含整数的文件,基数为 10 的 int() 的文字无效

gcc - ARM7TDMI 不支持请求的专用寄存器

c - ARM 处理器的链表问题