2012-10-31 42 views
1

我試圖使用BeRTOS了德州儀器的Stellaris Cortex-M3的。我的工作環境是IAR。爲了適應IAR和我正在使用的具體uC,我做了很多小的改動,但我有一個我看起來無法解決的問題......坦率地說,這有點凌駕於我的頭上。GCC內嵌彙編IAR嵌入式大會

這段代碼:

1 void NAKED lm3s_busyWait(unsigned long iterations) 
2 { 
3  register uint32_t __n __asm("r0") = iterations; 
4 
5  __asm volatile (
6   "1: subs r0, #1\n\t" 
7   "bne 1b\n\t" 
8   "bx lr\n\t" 
9   : : "r"(__n) : "memory", "cc"); 
10 
11 } 

...正在產生一些錯誤和警告。

Error: expected a ";" -----> Line 3

Error: expected a "(" -----> Line 5

Error: expected a ")" -----> Line 9

Warning: variable "__n" was declared but never referenced -----> Line 3

有什麼建議嗎?

+2

請考慮看看這個。它特別指出,它不是用於Cortex內核,但它確實提供到像「不引用特定的寄存器」 ...... http://supp.iar.com/Support/?note=86655 – Ross

+0

後來版本的IAR的工具支持GCC風格的內聯彙編。我不認爲有明確使用r0的方法,但語法允許讓編譯器爲你選擇一個寄存器。有關詳細信息,請參閱IAR編譯器手冊。 – Lindydancer

回答

1

我敢肯定,IAR的編譯器不支持內嵌彙編;至少我總是使用一個實際單獨的彙編語言源文件,無論何時我需要在使用IAR工具時在該級別執行操作。

你張貼看起來像它或多或少相當於下面的C代碼的代碼:

void lm3s_busyWait(unsigned long iterations) 
{ 
    register volatile unsigned long n = iterations; 

    while (--n) { 
     /* do nothing */ 
    } 
} 

你也許能夠使用代替你的版本,但它會有點慢。無論重要還是取決於你使用的是什麼。編譯器通常不會將一個volatile在寄存器中,所以這一翻譯遞減寄存器的,功能很可能會打一個內存位置。

下面是一個小的ARM彙編函數,你可以把到一個名爲lm3s_busyWait.s文件,並將其添加到您的IAR項目。它應該與您使用GCC內聯彙編的版本完全相同:

/* C prototype: 
    * 
    * void lm3s_busyWait(unsigned long iterations); 
    * 
    */ 
    PUBLIC lm3s_busyWait 

    SECTION .text:CODE:NOROOT(4) 
    THUMB 

lm3s_busyWait: 
    subs r0, #1 
    bne lm3s_busyWait 
    bx lr 

    end 
+0

IAR的編譯器支持內聯彙編的年齡的簡單形式,更高版本支持GCC風格的內聯彙編程序,允許代碼以指定輸入和輸出寄存器。 – Lindydancer

+1

@Lindydancer:感謝指針 - 在發佈我的答案之前,我已經在IAR(EWARM 6.1)中查找了一些關於內聯彙編的信息,但仍然錯過了信息(在「第1部分:使用構建工具」/「彙編語言界面「,而且信息非常簡潔)。在gcc風格的內聯彙編中,我仍然看不到任何信息,但我只有6.1,而當前版本高達6.4。 –