<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 在MDK上建立一個(gè)C++的STM32開(kāi)發(fā)工程

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

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

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

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

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

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

以下是我在main()中對堆的實(shí)現:

  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文件,不然編譯當成C語(yǔ)言進(jìn)行編譯。C++可以調用C,C不能調用C++,這點(diǎn)要記住。以上對堆的實(shí)現分兩步:
(1)要在SRAM中留一塊空間來(lái)做堆。上代就用定義數組的方式實(shí)現。 INT32U heap_zone[HEAP_SIZE] = 0;
(2)告訴程序堆的起止地址。通過(guò)調用 _init_alloc( startAddr,endAddr );

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

  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();//初始化對SRAM的訪(fǎng)問(wèn)
  8. OSInit();
  9. _init_alloc(HEAP_BASE,HEAP_TOP);//設置堆空間
  10. CStartTaskstart;
  11. start.Create();
  12. OSStart();
  13. return0;
  14. }

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

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

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

extern "C" { } 用于告訴編譯器,大括號以?xún)鹊臇|西以C的方式進(jìn)行編譯。因為原來(lái).C的頭文件被.CPP文件包含了,那么編譯器便按C++的方式進(jìn)行編譯,導致與原來(lái).C文件中定義的不一致,編譯報錯。



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

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>