国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

在 STM32 上使用 C++ 指南

發布時間:2020-4-21 17:33    發布者:嵌入式人生17
STM32 上使用 C++ 指南
簡介
本文描述了如何使用在搭載了 RT-Thread 系統的 STM32 平臺上使用 C++,包括 C++ 的配置和應用等。并給出了在STM32F411 NUCLEO開發板上驗證的代碼示例。
硬件平臺簡介
本文基于意法半導體 STM32F411 NUCLEO開發板,給出了 C++ 的具體應用示例代碼,由于RT-Thread上層應用API的通用性,因此這些代碼不局限于具體的硬件平臺,用戶可以輕松將它移植到其它平臺上。
STM32F411 NUCLEO是意法半導體推出的一款基于ARM Cortex-M4內核的開發板,最高主頻為100Mhz,該開發板具有豐富的板載資源,可以充分發揮STM32F411RE 的芯片性能。
STM32F411RE從屬于銷量名列前茅的STM32F4系列,眾所周知,F4STM32主打高性能和數字信號處理的輕奢系列。
奢侈F4作為內核為Cortex-M4 (DSP+FPU)MCU,可選180MHz 主頻、2M Flash/384KB RAMChrom-ART加速器、MPI-DSI接口、延伸到125度的工作溫度、DFSDM數字濾波器以及各種常見的音頻(SAI)、連接(EthernetCameraUSB)、控制(CANUARTI2C)、存儲(FMC2/4/8 bits SPISDMMC)外設。
在價格讓人輕松、尺寸輕巧”(不到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 已經添加成功了。
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++ 全局對象構造函數的調用
RT-Thread 中對全局對象構造函數的實現中,以 GNUC 為例,在 rt-thread\components\cplusplus 目錄下的 crt_init.c 文件中對 C++ 進行了系統初始化, 在特定的 BSP 目錄下,連接腳本文件 link.lds C++ 全局構造函數的代碼分配了段,使 C++ 全局對象構造函數鏈接后能夠存放在指定的段中。如下圖所示:
file:///C:\Users\Administrator.WIN-STED6B9V5UI\AppData\Local\Temp\ksohtml14784\wps26.png
crt_init.c 文件完成了 C++ 系統的初始化工作
C++ 系統初始化部分:
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 函數中,將全局對象的構造函數依次鏈接到了鏈接腳本文件中為其分配的段中,并且調用了 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 = .;
2    ARM.exidx :
3    {
4        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
5        _sidata = .;
6    } > CODE
7    __exidx_end = .;
__exidx_start 分配了 C++ 異常的起始地址, __exidx_end 分配了 C++ 異常的結束地址,當異常產生的時候,就會被分配到指定的段地址中。
這里以一個 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);
當除零異常發生的時候 div_func 函數會拋出一個異常,在 throw_exceptions 函數中會去捕獲這個異常。
下載代碼,并在終端輸入 throw_exceptions 運行結果如下圖所示。
file:///C:\Users\Administrator.WIN-STED6B9V5UI\AppData\Local\Temp\ksohtml14784\wps27.png
到這一步為止,如何在搭載了 RT-Thread 系統的 STM32 平臺上如何使用 C++ 的介紹就結束了。

本文地址:http://www.qingdxww.cn/thread-585676-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 安靜高效的電機控制——這才是正確的方向!
  • 無線充電基礎知識及應用培訓教程3
  • PIC18-Q71系列MCU概述
  • 基于CEC1712實現的處理器SPI FLASH固件安全彈性方案培訓教程
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久国产乱子伦精品免费强 | 黄色网站在线视频 | 国产在线观看免费一级 | 国内外成人免费视频 | www91| 三级aa久久| 国产又湿又黄又硬又刺激 | 综合网插菊花 | 中文字幕导航 | 日韩在线伦理片免费观看 | 善良朋友的妻子在线观看 | 亚洲国产一区二区三区在线观看 | 亚洲网站www | 一区二区三区免费观看 | 国内视频一区 | 中文字幕欧美日韩高清 | 四虎精品永久免费 | 操好逼| 色婷婷.com| 机机对机机在线观看 | 国产伦理片在线观看 | 香蕉网站狼人久久五月亭亭 | 日韩a毛片 | a毛片免费视频 | 日本韩国一级片 | 麻豆日韩国产精品欧美在线 | 亚洲无限资源 | 四虎影城| 精品区 | jizz亚洲大全| 日日噜噜夜夜狠狠va视频 | 久久精品成人欧美大片免费 | 国产黄色免费观看 | 国产成人aa在线观看视频 | 欧美成人午夜不卡在线视频 | 在线视频一区二区日韩国产 | 日韩在线免费观看视频 | 成人国产激情福利久久精品 | 中国一级特黄毛片 | 亚洲精品自在在线观看 | 免费的三级网站 |