我已經看到這個問題已經在許多其他問題中討論過,但我無法完全找到我的具體情況的答案。STM32 SPI硬件和嚴格的別名警告
我正在使用STM32F0微控制器。 SPI接收/發送FIFO的頂部可通過內存訪問進行訪問。這個特殊的微控制器允許我從FIFO頂部讀取8位或16位數據。更確切地說,當執行LDRB/STRB指令時,從FIFO中彈出/推送8位數據,並且當執行LDRH/STRH指令時,從FIFO中彈出/推送16位數據。
STMicroelectronic提供的硬件抽象層提出了這種語法來讀取SPI FIFO。
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
凡DR
是uint32_t*
指向上的SPI FIFO
我已經使用這個語法建立我的軟件頂部,它做工精細。唯一的問題是,g ++會拋出很多關於類型竄改的警告。更確切地說:
公司/驅動器/ spi.h中:70:50:警告:提領類型-punned指針將打破嚴格走樣規則[-Wstrict走樣]
return *(volatile uint16_t*)&_handle->Instance->DR;
經過一段閱讀它看起來像使用聯合在C++中不是一個好主意。無論如何,我確實嘗試過,但遇到了一些問題。實際上,通過聯合中的指針訪問內存使我的微控制器崩潰,就像未對齊的內存訪問一樣。
的static_cast和reinterpret_cast的拋出薩姆斯警告作爲C樣式轉換
,因爲我的最終目標是使編譯器使用LDRB/STRB和LDRH/STRH指令我不能使用memcpy
與void*
。
其他提出的解決方案,我發現棧溢出取決於用例。
有什麼建議嗎?
我不確定我會信任上面的代碼片段。我會建議看看彙編器來檢查它是否正常。同時關閉警告意味着您可能會錯過其他問題。我認爲我的解決方案不是「壓制」警告,而是實際上是以正確和可移植的方式工作。我個人認爲最好避免void指針。 –