GCC内联汇编到IAR内联汇编

时间:2012-10-31 11:24:13

标签: assembly embedded inline-assembly iar

我正在尝试将BeRTOS用于Texas Instruments Stellaris Cortex-M3。我的工作环境是IAR。为了适应IAR和我正在使用的特定uC,有很多小的改动,但我有一个我似乎无法解决的问题......坦率地说,这有点超出我的想法。

这段代码:

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    }

...正在产生一些错误和警告。

  

错误:预期“;” ----->第3行

     

错误:预期为“(”----->第5行

     

错误:预期“)”----->第9行

     

警告:声明变量“__n”但从未引用过----->第3行

有什么建议吗?

1 个答案:

答案 0 :(得分: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