我編譯使用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