2012-10-31 39 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。 –