我們很高興地宣布,在Visual Studio 2022預覽版中,我們添加了新的對嵌入式系統的開發支持。通過協同使用vcpkg包管理器,你可以快速地搭建好一個嵌入式開發環境并迅速展開工作。
在這篇文章中,我們将會介紹嵌入式工作負載的安裝,如何通過vcpkg獲取相關的依賴包,然後我們會展示在Visual Studio中借助外圍寄存器和RTOS對象視圖來進行代碼編輯,構建,部署和調試一個嵌入式項目。我們将會通過一個Azure RTOS ThreadX項目來展示所有這些新特性。
Azure RTOS ThreadX 是一個在MCU上廣泛使用的RTOS系統。我們還在Visual Studio的幫助文檔中附帶了對Azure IoT DevKit, NXP 1060和STMicro STM32L4 L4 等開發闆的使用說明。如果你使用的是其他廠家的開發闆,則應該可以通過修改相應的配置來快速适配。
安裝過程首先,你需要下載安裝最新版本的Visual Studio 2022,然後選擇”Linux and embedded development with C workload”。在默認情況下,你所需要的組件都會被選中,如下圖所示:
對于嵌入式開發來說,其中一個難點就是配置好需要的工具和組件。通常不同項目有着不同的編譯工具鍊和調試工具。這就是vcpkg包管理器可以派上用場的地方。下面我們會演示下如何通過vcpkg來搭建我們的嵌入式開發環境,後面我們将會把它們整合到Visual Studio中,從而提供一個更加流暢的用戶體驗。
首先打開PowerShell命令行,然後克隆AZzure RTOS項目代碼。它将會作為我們演示的一個例子項目。
然後導航至開發闆對應的子目錄,我使用的是Azure IoT DevKit,如下圖所示:
如果你還沒有安裝vcpkg,則可以參考下圖進行安裝:
在項目目錄下,有一個vcpkg_configuration.json文件。這個清單文件是由vcpkg創建,主要用來記錄編譯和調試項目所需要用到的工具。可以參考vcpkg文檔來創建你自己的清單文件。執行vcpkg activate命令将會使用這個文件來按需安裝這些工具。
通過上面的三條命令,我們就可以完成嵌入式項目的克隆,vcpkg包管理器的安裝和依賴工具的安裝和激活了。下面開始做正事兒。
使用Visual Studio 進行嵌入式開發目前vcpkg還沒有整合到Visual Studio中,所以當前我們需要在上面已經激活的命令行窗口中啟動Visual Studio,這樣就可以确保需要使用到的工具對于Visual Studio是可見的。
請注意,如果你的電腦上安裝了多個不同版本的Visual Studio,則你可能需要指定需要預覽版的全路徑,例如:
至此,我們就已經在Visual Studio中打開了例子項目,就和其他CMake項目一樣。Visual Studio可以通過預定義好的CMakePresets文件來運行CMake編譯過程。和往常一樣,可以使用Visual Studio來編寫嵌入式代碼。在這個Azure RTOS項目中,我們會展示代碼導航,IntelliSense,構建,部署和調試等功能。我們還會演示新的寄存器診斷支持和RTOS對象視圖。
代碼導航和IntelliSense通過Ctrl T可以打開”Go to All and type”按鈕,然後選擇對應的按鈕進行代碼導航。請注意,我們可以将光标懸浮在這個函數上,然後它會展開TIM3->CCR1這個寄存器的值,如下圖所示:
下面我們演示如何在RGB_LED_SET_R()這個函數上設置斷點。要查看如何控制啟動,請選擇查看解決方案資源管理器中的所有文件并打開 .VS\launch.vs.json。 你可以看到 miDebuggerPath 設置為使用 arm-none-eabi-gdb,而 debugServerPath 設置為使用 debugServerArgs 中的配置腳本調用 openocd。 用于描述外設寄存器的信息由 MCU 制造商在我們用 svdPath 指向的 SVD 文件中提供。 該項目被配置在入口處中斷,具有屬性 stopAtConnect。
現在,将你的開發闆插入 PC(并安裝 ST-LINK 驅動程序),将調試目标設置為 Launch,F5 将使用 vcpkg 獲取的 openocd 進行工作,以刷新和調試連接的電路闆。 執行在入口函數處停止,所以在這裡我們看到了它的彙編代碼。 我們還可以通過轉到菜單 Debug > Windows > Disassembly 來查看反彙編,如下圖所示:
現在按下開發包闆上的 A 按鈕。 這觸發了我們的斷點。 我們現在可以轉到菜單 Debug > Windows > Embedded Registers。 這将使用啟動配置中指定的 SVD 文件中的信息打開外設寄存器視圖。 我們現在可以滾動這個列表來找到我們感興趣的寄存器,這裡是 TIM3->CCR1,當我們跳過 RGB_LED_SET_R 函數時它會更新。
下圖是斷點觸發時的界面:
下圖是步進調試:
我們的例子項目中的應用程序有多個線程,但你不會在現有線程窗口中看到它們。
有關這個的解釋請看下面的描述:“實時操作系統是為應用程序提供服務和管理處理器資源的系統軟件。 這些資源包括處理器周期、内存、外設和中斷。 實時操作系統的主要目的是在嵌入式軟件必須執行的各種任務之間分配處理時間。 這通常涉及将軟件分成多個部分,通常稱為“任務”或“線程”,并創建一個運行環境,為每個線程提供自己的虛拟微處理器(“多線程”)。 基本上,虛拟微處理器由一組虛拟的微處理器資源組成,例如寄存器組、程序計數器、堆棧存儲區和堆棧指針。 線程僅在執行時才使用物理微處理器資源,但每個線程都保留這些資源内容的副本,就好像它們是自己的私有資源(線程的“上下文”)。”
因此,理想情況下,對于嵌入式開發,你将擁有可以向您顯示有關這些 RTOS 對象的信息的視圖。 要查看新的可用 RTOS 對象視圖,請轉到菜單 Debug > Windows > RTOS Objects。 在這裡你将看到 ThreadX 提供的對象的選項,在這裡我們将選擇線程。
線程視圖一目了然地顯示了你在嵌入式開發過程中通常需要的許多信息、線程 ID 和名稱、它們運行的次數、堆棧的開始、結束位置、堆棧大小以及最大堆棧使用量。
還有其他 ThreadX 對象的其他視圖,如塊和字節池、事件、互斥鎖、隊列和計時器。 我們也有 FreeRTOS 的 RTOS 對象視圖,盡管那裡的可用對象因其支持的内容而異。
硬件斷點限制最後一個需要調用的調試功能是嵌入式硬件目标通常隻有一組有限的可用硬件斷點。 設置過多會破壞調試器狀态。 因此,我們在 launch.vs.json 中添加了 hardwareBreakpoints。 對于這個設置為它支持的值是 6 的開發闆。如果我們設置的更多,我們将看到斷點沒有設置,我們會收到一個警告,它不會被觸發。 這可以防止破壞與電路闆的連接,并使我們有機會取消設置其他一些斷點并繼續不間斷地調試。
說了這麼多,總的來說,就是:終于可以在VS中搞嵌入式開發了。遙想當年,在VI裡瞅着屏幕鼓搗C代碼的熱血年代。
最後Microsoft Visual C 團隊的博客是我非常喜歡的博客之一,裡面有很多關于Visual C 的知識和最新開發進展。大浪淘沙,如果你對Visual C 這門古老的技術還是那麼感興趣,則可以經常去他們那(或者我這)逛逛。本文來自:《Embedded Software Development in Visual Studio》
最近我寫了個東西正如你們所知道的,拓撲梅爾智慧辦公平台(Topomel Box)是一款綠色軟件,主要面向經常使用電腦的朋友。它提供了各種提升辦公效率的小功能,同時操作上盡可能地簡單方便。我想:你值得擁有。