關於微控制器程式執行的一些理解

2021-07-24 09:09:32 字數 1474 閱讀 5744

關於程式的執行,以前想的不多,沒有意識到乙個程式在執行時,從**讀指令,資料又寫在**。

從微控制器上知道,在上電的那一刻,mcu的程式指標pc會被初始化為上電復位時的位址,從哪個位址處讀取將要執行的指令,由此程式在mcu上開始執行(當然在呼叫程式的 main之前,還有一系列其他的的初始化要做,如堆疊的初始化,不過這些我們很少回去修改)。pc在上電時,和mcu差不多,不過讀取的是bios,有它完成了很多初始化操作,最後,呼叫系統的初始化函式,將控制權交給了作業系統,於是我們看到了windows,linux系統啟動了。如果將作業系統看作是在處理器上跑的乙個很大的裸機程式(就是直接在硬體上跑的程式,因為作業系統就是直接跑在cpu上的,這樣看待是可以的,不過這個裸機程式功能很多,很強大),那麼作業系統的啟動很像mcu程式的啟動。前者有乙個很大的初始化程式完成很複雜的初始化,後者有一段不長的彙編**完成一些簡單的初始化。這一點看,它們在流程上是很相似的。

如果是系統上的程式啟動呢?它們是由系統來決定的。linux上在shell下輸入./p後,首先檢查是否是乙個內建的shell命令;如果不是,則shell假設他是乙個可執行檔案(linux上一般是elf格式),然後呼叫一些相關的函式,將在硬碟上的p檔案的內容拷貝到記憶體(ddr ram)中,並建立乙個它的執行環境(當然這裡邊還有記憶體對映,虛擬記憶體,連線與載入,等一些其他東西),準備執行。

由以上可知,微控制器上的程式和平時在系統上執行的程式,在啟動時差異是很大的(如果將程式呼叫main以前的動作,都抽象為初始化的話,程式的啟動可以簡化為:建立執行環境+呼叫main函式,這樣程式的執行差異是不大的)。因為微控制器上跑的程式(裸機程式),是和作業系統一樣跑在硬體上的,它們屬於乙個層次的。過去之所以沒有區分出微控制器上的程式和pc機上的程式的一些差異,就是沒有弄明白這一點。

由此,以前的一些疑惑也就解開了。為什麼在微控制器上的程式不怎麼使用malloc,而pc上經常使用?因為微控制器上沒有已經寫好的記憶體管理演算法的**,而在pc上作業系統裡執行的程式,libc已經把這些都做了,只需要呼叫就可以了。如果在微控制器上想用動態記憶體,也可以,但是這些**要自己去實現,並定義乙個相應的malloc,有時候一些公司會給提供一些庫函式可能會實現malloc,但是因為微控制器上ram記憶體十分有限,如果不知道它的執行方式,估計會很危險。同樣,因為在pc的系統上執行的程式與邏機程式的不同,裸機程式不會有動態鏈結,有的只是靜態鏈結。

對於微控制器的程式執行時指令和資料的存放與讀取,理解如下:

對微控制器程式設計後,程式的**段,data段,bss段,rodata段等都存放在flash中。當微控制器上電後,初始化彙編**將data段,bss段,複製到ram中,並建立好堆疊,開始呼叫程式的main函式。以後,便有了程式儲存器,和資料儲存器之分,執行時從flash(即指令儲存器,**儲存器)中讀取指令 ,從ram中讀取與寫入資料。ram存在的意義就在於速度更快。

無論是微控制器也好,pc也罷,存在的儲存器金字塔都是一致的,速度的因素,成本的限制導致了一級級更快的儲存器的更快速度與更高的成本。應該說,對於它們的理解,就是儲存器金字塔的理解。

注:參見《ram,rom and flash》

關於微控制器的學習經驗

從51開始,到現在也有一年半的時間了,剛開始學51時,花了整整半年時間才覺得對它的功能有了基本掌握,後來在不斷地做了些東西後,才感覺比較熟練了。但當時,對如何快速上手一款從未接觸過的微控制器這個問題,仍然一片茫然。這種感覺一直持續到熟練32後,終於對微控制器的學習有一種一通百通的感覺。感覺到學習一款...

關於微控制器的中斷問題

中斷,顧名思義就是停止當前正在做的一切事物。微控制器中的中斷系統包括中斷發生,中斷響應和中斷服務,以及中斷返回。是指cpu在接受到訊號以後暫停當前任務轉而去迅速完成另乙個任務,完成任務後在返回至之前的任務的過程。而當下列三個條件全部能滿足時cpu才有可能相應中斷 中斷源有中斷請求 此中斷源的中斷允許...

51微控制器的一些複習

51微控制器的一些複習 sfr special function register特殊功能暫存器的縮寫 宣告可位元組定址的特殊功能暫存器,如sfr po 0x80,sbit 特殊功能暫存器位 宣告可位定址的特殊功能暫存器,如sbit a p0 0 這些都在標頭檔案中有定義 或reg51.h 中一共定...