この件については他の多くの質問で議論されていることがわかりましたが、私の場合は答えを見つけることができません。STM32 SPIのハードウェアと厳密なエイリアシングの警告
私はSTM32F0マイクロコントローラを使用しています。 SPI受信/送信FIFOの最上部は、メモリアクセスによってアクセス可能である。この特定のマイクロコントローラを使用すると、FIFOの先頭から8ビットまたは16ビットを読み書きすることができます。より正確には、LDRB/STRB命令が実行されると8ビットがFIFOからポップ/プッシュされ、LDRH/STRH命令が実行されるとFIFOから16ビットがポップ/プッシュされます。
STMicroelectronicが提供するハードウェアアブストラクションレイヤは、SPI FIFOを読み取るためにこの構文を提案しています。
DR
が、私はこの構文を使用して、私のソフトウェアを構築してきましたし、それが正常に動作しないSPI FIFO
の上uint32_t*
ポインティングある
return *(volatile uint8_t*)&_handle->Instance->DR; // Pop 1 byte
return *(volatile uint16_t*)&_handle->Instance->DR; // Pop 2 byte
*(volatile uint8_t*)&_handle->Instance->DR = val; // Push 1 byte
*(volatile uint16_t*)&_handle->Instance->DR = val; // Push 2 bytes
。唯一の問題は、g ++が型打ちに関する多くの警告を出すことです。より正確には:
INC /ドライバ/ SPI.h:70:50:警告:厳密なエイリアシング規則を破るであろう型punnedポインタを逆参照[-Wstrictエイリアシング]
return *(volatile uint16_t*)&_handle->Instance->DR;
いくつかの後ユニオンを使用しているように見えるのは、C++では良い考えではありません。とにかく試してみましたが、いくつか問題がありました。実際には、ユニオン内のポインタを介してメモリにアクセスすると、アライメントされていないメモリアクセスと同じように、マイコンがクラッシュします。 C-スタイルは
を唱えるよう
はstatic_castとreinterpret_castは私の最終目標は、コンパイラがLDRB/STRBとLDRH/STRH命令を使用することですので、私はvoid*
でmemcpy
を使用することはできません警告samesをスローします。
スタックオーバーフローで見つかったその他の提案された解決策は、ユースケースに依存していました。
提案がありますか?
私は上記のコードスニペットを信頼するとは確信していません。私はそれがOKであることを確認するためにアセンブラを見ることをお勧めします。また、警告をオフにすると、他の問題が発生する可能性があります。私は私の解決策が警告を "抑制"しているとは思えないが、実際には正確で移植性のある定義された方法で作業している。個人的には、ボイドポインタを避けるのが最善だと思います。 –