簡體   English   中英

使用 CMake 構建 STM32 固件時的中斷處理

[英]Interrupt handling while using CMake to build STM32 firmware

我調試使用 CMake 創建的 STM32 項目。 它使用 HAL 庫,一開始我配置了 HAL 和 SysTick。

root/
├─ core/
│  ├─ core.c
│  ├─ core.h
│  ├─ stm32g4xx_it.c
│  ├─ stm32g4xx_it.h
│  ├─ CMakeLists
├─ main.c
├─ startup.s
├─ CMakeLists.txt

startup.s文件包含弱 SysTick_Handler,如下:

.weak   SysTick_Handler
.thumb_set SysTick_Handler,Default_Handler

stm32g4xx_it.c還包含覆蓋弱聲明的SysTick_Handler 問題是當編譯、鏈接和加載應用程序時,如上所示,SysTick 中斷以Default_Handler結束。 如果我從startup.s文件中刪除弱聲明,則它可以正常工作並執行正確的處理程序 function。 我認為這是 cmake 工作方式的結果。 在根目錄有一個主 CMakeLists.txt 文件,它編譯startup.smain.c文件,然后鏈接核心庫。 正確的SysTick handler放置在核心庫中,因此startup.s文件的編譯“看不到”此處理程序 function 的其他實現。 解決它的正確而優雅的方法是什么?

我想到的另一個問題是我應該如何為其他中斷處理程序編寫代碼以及如何在 CMake 構建系統中鏈接它們? 假設我有一個 UART 模塊,並且該模塊有自己的中斷處理程序。 我是否應該創建一個基於startup.s文件的單獨庫並將所有其他具有中斷處理程序的模塊鏈接到它? 我認為 CMake 應該使構建更加透明、可讀和容易,但這樣看起來更像意大利面條。 可能我錯過了一些東西......


編輯 2021 年 4 月 14 日

我發現問題僅與啟動 asm 文件有關。 例如,我可以在main.c中創建一個弱 function 符號,例如:

__attribute__((weak)) void SystemInit(void)

在核心庫中,在core.c我創建 function:

void SystemInit(void)

然后在編譯並從core.c鏈接正確的 function 之后。 所以看起來這里有一些與 asm 文件嚴格相關的東西。

這種 linker 行為的原因是它以不同的方式處理庫。 當它在源文件中找到弱符號時,它會停止在庫中查找相同的符號。 原因是庫提供了一些功能,開發人員應該能夠覆蓋這些功能以使它們與自己的項目保持一致。

無需在微控制器的嵌入式項目中使用庫。 我發現它會引起更多的痛苦。 一些開發人員不在他們的CMakeLists.txt中使用庫add_library() 在使用 CMake 時,我覺得它不是很合理。 它用於更好地組織項目文件和管理模塊之間的依賴關系。

使用OBJECT庫可以簡單地解決這里的問題。 在 3.12 版本中,該類型的鏈接已添加到target_link_libraries 我認為它是專門為微控制器項目添加的,而且效果非常好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM