在 STM32 上使用 C++ 指南 簡介 本文描述了如何使用在搭載了 RT-Thread 系統(tǒng)的 STM32 平臺上使用 C++,包括 C++ 的配置和應用等。并給出了在STM32F411 NUCLEO開發(fā)板上驗證的代碼示例。 硬件平臺簡介 本文基于意法半導體 STM32F411 NUCLEO開發(fā)板,給出了 C++ 的具體應用示例代碼,由于RT-Thread上層應用API的通用性,因此這些代碼不局限于具體的硬件平臺,用戶可以輕松將它移植到其它平臺上。 STM32F411 NUCLEO是意法半導體推出的一款基于ARM Cortex-M4內(nèi)核的開發(fā)板,最高主頻為100Mhz,該開發(fā)板具有豐富的板載資源,可以充分發(fā)揮STM32F411RE 的芯片性能。 STM32F411RE從屬于銷量名列前茅的STM32F4系列,眾所周知,F4是STM32主打高性能和數(shù)字信號處理的“輕奢”系列。 “奢侈”在F4作為內(nèi)核為Cortex-M4 (DSP+FPU)的MCU,可選180MHz 主頻、2M Flash/384KB RAM、Chrom-ART加速器、MPI-DSI接口、延伸到125度的工作溫度、DFSDM數(shù)字濾波器以及各種常見的音頻(SAI)、連接(Ethernet、Camera、USB)、控制(CAN、UART、I2C)、存儲(FMC、2/4/8 bits SPI、SDMMC)外設。 “輕”在價格讓人“輕松”、尺寸“輕巧”(不到3mm*3mm的封裝)、功耗“輕微”。 file:///C:\Users\Administrator.WIN-STED6B9V5UI\AppData\Local\Temp\ksohtml14784\wps19.png 如何在 STM32 上使用 C++準備工作 1、下載 RT-Thread 源碼 2、下載 ENV 工具 3、進入rt-thread\bsp\stm32f411-st-nucleo 目錄,檢查 BSP rtconfig.py 文件和 SConstruct 文件是否支持 C++ 配置,如下圖所示 檢查 rtconfig.py 文件中對 C++ 的支持 file:///C:\Users\Administrator.WIN-STED6B9V5UI\AppData\Local\Temp\ksohtml14784\wps20.png 檢查 SConstruct 文件中對 C++ 的支持 file:///C:\Users\Administrator.WIN-STED6B9V5UI\AppData\Local\Temp\ksohtml14784\wps21.png 打開 C++ 支持: 打開 Env 工具,在 Env 命令行中輸入 menuconfig,進入配置界面,使用 menuconfig 工具(學習如何使用)配置工程。在 menuconfig 配置界面依次選擇 RT-Thread Components ---> C++ features ---> Support C++ features,如圖所示: file:///C:\Users\Administrator.WIN-STED6B9V5UI\AppData\Local\Temp\ksohtml14784\wps22.png 編譯工程: scons --target=mdk5 1. 生成 mdk5 工程,將示例代碼附帶的 main.cpp 替換掉 BSP 中的 main.c 并重新加入到工程中,如圖所示: file:///C:\Users\Administrator.WIN-STED6B9V5UI\AppData\Local\Temp\ksohtml14784\wps23.png 編譯,下載程序,在終端輸入 help 命令可以看到 test_cpp 已經(jīng)添加成功了。 file:///C:\Users\Administrator.WIN-STED6B9V5UI\AppData\Local\Temp\ksohtml14784\wps24.png 運行 C++ 程序: 在終端輸入 test_cpp 運行結果如下圖所示。 file:///C:\Users\Administrator.WIN-STED6B9V5UI\AppData\Local\Temp\ksohtml14784\wps25.png C++ 全局對象構造函數(shù)的調(diào)用 RT-Thread 中對全局對象構造函數(shù)的實現(xiàn)中,以 GNUC 為例,在 rt-thread\components\cplusplus 目錄下的 crt_init.c 文件中對 C++ 進行了系統(tǒng)初始化, 在特定的 BSP 目錄下,連接腳本文件 link.lds 為 C++ 全局構造函數(shù)的代碼分配了段,使 C++ 全局對象構造函數(shù)鏈接后能夠存放在指定的段中。如下圖所示: file:///C:\Users\Administrator.WIN-STED6B9V5UI\AppData\Local\Temp\ksohtml14784\wps26.png crt_init.c 文件完成了 C++ 系統(tǒng)的初始化工作 C++ 系統(tǒng)初始化部分: 1RT_WEAK int cplusplus_system_init(void) 2{ 3 typedef void(*pfunc)(); 4 extern pfunc __ctors_start__[]; 5 extern pfunc __ctors_end__[]; 6 pfunc *p; 7 8 for (p = __ctors_start__; p < __ctors_end__; p++) 9 (*p)(); 10 11 return 0; 12} 13INIT_COMPONENT_EXPORT(cplusplus_system_init); 在 cplusplus_system_init 函數(shù)中,將全局對象的構造函數(shù)依次鏈接到了鏈接腳本文件中為其分配的段中,并且調(diào)用了 RT-Thread 組件自動初始化的宏 INIT_COMPONENT_EXPORT,所以在鏈接的時候,C++全局對象構造函數(shù)所產(chǎn)生的目標文件就被鏈接到了__ctors_start__和__ctors_end__組成的段中。 鏈接腳本中為 C++ 全局構造函數(shù)分配的段部分: 1PROVIDE(__ctors_start__ = .); 2KEEP (*(SORT(.init_array.*))) 3KEEP (*(.init_array)) 4PROVIDE(__ctors_end__ = .); __ctors_start__ 分配了 C++ 全局構造函數(shù)段的起始地址, __ctors_end__ 分配了 C++ 全局構造函數(shù)段的結束地址,所以全局構造函數(shù)在系統(tǒng)初始化的時候,就會被鏈接到這里分配的段地址中。 RT-Thread C++ 異常說明同樣,在鏈接腳本文件 link.lds 中,也為 C++ 異常分配了段地址: 1 __exidx_start = .; 2 ARM.exidx : 3 { 4 *(.ARM.exidx* .gnu.linkonce.armexidx.*) 5 _sidata = .; 6 } > CODE 7 __exidx_end = .; __exidx_start 分配了 C++ 異常的起始地址, __exidx_end 分配了 C++ 異常的結束地址,當異常產(chǎn)生的時候,就會被分配到指定的段地址中。 這里以一個 C++ 除零異常的拋出和捕獲為例: 1 #include 2 3 #define MIN_VALUE (1e-4) 4 #define IS_DOUBLE_ZERO(d) (abs(d) < MIN_VALUE) 5 6 double div_func(double x, double y) 7 { 8 if (IS_DOUBLE_ZERO(y)) 9 { 10 throw y; /* throw exception */ 11 } 12 13 return x / y; 14 } 15 16 void throw_exceptions(void *args) 17 { 18 try 19 { 20 div_func(6, 3); 21 rt_kprintf("there is no err\n"); 22 div_func(4, 0); /* create exception*/ 23 rt_kprintf("you can run here?\n"); 24 } 25 catch(double) /* catch exception */ 26 { 27 rt_kprintf("error of dividing zero\n"); 28 } 29 } 30 31 MSH_CMD_EXPORT(throw_exceptions, throw cpp exceptions); 當除零異常發(fā)生的時候 div_func 函數(shù)會拋出一個異常,在 throw_exceptions 函數(shù)中會去捕獲這個異常。 下載代碼,并在終端輸入 throw_exceptions 運行結果如下圖所示。 file:///C:\Users\Administrator.WIN-STED6B9V5UI\AppData\Local\Temp\ksohtml14784\wps27.png 到這一步為止,如何在搭載了 RT-Thread 系統(tǒng)的 STM32 平臺上如何使用 C++ 的介紹就結束了。 |