交叉编译 ASM 错误



我正在使用arm-linux-gnueabi-gcc编译这个函数,但它给了我一个错误 expected string literal before ‘)’ token

void flush_icache(void)
{
  u32 tmp = 0;
  asm volatile(" mcr p15, 0, %0, c7, c5, 0nt": : "r"(tmp) : );
}

我无法删除。如果有人有任何想法,请解决

也许在"r"和"(tmp")之间放一个空格?

以下是有关 GCC"扩展 ASM 命令"的文档:

  • http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Extended-Asm

  • http://gcc.gnu.org/onlinedocs/gcc/Explicit-Reg-Vars.html#Explicit-Reg-Vars

此链接也可能有所帮助:

  • http://www.ethernut.de/en/documents/arm-inline-asm.html

====

========= 附录 =============

另一个建议:

void flush_icache(void)
{
  u32 tmp = 0;
  asm volatile(
    " mcr p15, 0, %0, c7, c5, 0nt" 
    :             /* no output registers */
    : "r"(tmp)    /* input */
  );
}

正如我所料,使用交叉工具链存在问题。所以以前我使用的是 codesourcery(2008) 提供的旧工具链,然后我转向了 2010 工具链。
这可能是更改 ARM 体系结构时遇到的问题。

最新更新