最近,我驚訝地發現居然可以用c++進行嵌入式程式開發,甚至是裸系統程式。之前,做微控制器開發、stm32上程式開發,想到的都是c語言、組合語言,根 本就沒有考慮過還可以用c++語言做開發。近日,在學習公司的專案之後,發現c++有其獨道之處。開發起來比c語言更方便架構搭建與程式管理。
總而言之,c與c++各有各的優勢,就看你怎麼用。
我手頭一有塊stm32的開發板。於是,我嘗試在mdk上建乙個基於c++的demo工程。板子上有64kb的sram,主頻可達72mhz,也差不多了。
想到c++,我就想到了new 這個關鍵字。這個new 就是從堆裡取一塊記憶體空間,並執行類的建構函式。
那麼這裡就要涉及到堆的問題,你必須得告訴程式乙個問題:(1)堆在**?(2)堆有多大?
以下是我在main()中對堆的實現:
#include //_init_alloc
#define heap_size (0x3000)
int32u heap_zone[heap_size] = ;
int main()
首先宣告,這個main()所在的檔案必須是以.cpp檔案,不然編譯當成c語言進行編譯。c++可以呼叫c,c不能呼叫c++,這點要記住。以上對堆的實現分兩步:
(1)要在sram中留一塊空間來做堆。上代就用定義陣列的方式實現。 int32u heap_zone[heap_size] = 0;
(2)告訴程式堆的起止位址。通過呼叫 _init_alloc( startaddr, endaddr );
也不一定非要用這做笨絀的方法定義一塊堆空間。我這塊開發板上還用fsmc擴充套件了乙個512kb的sram。那麼我可以用這塊空間來做堆空間。如下:
#include //_init_alloc
#define heap_base bank1_sram3_addr
#define heap_top (bank1_sram3_addr+0x100000)
int main()
sram 的首位址就是 heap_base = bank1_sram3_addr , 止位址就是 heap_top = bank1_sram3_addr+0x100000 。
如上呼叫完 _init_alloc() 函式後,你就可以使用 new 進行申請空間與建立物件了。
在工程中凡是 .c 檔案都是c原始檔,凡是 .cpp 檔案都是c++原始檔。在將原來部分c語言**移植到c++的時候,要在標頭檔案的開始與終止處新增以下內容:
#ifdef __cplusplus
extern "c"
#endif
extern "c" 用於告訴編譯器,大括號以內的東西以c的方式進行編譯。因為原來.c的標頭檔案被.cpp檔案包含了,那麼編譯器便按c++的方式進行編譯,導致與原來.c檔案中定義的不一致,編譯報錯。
限定乙個類物件在堆或者棧上建立
建立物件通常有兩種方法,如下 第一種方式是靜態建立,第二種方式是動態建立。aa a p new a 1 靜態建立類物件 是由編譯器為物件在棧空間中分配記憶體,是通過直接移動棧頂指標,挪出適當的空間,然後在這片記憶體空間上呼叫建構函式形成乙個棧物件。使用這種方法,直接呼叫類的建構函式。2 動態建立類物...
C 在MVC中如何建立乙個執行緒
這個其實是很簡單的,但是網上的例子大多是控制台應用程式中實現的。在mvc中的都沒看到過,如果沒用過。會遇到一些問題。首先是乙個要呼叫的方法 public class rabbitmqinstance global.asax 中的實現 th.start 第二種實現 thread th1 new thr...
在github上用命令列建立乙個新的儲存庫
將寫好的 傳到github上時,需要先建立乙個新的儲存庫,步驟如下 1.touch readme.md 建立名為readme.md的檔案 2.git init git初始化 3.git add readme.md 把readme.md的檔案加到git上 4.git commit m first co...