2

私の 8 ビットの Freescale HCS08 micro では、ポインタに値を返すライブラリ関数を呼び出すたびにそれを渡しますが、実際にはそうしたくないので、NULL を入れました。

UART_SendBlock((char *)txstr, strlen(txstr), NULL);

最後の引数の型は であり、 uint16_t *実際に送信された文字数を返します。この値は気にしません。

ただし、その関数が呼び出されるたびにマイクロのポート A がホースで接続されるという問題があり、デバッグすると、その引数が問題を引き起こしていることがわかりました。ポート A の構成レジスタは、アドレス 0x0000 と 0x0001 に存在します。これはNULL(aka (void *)0) が指す場所です。NULL実際には何もしない魔法のようなものだと思っていましたが、そうではないようです。

私の回避策は本当にハックだと感じます:

#define MNUL (void *)(&mynull)
uint32_t mynull;

より良い解決策はありますか?プロセッサの未使用のメモリ セグメントに MNUL を定義しようとしましたが、すぐにリセットされます。

4

2 に答える 2

9

UART_SendBlock のドキュメントに NULL ポインターを渡しても問題ないと記載されていない限り、そうするとおそらく未定義の動作が発生する可能性があります。この場合、関数は渡したアドレス、アドレス 0 に書き込むだけのようです。行動"。

パラメータを付けて呼び出すだけで、「賢く」する必要はありません。

uint16_t unused_16;
UART_SendBlock((char *)txstr, strlen(txstr), &unused_16);

リソースが限られている場合はunused_16、グローバルを作成して他の場所で再利用します

于 2010-08-03T22:00:12.327 に答える
3

関数は、最後の引数が指す場所に値を書き込もうとしています。NULL (0x0000) を渡しているため、結果はメモリ位置 0x0000、またはポート A に書き込まれます。通常 (一般的なプログラミングでは) 関数は引数をチェックし、その場所に書き込みを試みません。 NULL ですが、この関数はその規則に従っていないようです。関数を使用しない場合でも、結果を書き込む関数に変数を割り当てる必要があります。

于 2010-08-03T22:00:04.450 に答える