【问题标题】:Eroror compiling builtin asm编译内置 asm 时出错
【发布时间】:2021-12-19 14:17:14
【问题描述】:

我最近从 Keil Uvision 切换到我自己的 Makefile 我在编译文件 port.c 时遇到问题, 文件中的函数:

__asm void vPortSVCHandler( void )
{
    PRESERVE8

    /* Get the location of the current TCB. */
    ldr r3, =pxCurrentTCB
    ldr r1, [r3]
    ldr r0, [r1]
    /* Pop the core registers. */
    ldmia r0!, {r4-r11, r14}
    msr psp, r0
    isb
    mov r0, #0
    msr basepri, r0
    bx r14
}

编译时出现以下错误:

../port.c:52:7: error: expected '(' before 'void'
   52 | __asm void vPortSVCHandler( void )
      |       ^~~~
      |       (
../port.c:64:13: error: stray '#' in program
   64 |     mov r0, #0

我是否缺少包含或编译器选项?

【问题讨论】:

  • 内联汇编器不是标准化的(如在 C++ 中),也不是可移植的。每个编译器都以自己的方式进行。好的编译器会努力以“C++ 风格”(asm(" ... ");)来完成它,同时等待 C 委员会认识到人们可能希望在计算机上使用 C。距离第一个 C 标准已经 30 多年了,委员会仍然没有意识到在计算机上使用 C 的必要性,所以不要抱太大希望......
  • 将“port.c”更改为“port.cpp”是否可行?
  • 不,因为这看起来不像标准化的 C++ 内联汇编器。而且您通常也不想在嵌入式系统中使用 C++。
  • @Lundin And you generally don't want to use C++ in embedded systems anyway 为什么?我有时用。没问题。不错的 RTOS 也可用(失真)

标签: c gcc makefile


【解决方案1】:

您使用gcc 而gcc 没有“asm”函数。

你需要在汇编器中写或者写内联汇编。 __asm 也不是有效的 gcc 关键字。

https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html

【讨论】:

  • 不修改源文件可以编译吗?
  • 使用 keil 命令行编译器代替 gcc
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 2021-02-27
  • 2014-03-26
相关资源
最近更新 更多