1

我正在尝试将BeRTOS用于德州仪器 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 行

有什么建议么?

4

1 回答 1

1

我很确定 IAR 的编译器不支持内联汇编。至少当我在使用 IAR 的工具时需要在那个级别上做一些事情时,我总是使用一个实际的单独的汇编语言源文件。

您发布的代码看起来或多或少等同于以下 C 代码:

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

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

您也许可以使用它来代替您的版本,但它会慢一些。这是否重要取决于您使用它的目的。编译器通常不会将 avolatile放入寄存器中,因此该函数可能会访问内存位置,而不是递减寄存器。

以下是一个小型 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
于 2012-11-03T18:20:32.750 回答