本文描述了如何使用在搭載了 RT-Thread 系統的 STM32 平臺上使用 C++,包括 C++的配置和應用等,并給出了在STM32F411 NUCLEO開發板上驗證的代碼示例。
硬件平臺簡介
本文基于意法半導體STM32F411 NUCLEO開發板,給出了 C++的具體應用示例代碼,由于RT-Thread上層應用API的通用性,因此這些代碼不局限于具體的硬件平臺,用戶可以輕松將它移植到其它平臺上。
STM32F411 NUCLEO是意法半導體推出的一款基于ARM Cortex-M4內核的開發板,最高主頻為100Mhz,該開發板具有豐富的板載資源,可以充分發揮STM32F411RE 的芯片性能。
STM32F411RE從屬于銷量名列前茅的STM32F4系列,眾所周知,F4是STM32主打高性能和數字信號處理的“輕奢”系列。
“奢侈”在F4作為內核為Cortex-M4 (DSP+FPU)的MCU,可選180MHz 主頻、2M Flash/384KB RAM、Chrom-ART加速器、MPI-DSI接口、延伸到125度的工作溫度、DFSDM數字濾波器以及各種常見的音頻(SAI)、連接(Ethernet、Camera、USB)、控制(CAN、UART、I2C)、存儲(FMC、2/4/8 bits SPI、SDMMC)外設。
“輕”在價格讓人“輕松”、尺寸“輕巧”(不到3mm*3mm的封裝)、功耗“輕微”。
如何在STM32上使用C++
準備工作
1、下載RT-Thread 源碼
2、下載ENV 工具
3、進入rt-threadspstm32f411-st-nucleo目錄,檢查 BSPrtconfig.py文件和SConstruct文件是否支持C++配置,如下圖所示
檢查rtconfig.py文件中對C++的支持
檢查SConstruct文件中對C++的支持
打開C++支持:
打開Env工具,在Env命令行中輸入menuconfig,進入配置界面,使用menuconfig工具(學習如何使用)配置工程。在menuconfig配置界面依次選擇RT-Thread Components ---> C++ features ---> Support C++ features,如圖所示:
編譯工程:scons --target=mdk51. 生成mdk5工程,將示例代碼附帶的main.cpp替換掉BSP中的main.c并重新加入到工程中,如圖所示:
編譯,下載程序,在終端輸入help命令可以看到test_cpp已經添加成功了。
運行C++程序:
在終端輸入test_cpp運行結果如下圖所示。
C++ 全局對象構造函數的調用
RT-Thread中對全局對象構造函數的實現中,以GNUC為例,在rt-threadcomponentscplusplus目錄下的crt_init.c文件中對C++進行了系統初始化, 在特定的BSP目錄下,連接腳本文件link.lds為C++全局構造函數的代碼分配了段,使C++全局對象構造函數鏈接后能夠存放在指定的段中。如下圖所示:
crt_init.c文件完成了C++系統的初始化工作
C++系統初始化部分:
1RT_WEAKintcplusplus_system_init(void) 2{ 3typedefvoid(*pfunc)(); 4externpfunc__ctors_start__[]; 5externpfunc__ctors_end__[]; 6pfunc*p; 7 8for(p=__ctors_start__;p
在cplusplus_system_init函數中,將全局對象的構造函數依次鏈接到了鏈接腳本文件中為其分配的段中,并且調用了RT-Thread組件自動初始化的宏INIT_COMPONENT_EXPORT,所以在鏈接的時候,C++全局對象構造函數所產生的目標文件就被鏈接到了__ctors_start__和__ctors_end__組成的段中。
鏈接腳本中為C++全局構造函數分配的段部分:
1PROVIDE(__ctors_start__=.);2KEEP(*(SORT(.init_array.*)))3KEEP(*(.init_array))4PROVIDE(__ctors_end__=.);
__ctors_start__分配了C++全局構造函數段的起始地址,__ctors_end__分配了C++全局構造函數段的結束地址,所以全局構造函數在系統初始化的時候,就會被鏈接到這里分配的段地址中。
RT-Thread C++ 異常說明
同樣,在鏈接腳本文件link.lds中,也為C++異常分配了段地址:
1__exidx_start=.;2ARM.exidx:3{4*(.ARM.exidx*.gnu.linkonce.armexidx.*)5_sidata=.;6}>CODE7__exidx_end=.;
__exidx_start分配了C++異常的起始地址,__exidx_end分配了C++異常的結束地址,當異常產生的時候,就會被分配到指定的段地址中。
這里以一個C++除零異常的拋出和捕獲為例:
1#include2 3#defineMIN_VALUE(1e-4) 4#defineIS_DOUBLE_ZERO(d)(abs(d)
當除零異常發生的時候div_func函數會拋出一個異常,在throw_exceptions函數中會去捕獲這個異常。
下載代碼,并在終端輸入throw_exceptions運行結果如下圖所示。
到這一步為止,如何在搭載了RT-Thread系統的STM32平臺上如何使用C++的介紹就結束了。
-
STM32
+關注
關注
2270文章
10904瀏覽量
356414 -
C++
+關注
關注
22文章
2110瀏覽量
73689
原文標題:如何在搭載了RT-Thread系統的STM32平臺上使用C++?
文章出處:【微信號:mcuworld,微信公眾號:嵌入式資訊精選】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論