<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    在 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 RAM、Chrom-ART加速器、MPI-DSI接口、延伸到125度的工作溫度、DFSDM數字濾波器以及各種常見的音頻(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 已經添加成功了。
    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.portaltwn.com/thread-585676-1-1.html     【打印本頁】

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

    廠商推薦

    • Microchip視頻專區
    • Cortex-M4外設 —— TC&TCC結合事件系統&DMA優化任務培訓教程
    • 我們是Microchip
    • 想要避免發生災難,就用MPLAB SiC電源仿真器!
    • 利用模擬開發工具生態系統進行安全電路設計
    • 貿澤電子(Mouser)專區
    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷