我编译使用ARM-Linux的gnueabi-gcc的这个功能,但它给我一个错误 expected string literal before ‘)’ token
交叉编译ASM错误
void flush_icache(void)
{
u32 tmp = 0;
asm volatile(" mcr p15, 0, %0, c7, c5, 0\n\t": : "r"(tmp) :);
}
这我不能删除。 如果有人有任何想法,然后亲切解决
我编译使用ARM-Linux的gnueabi-gcc的这个功能,但它给我一个错误 expected string literal before ‘)’ token
交叉编译ASM错误
void flush_icache(void)
{
u32 tmp = 0;
asm volatile(" mcr p15, 0, %0, c7, c5, 0\n\t": : "r"(tmp) :);
}
这我不能删除。 如果有人有任何想法,然后亲切解决
正如我所料,使用crosstool-chain存在一个问题。因此,以前我使用的是codesourcery(2008)提供的较旧的一个,然后我转到2010工具链。
这可能是ARM架构发生变化的一个问题。
也许把“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
这个链接也可能有助于:
=============附录=============
另外一个建议:
void flush_icache(void)
{
u32 tmp = 0;
asm volatile(
" mcr p15, 0, %0, c7, c5, 0\n\t"
: /* no output registers */
: "r"(tmp) /* input */
);
}
嘿,你是怎么解决你的问题的? – linvenuza
IIRC旧的crosstool-chain有一个bug,我更新了工具链到2010年,解决了问题。希望这可以帮助。 – peeyush