1. 程式人生 > >讓你的 STM32Cube KEILV5 + HAL庫工程支援C++開發

讓你的 STM32Cube KEILV5 + HAL庫工程支援C++開發

前言

最近這段時間在弄一個新的STM32F4的專案,因為工程比較龐大,然後各種型別也比較複雜,在封裝整理的時候就非常頭疼,很想通過C++的類,繼承,多型的方式來讓程式碼變得清晰簡單。在網上翻閱了比較多的相關資料,發現很多部落格所說的方法要麼太複雜,要麼不能完美相容Cube。隨著ST對HAL庫的不斷更新,各類驅動包其實都已經悄悄的在各種標頭檔案上加入了 extern “C” 的巨集定義,讓C++移植更加方便。我也折騰了一段時間,終於成功的編譯成功了一個帶有C++特性的工程,故來分享一下自己的經驗和一些值得注意的地方。因為我也在探索的過程中,如果大家在嘗試的過程中有遇到其他問題的歡迎評論區討論。

配置C++工程

配置Cube

其實在Cube的配置上沒有多大改變,只建議儘量不要在生成工程的時候不要選中Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral選項。這個感覺像是cube的一個遺漏的地方,如果在此處勾選了這個選項的時候,有部分新增加的標頭檔案沒有extern “C” 的巨集定義 會導致混合編譯出錯。
這裡寫圖片描述
其他的地方沒有什麼特別的,直接生成工程即可。

配置Keil

工程設定

Keilv5原生是支援C++的編譯的,所以在keil裡面我們只需要開啟工程設定,在C/C++選項裡的Misc_Controls里加入–cpp 當然如果原意使用C++11標準的話可以加入 –cpp11 即可.
然後我們還需要確認MicroLib已被禁用。該選項在工程設定中的Target欄的Code Generation裡,取消勾選“Use Micro Lib”即可。

檔案屬性設定

經過上面的設定之後,我們就可以對cpp類檔案使用C++編譯器了,可是問題是,Cube給我們生成的都是.c檔案,這就導致Keil會把它們當做c檔案,使用C編譯器編譯,當我們在這些cube生成好的檔案裡面使用C++特性的時候就會報錯了。所以我們需要把Cube給我們生成的檔案改成C++檔案。但是在此處不宜用更改檔名字尾的方法,因為這樣的話會導致cube以後在修改的時候不會維護.cpp檔案,而是重新給你生成一個.c檔案。為了保證cube的維護性,我們在keil的工程目錄中選中需要使用C++特性的檔案,右鍵點選 “Options for File ‘xxx.c’”,開啟後將File Type裡設定為C++ Source File即可 這樣即使是.c字尾 keil也會將它認為C++檔案進行編譯連結. 這樣我們就可以將C++嵌入到工程裡 並且cube更新的時候這些也不需要重新設定 cube之外的其他使用者檔案直接使用.cpp .hpp並做好extern “C” 的工作即可,不需要這樣設定
這裡寫圖片描述

一些注意事項

建議只把需要用到C++特性的cube檔案設定為C++檔案,不要把一些底層的驅動檔案也設定成C++檔案,因為不知道會有什麼未知的影響。我親身經歷了一次把所有的.c檔案改成c++原始檔型別後編譯時錯誤的絕望….
另外,所有涉及中斷的服務函式必須用 extern “C”作字首(包括定義),因為stm32的中斷服務名是由彙編的啟動程式碼內的向量表決定的,彙編不認得C++的函式名的連結符號。建議的方法是在中斷配置檔案裡的開頭和結尾(都含有cube的 “user code”段)加上extern “C”的標註。

/——————————————————————————

2018年6月4日11:34:06後記:

STM32Cube其實在悄無聲息的對HAL逐漸完善C++的支援 自身體驗F103的HAL庫 生成工程後 只需要注意中斷要extern “C”外 其他的HAL庫都處理好了. 所以用C++開發的同學們可以儘量嘗試新的庫,對C++的支援更優!

相關推薦

STM32Cube KEILV5 + HAL工程支援C++開發

前言 最近這段時間在弄一個新的STM32F4的專案,因為工程比較龐大,然後各種型別也比較複雜,在封裝整理的時候就非常頭疼,很想通過C++的類,繼承,多型的方式來讓程式碼變得清晰簡單。在網上翻閱了比較多的相關資料,發現很多部落格所說的方法要麼太複雜,要麼不能完美

年薪20萬Python工程師進階(7):Python資源大全,相見恨晚的Python python

我是 環境管理 管理 Python 版本和環境的工具 pyenv – 簡單的 Python 版本管理工具。 Vex – 可以在虛擬環境中執行命令。 virtualenv – 建立獨立 Python 環境的工具。 python程式語言學習 扣群515267276 virtualen

年薪20萬Python工程師進階(7):Python資源大全,相見恨晚的Python python

我是 環境管理 管理 Python 版本和環境的工具 pyenv – 簡單的 Python 版本管理工具。 Vex – 可以在虛擬環境中執行命令。 virtualenv – 建立獨立 Python 環境的工具。 python程式語言學習 扣群515267276

年薪20萬Python工程師進階(7):Python資源大全,相見恨晚的Python

我是 環境管理 管理 Python 版本和環境的工具 pyenv – 簡單的 Python 版本管理工具。 Vex – 可以在虛擬環境中執行命令。 virtualenv – 建立獨立 Python 環境的工具。 virtualenvwrappe

Python資源大全,相見恨晚的Python

環境管理管理 Python 版本和環境的工具p – 非常簡單的互動式 python 版本管理工具

Python資源大全,相見恨晚的Python

請點選此處輸入圖片描述環境管理管理 Python 版本和環境的工具p – 非常簡單的互動式 py

[HAL學習筆記] HAL原始檔stm32h7xx_hal.c學習筆記。

[HAL學習筆記] HAL庫原始檔stm32h7xx_hal.c學習筆記,此檔案極其重要(2018-07-21 V1.0) 原文地址:forum.armfly.com/forum.php?mod=viewthread&tid=87760 說明: 1、在中斷裡面使用HAL_Dela

工程支援MFC

要想使你的工程支援MFC,請按照以下步驟作:1:在你的stdafx.h的標頭檔案中加入:#include <afxtempl.h>這是一個囊括了MFC的集合定義的標頭檔案,有了它,你的工程就識別Cstring類了。2:在你的工程設定中,在General頁中,選擇“

【有趣的全綵LED | 程式設計】用STM32 HALWS2812B為所動

一、效果展示         觀看演示效果:https://www.bilibili.com/video/BV1dv411Y7x3   使用STM32 HAL庫程式設計 PWM+DMA控制輸出,CubeMX生成初始工程 實現全綵音樂燈 WS2812B全綵

提前認識軟件開發(29):數據腳本文件的布局

ast base _id 用戶 提前 質量 init 交流 實現 第2部分 數據庫SQL語言數據庫腳本文件的布局 “沒有規矩。不成方圓”,規範數據庫腳本文件的代碼布局具有下面重要意義: (1) 可表現出代碼良好的邏輯結構。提高代碼的準確性、連續

提前認識軟件開發(34):數據的維護

可能 機制 upd times 初始化 帶來 接收 DDU 就會 第2部分 數據庫SQL語言數據庫的維護 對於某些大型軟件產品,一旦商用,必定會存儲非常多用戶信息,這就對產品所使用的數據庫(下面簡稱業務數據庫)帶來了壓力。為了保證業務數據庫的平穩執行,須要

揭秘數據面試,技術面試一次過

得此寶典 讓技術面試更簡單 大家可以叫我老張,網名superZS!一直從事數據庫行業10余年,工作於某數據庫服務公司,兼數據庫資深講師,就面試中大家遇到的比較困惑的數據庫問題,和剛進入數據庫領域的同學們,我在這裏給大家做一個詳細的總結,希望對大家在工作或者面試中有所幫助,老師會傾囊相授,道行尚淺,大家

學會這15點,分分鐘拿下Redis數據

redis redis集群 linux運維 架構 1、Redis簡介 REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統。Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網絡、可基於

6 個 Python 的日期時間的Python更加得心應手!

dateutil etime sco lar code sla logs log mage 內建的 datetime 模塊 讓我們看看其他庫是如何處理這種轉換的。 Dateutil 通過 Arrow datetime 類的實例,你可以訪問 Arro

的ubuntu系統支援CPU動態調頻

首先,你得確保你的電腦是支援並且打開了CPU動態調頻功能的,方法如下: (我用的是的DELL機) (1)開機後進入BIOS,找到performance選項,在speedset子選項中你會看到你的CPU動態調頻是否開啟了,如果未開啟,要開啟。 (2)檢視你的核心是否安裝了

事半功倍的小眾 Python

Python 是世界上發展最快的程式語言之一。它一次又一次地證明了自己在開發人員和跨行業的資料科學中的實用性。Python 及其機器學習庫的整個生態系統使全世界的使用者(無論新手或老手)都願意選擇它。Python 成功和受歡迎的原因之一是存在強大的庫,這些庫使 Python 極具創造力且執行快

10分鐘的站點也支援Markdown

Markdown簡介 Markdown 是一種輕量級的「標記語言」,它的優點很多,目前也被越來越多的寫作愛好者,撰稿者廣泛使用。Markdown 的語法十分簡單,常用的標記符號也不超過十個,這種相對於更為複雜的 HTML 標記語言來說,Markdown 可謂是十分輕量的,學習

maven工程中如何引入jstl標籤支援

JSTL的目的就是在JSTL頁面中美觀的輸出資料,它內建了很多標籤庫,包括很多邏輯判斷,迭代,函式,資料庫標籤,如果沒有JSTL標籤的話,JSP中的頁面就得通過<% java 程式碼%>輸出。這樣也不方便看,也不方便開發維護。 工程中的引入步驟如下:很簡單 一

showdown的網站支援Markdown和程式碼塊highlight

在CSDN寫部落格應該都用過Markdown吧,一種簡單的標記語言。而有人拿他跟所見即所得編輯器比較,怎麼感覺也對不上。那麼在各大論壇、內容網站都支援Markdown的情況下,我們該怎麼實現呢?搜尋了半天也很少見到相關的資料,在此記錄下自己的研究供大家學習。 所需檔案: - mar

的Android應用支援轉移到SD卡

            如果手機在安裝了幾款應用後發現的確儲存空間不夠,由此想到如果能夠將應用安裝到SD卡里面就好了,其實如果你的應用不能轉移到SD卡上的話,被解除安裝的機率又大了點。Android系統在2.1版本之前,應用程式是隻能安裝到機身記憶體(RAM)中,這一特性