新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 在MDK上建立一個(gè)C++的STM32開發(fā)工程

在MDK上建立一個(gè)C++的STM32開發(fā)工程

作者: 時(shí)間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
最近,我驚訝地發(fā)現(xiàn)居然可以用C++++進(jìn)行嵌入式程序開發(fā),甚至是裸系統(tǒng)程序。之前,做單片機(jī)開發(fā)、STM32上程序開發(fā),想到的都是C語言、匯編語言,根本就沒有考慮過還可以用C++語言做開發(fā)。近日,在學(xué)習(xí)公司的項(xiàng)目之后,發(fā)現(xiàn)C++有其獨(dú)道之處。開發(fā)起來比C語言更方便架構(gòu)搭建與程序管理。

我之前對(duì)C++有曲解,總認(rèn)為C++只適合做上層應(yīng)用軟件開發(fā),不適用于單片機(jī)開發(fā)。一方面是因?yàn)镃++喜歡來不不就new一個(gè)對(duì)象。對(duì)于內(nèi)存空間非常緊張的單片機(jī),只能望海興嘆。二是C++生成的代碼量較C龐大,效率上可能沒有C高。對(duì)于主頻較低的單片機(jī),也用一點(diǎn)勉強(qiáng)。但是,這并不能掩蓋C++的優(yōu)勢(shì)。C++是面向?qū)ο蟮某绦蛘Z言,能非常靈活地進(jìn)行繼承與派生,還能實(shí)現(xiàn)多態(tài)。對(duì)于較大一點(diǎn)的程序而言,用C作開發(fā),不異于用磚頭砌坐20層的大廈。這樣的大廈既不穩(wěn)定,也不好維護(hù)。相反,C++則可以很好地完成這樣大的任務(wù)。但是,你就蓋個(gè)兩層樓的小平房,需得著什么房屋框架嗎?也沒必要呀。
總而言之,C與C++各有各的優(yōu)勢(shì),就看你怎么用。

本文引用地址:http://2s4d.com/article/201611/318810.htm

我手頭一有塊STM32的開發(fā)板。于是,我嘗試在MDK上建一個(gè)基于C++的Demo工程。板子上有64KB的SRAM,主頻可達(dá)72MHz,也差不多了。

想到C++,我就想到了new 這個(gè)關(guān)鍵字。這個(gè)new 就是從堆里取一塊內(nèi)存空間,并執(zhí)行類的構(gòu)造函數(shù)。
那么這里就要涉及到堆的問題,你必須得告訴程序一個(gè)問題:(1)堆在哪里?(2)堆有多大?

以下是我在main()中對(duì)堆的實(shí)現(xiàn):

  1. #include//_init_alloc
  2. #defineHEAP_SIZE(0x3000)
  3. INT32Uheap_zone[HEAP_SIZE]={0};
  4. intmain()
  5. {
  6. NVIC_Configuration();
  7. OSInit();
  8. _init_alloc((INT32U)heap_zone,(INT32U)&heap_zone[HEAP_SIZE-1]);
  9. CStartTaskstart;
  10. start.Create();
  11. OSStart();
  12. return0;
  13. }

首先聲明,這個(gè)main()所在的文件必須是以.cpp文件,不然編譯當(dāng)成C語言進(jìn)行編譯。C++可以調(diào)用C,C不能調(diào)用C++,這點(diǎn)要記住。以上對(duì)堆的實(shí)現(xiàn)分兩步:
(1)要在SRAM中留一塊空間來做堆。上代就用定義數(shù)組的方式實(shí)現(xiàn)。 INT32U heap_zone[HEAP_SIZE] = 0;
(2)告訴程序堆的起止地址。通過調(diào)用 _init_alloc( startAddr,endAddr );

也不一定非要用這做笨絀的方法定義一塊堆空間。我這塊開發(fā)板上還用FSMC擴(kuò)展了一個(gè)512KB的SRAM。那么我可以用這塊空間來做堆空間。如下:

  1. #include//_init_alloc
  2. #defineHEAP_BASEBank1_SRAM3_ADDR
  3. #defineHEAP_TOP(Bank1_SRAM3_ADDR+0x100000)
  4. intmain()
  5. {
  6. NVIC_Configuration();
  7. FSMC_SRAM_Init();//初始化對(duì)SRAM的訪問
  8. OSInit();
  9. _init_alloc(HEAP_BASE,HEAP_TOP);//設(shè)置堆空間
  10. CStartTaskstart;
  11. start.Create();
  12. OSStart();
  13. return0;
  14. }

SRAM 的首地址就是 HEAP_BASE = Bank1_SRAM3_ADDR , 止地址就是 HEAP_TOP =Bank1_SRAM3_ADDR+0x100000 。
如上調(diào)用完 _init_alloc() 函數(shù)后,你就可以使用 new 進(jìn)行申請(qǐng)空間與創(chuàng)建對(duì)象了。

在工程中凡是 .c 文件都是C源文件,凡是 .cpp 文件都是C++源文件。在將原來部分C語言代碼移植到C++的時(shí)候,要在頭文件的開始與終止處添加以下內(nèi)容:

  1. #ifdef__cplusplus
  2. extern"C"{
  3. #endif
  4. ……//正文
  5. #ifdef__cplusplus
  6. }
  7. #endif

extern "C" { } 用于告訴編譯器,大括號(hào)以內(nèi)的東西以C的方式進(jìn)行編譯。因?yàn)樵瓉?C的頭文件被.CPP文件包含了,那么編譯器便按C++的方式進(jìn)行編譯,導(dǎo)致與原來.C文件中定義的不一致,編譯報(bào)錯(cuò)。



關(guān)鍵詞: MDKC++STM32開發(fā)工

評(píng)論


技術(shù)專區(qū)

關(guān)閉