質問

私の8ビットのフリースケールHCS08マイクロでは、ポインターに値を返すライブラリ関数を呼び出すときはいつでも、それを渡しません。

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

最後の引数のタイプはです uint16_t * そして、実際に送信された文字の数、私が気にしない値を返します。

しかし、私はその関数が呼び出されるたびに、私のマイクロAのポートAに問題があり、デバッグはその議論が物事を台無しにすることを私に向けました。ポートAの構成は、アドレス0x0000および0x0001でライブを登録します。 NULL (別名 (void *)0)ポイント。私は思った NULL 実際に何もしないのはどういうわけか魔法でしたが、そうではないようです。

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

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

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

役に立ちましたか?

解決

uart_sendblockのドキュメントがnullポインターを渡すことは問題ないと述べていない限り、おそらくあなたがそうするなら、あなたはおそらく未定義の動作を得るでしょう - そして、この場合、それはあなたがそれを渡すアドレスに書くだけで、それはあなたがそれを渡すアドレス0--それは「未定義の下に行く」行動"。

パラメーターでそれを呼ぶだけで、それについて「賢い」理由はありません。

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

リソースが制約されている場合は、作成してください unused_16 グローバルで、他の場所で再利用します

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top