1

私は以前、8051 マイクロコントローラのプログラミングに Keil を使用していました。何らかの理由で SDCC でコーディングする必要がありますが、今日、コンパイラで非常に奇妙な動作に直面しています。コード ブロック IDE 12.11 および SDCC 3.4 バージョンを使用しています。

この単純なコードをコンパイルしています。

#include <mcs51/8051.h>
#include "Serial.h"


unsigned char digits[5]={0};

void main(void)
{
    serial_init(-13);

    digits[2]='a';
    serial_send(digits[2]);
    serial_send('a');

    while(1)
    {

    }

}

これがserial_send関数の定義です。

void serial_send(unsigned char dat){
    while(!TI);
    TI = 0;
    SBUF = dat;
}

問題は、コードによれば、端末で「a」文字を2回出力するはずなのに、1回しか出力していないことです。問題は、グローバルな検証可能な digits[] 配列にあります。

この関数は、定数値でのみ適切に機能しますが、引数に基づいた変数では機能しません。

この問題は、私が理解できないC言語のトリックに関するものだと思うため、ここにこの質問を投稿しています。

コンパイラと IDE の両方を再インストールしようとしましたが、問題は同じままです。なぜこれが起こっているのか説明してください。私はさまざまなコードを試しましたが、すべてのコードで定数とローカル変数は正常に動作しますが、グローバル変数は奇妙な動作を提供します。

4

1 に答える 1

2

空の while ループwhile(!TI);がコンパイラによって最適化されていないことを確認してください。'a'実際に送信されているものを確認できないため、メイン コードはあいまいです。

それらを a に変更し'b'、2 つの呼び出しの順序を入れ替えてみてserial_send()、uart が現在のバイトを送信する前に SBUF が新しいデータで時期尚早に上書きされたという単純なケースではないことを確認します。

于 2014-11-15T08:12:39.453 に答える