1

Texas InstrumentsStellarisCortex-M3にBeRTOSを使用しようとしています。私の職場環境は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 */
    }
}

バージョンの代わりにそれを使用できるかもしれませんが、多少遅くなります。それが重要かどうかは、使用目的によって異なります。コンパイラは通常、レジスタに a を配置しないvolatileため、レジスタをデクリメントする代わりに、関数はメモリ位置にヒットする可能性があります。

以下は、名前の付いたファイルに入れlm3s_busyWait.sて IAR プロジェクトに追加できる小さな ARM アセンブリ関数です。これは、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 に答える