微控制器的執行需要執行程式,同時硬體也是必不可少的,二者缺一不可。大家都知道微控制器的執行需要執行寫好的程式,但是微控制器的指令資料都被寫在了**?在哪讀取指令?
讓我們從最開始的環節講起。在微控制器上電的瞬間,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的系統上執行的程式與邏機程式的不同,裸機程式不會有動態鏈結,有的只是靜態鏈結。
關於程式在執行時,從**讀取指令,**讀取資料,也曾因為沒有弄清楚系統上的程式和裸機程式之間的區別,而疑惑了很久。雖然在《微型計算機原理》課上知道程式執行時,從記憶體中讀取指令和資料進行執行和回寫。但是微控制器上只有幾k的ram,而flash一般有幾十k甚至1m,這個時候指令和資料都在記憶體中嗎(這裡指的記憶體僅指ram,因為pc上我們常說的記憶體就是ddr ram memory,先入為主以至於認為微控制器上也是這樣,還沒有明白其實ram和flash都是記憶體)?
執行時,再將它們拷貝到速度更快的sram中,以得到更快的執行速度。而對於,微控制器而言工作頻率也就幾m或者幾十m,從flash中與從ram中讀的差異可能並不明顯,不會成為程式執行的瓶頸(而對於pc而言,flash的速度太慢,ddrram的速度也是很慢,即使是sram也是慢了不少,於是再提高工作頻率也提高不了程式的執行速度,所以現在cpu工作頻率最快是在2003左右。乙個瓶頸出現了。為了提高cpu的使用率,換個角度想一下,既然不能減少一段程式的執行時間,就在同樣的時間執行更多的程式,乙個核執行一段程式,兩個核就可以執行兩段程式,於是多核cpu成為了現在的主流)。
所以裸機程式指令就在flash(flash memory)中存放,而資料就放在了ram中(flash的寫入次數有限制,同時它的速度和ram還是差很多)。更廣泛說,在微控制器上ram存放data段、bss段、堆疊段;rom(eprom、eeprom、flash等非易失性儲存裝置)存放**,唯讀資料段。本質上說,這和pc上程式都在ram中存放是一樣的,pc 上是作業系統規定了可讀與可寫,而微控制器上是依靠不同的儲存裝置區分了可讀與可寫。當然現在的flash是可讀寫的,如果flash沒有寫入次數限制,速度又可以和ram相差不多,微控制器上是不是只要flash就可以了呢(直接相當於pc上的ddrram)?這樣成本也會比乙個ram,乙個flash低,更節省成本,對於生產商更划算。
對於微控制器的程式執行時指令和資料的存放與讀取,理解如下:
對微控制器程式設計後,程式的**段、data段、bss段、rodata段等都存放在flash中。當微控制器上電後,初始化彙編**將data段、bss段、複製到ram中,並建立好堆疊,開始呼叫程式的main函式。以後,便有了程式儲存器,和資料儲存器之分,執行時從flash(即指令儲存器,**儲存器)中讀取指令 ,從ram中讀取與寫入資料。ram存在的意義就在於速度更快。
無論是微控制器也好,pc也罷,存在的儲存器金字塔都是一致的,速度的因素,成本的限制導致了一級級更快的儲存器的更快速度與更高的成本。應該說,對於它們的理解,就是儲存器金字塔的理解。
微控制器中段程式 微控制器程式的存放
1 對於燒錄在微控制器裡面的程式,程式的 段,data段,bss段,rodata段等都存放在微控制器的flash中。當微控制器上電後,初始化彙編 將data段,bss段,複製到微控制器的ram中,並建立好堆疊,開始呼叫程式的main函式。以後,便有了程式儲存器和資料儲存器之分,程式執行時從flash...
微控制器中段程式 微控制器中乙個程式的執行過程
微控制器中乙個程式的執行過程 微控制器中乙個程式的執行過程分為取指令,分析指令和執行指令幾個步 驟。取指令的任務是 根據程式計數器 pc中的值從程式儲存器讀出現行指 令,送到指令暫存器。分析指令階段的任務是 將指令暫存器中的指令操作碼取出後進行解碼,分析其指令性質。如指令要求運算元,則尋找運算元位址...
微控制器中段程式 微控制器中乙個程式的執行過程詳解
微控制器中乙個程式的執行過程分為取指令,分析指令和執行指令幾個步驟。取指令的任務是 根據程式計數器pc中的值從程式儲存器讀出現行指令,送到指令暫存器。分析指令階段的任務是 將指令暫存器中的指令操作碼取出後進行解碼,分析其指令性質。如指令要求運算元,則尋找運算元位址。計算機執行程式的過程實際上就是逐條...