在MDK上建立乙個C 的STM32開發工程

2021-09-23 21:27:22 字數 1462 閱讀 3624

最近,我驚訝地發現居然可以用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...