<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          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)搭建與程序管理。

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

          本文引用地址:http://www.ex-cimer.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()中對堆的實(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)要記住。以上對堆的實(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();//初始化對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)行申請空間與創(chuàng)建對象了。

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



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

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();