最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

在arm-gcc的環(huán)境下使用C/C++混合編程開發(fā)stm32

2022-12-07 02:25 作者:奧大梨呀  | 我要投稿

????有的時(shí)候在用C進(jìn)行一些面向?qū)ο蟮木幊虝r(shí),總需要考慮很多事情。盡管C也可以做面向?qū)ο缶幊?,Linux內(nèi)核就是這么做的。只是對于我們自己開發(fā)而言相對較麻煩,需要考慮很多事情,自己建立對象模型,再用函數(shù)指針實(shí)現(xiàn)對象的方法等,太過于繁瑣。在需要實(shí)現(xiàn)面向?qū)ο缶幊虝r(shí),C++會(huì)是一個(gè)不錯(cuò)的選擇。

由于某些原因,我開發(fā)stm32程序的平臺(tái)已經(jīng)從MDK5轉(zhuǎn)到了arm-gcc + vscode +openocd的組合模式。MDK5是支持C/C++混合編程的,而且設(shè)置方法非常簡單,網(wǎng)絡(luò)上教程一堆。

那么對于arm-gcc如何配置呢,下文細(xì)說。

首先需要使用stm32CubeMX生成一個(gè)基于Makefile的工程,生成后的工程目錄如下:

?

工程目錄

ST的庫雖然都是.c文件,但是都做了C/C++混合編程的處理,我們只需要修改Makefile即可。

①增加C++文件列表

效仿Makefile里C文件和匯編ASM文件列表的寫法,添加C++的文件列表,往后所有.cpp文件都往此處添加。


②添加arm-g++編譯器

使用arm-g++用來編譯.cpp文件


③添加CPP全局宏定義

還是效仿C全局宏定義的寫法,雖然可以直接使用C的,但是還是規(guī)范些好,萬一以后要添加呢。


④添加CPP編譯選項(xiàng)

還是一樣,效仿C的寫法,不過,在CPPFLAGS后再添加2個(gè)選項(xiàng)

-fno-rtti -fno-exceptions

-fno-rtt?表示不使用RTTI,即運(yùn)行時(shí)類型識(shí)別,這意味著代碼中不能使用typeid和dynamic_cast,但這可以使編譯后的固件文件減小。

-fno-exceptions?表示不捕獲程序異常,此選項(xiàng)也可以減小編譯后的固件文件大小。

⑤添加關(guān)聯(lián)信息

這一項(xiàng)是編譯時(shí)生成關(guān)聯(lián)信息,對鏈接有影響,還是直接拷貝C的實(shí)現(xiàn)。


⑥添加CPP文件列表

這里是利用makefile的語法從一堆源文件名生成對應(yīng)的.o文件名,并且設(shè)置了.c .cpp .s文件的搜索路徑。

⑦添加.cpp文件的編譯規(guī)則

從上面的.c文件編譯規(guī)則復(fù)制下來,將其改成CPP規(guī)則即可。

@和echo是我手動(dòng)添加的,用于精簡編譯輸出信息,與本文內(nèi)容無關(guān)。


????完成以上步驟后,Makefile就修改完成了,下面寫一個(gè)Led.cpp測試一下

?

這里只放.h文件,c文件都是一些方法的實(shí)現(xiàn),避免篇幅太長就不放了。

再看看main.cpp:

?

????如果需要直接在原工程的main.c中編寫C++程序,則需要將main.c修改為main.cpp。

這里我就修改了。

注意,我們在編寫頭文件的時(shí)候,最好加上extern “C”,用宏__cplusplus限制。因?yàn)镃文件調(diào)用某個(gè)寫在CPP的函數(shù)是會(huì)報(bào)錯(cuò)的,因?yàn)镃++支持重載而C不支持。因此需要把一些可能會(huì)在C文件調(diào)用的函數(shù)的聲明用extern “C”{}限制,否則在鏈接那一步會(huì)報(bào)錯(cuò)在C文件里調(diào)用的這個(gè)函數(shù)找不到。

在上面main.cpp中,SysTick_Callback()是我在定義的一個(gè)弱函數(shù),他會(huì)在SysTick中斷中被調(diào)用,這里就是因?yàn)樵趍ain.cpp中實(shí)現(xiàn),原本的弱函數(shù)不會(huì)被替換,因此需要加上extern”C”{}限制才行。

????另外,全局對象的構(gòu)造函數(shù)是在程序還未進(jìn)入main函數(shù)就執(zhí)行了的,如果構(gòu)造函數(shù)里有與硬件相關(guān)的代碼就可能出錯(cuò)。所以盡量避免使用構(gòu)造函數(shù),除非你使用newdelete或者只使用局部變量。上面代碼里可以看出我對于全局對象是使用靜態(tài)方法Create進(jìn)行初始化的。

編譯順利通過

編譯通過

最終程序燒錄到stm32上也能正常運(yùn)行,LED正常閃爍,這里我就不放效果圖了。

最后附上我自己的Makefile完整版供參考


在arm-gcc的環(huán)境下使用C/C++混合編程開發(fā)stm32的評論 (共 條)

分享到微博請遵守國家法律
关岭| 旬邑县| 安福县| 永善县| 镶黄旗| 福清市| 临高县| 汕尾市| 赫章县| 龙门县| 建宁县| 松原市| 巴马| 雷波县| 富顺县| 永福县| 修武县| 东山县| 新津县| 界首市| 浮山县| 延安市| 娄烦县| 渝北区| 昌图县| 泸西县| 太原市| 徐闻县| 土默特左旗| 合山市| 突泉县| 龙江县| 赣榆县| 腾冲县| 措勤县| 温州市| 云南省| 太湖县| 屏山县| 塔城市| 灯塔市|