嵌入式開發(fā)范圍較廣,根據(jù)系統(tǒng)處理器的處理能力以及資源分配情況,又有許多不同處理器。常說的有MCU、MPU等,兩者有著不同的處理計算能力。以下內(nèi)容主要來談?wù)勱P(guān)于MCU的相關(guān)內(nèi)容。
一般MCU 包含的存儲空間有:片內(nèi)Flash 與片內(nèi)RAM,相比個人電腦(PC)來說,RAM 相當于內(nèi)存,F(xiàn)lash 相當于硬盤。編譯器會將一個程序分類為好幾個部分,分別存儲在MCU 不同的存儲區(qū),這些都是編譯器的功勞。編譯器相當于 一個中間翻譯者,將計算機編程語言翻譯成機器內(nèi)碼,從而控制計算體系。
說明:
Program Size包含有:
·Code:代碼段,存放程序的代碼部分
·RO-data:只讀數(shù)據(jù)段,存放程序中定義的常量
·RW-data:讀寫數(shù)據(jù)段,存放初始化為非0值的全局變量
·ZI-data: 0數(shù)據(jù)段,存放未初始化的全局變量及初始化為0的變量
注:在keil中編譯完后,工程會生成一個.map的文件,該文件說明了各個函數(shù)占用的尺寸和地址,在文件的最后幾行說明了存儲關(guān)系,查看此文件可以得到許多關(guān)于程序代碼的重要信息。如下所示(該文件的最后幾行信息):
1)RO Size 包含了Code 及RO-data,表示程序占用Flash 空間的大??;
2)RW Size 包含了RW-data 及ZI-data,表示運行時占用的RAM 的大??;
3)ROM Size 包含了Code、RO Data 以及RW Data,表示程序燒寫所占用的Flash 空間的大?。?/p>
Q2: 程序在MCU中的運行過程?
程序燒寫到了MCU后,程序是怎樣運行呢?這里以STM32為例來探討一下。
(1)程序運行之前,需要有文件實體被燒錄到STM32 的Flash 中,一般是bin 或者hex 文件,該被燒錄文件又被稱為可執(zhí)行映像文件。如下圖所示,可執(zhí)行映像文件燒錄到STM32 后的內(nèi)存分布,它包含RO 段和RW 段兩個部分:其中RO 段中保存了Code、RO-data 的數(shù)據(jù),RW 段保存了RW-data 的數(shù)據(jù),由于ZI-data 都是0,所以未包含在映像文件中。如下圖所示:
(2)STM32 在上電啟動之后默認從Flash 啟動,啟動之后會將RW 段中的RW-data(初始化的全局變量)搬運到RAM 中,但不會搬運RO 段,即CPU 的執(zhí)行代碼從Flash 中讀取,另外根據(jù)編譯器給出的ZI 地址和大小分配出ZI 段,并將這塊RAM 區(qū)域清零。
說明:其中動態(tài)內(nèi)存堆為未使用的RAM 空間,應(yīng)用程序在申請和釋放的內(nèi)存塊都來自該空間。
一些全局變量則是存放于RW 段和ZI 段中,RW 段存放的是具有初始值的全局變量(而常量形式的全局變量則放置在RO 段中,是只讀屬性的),ZI 段存放的系統(tǒng)未初始化的全局變量。
Q3: 嵌入式開發(fā)中是如何實現(xiàn)程序下載(燒寫)的?
(1)首先談?wù)剝蓚€概念:燒寫和固件。嵌入式系統(tǒng)需要預(yù)先將程序?qū)懭隦OM/FLASH中,在啟動時載入才能夠運行這些程序,將已經(jīng)生成的程序?qū)懭隦OM/FLASH的過程叫做燒寫。這樣固化在存儲介質(zhì)上的文件叫固件(firmware)。燒寫即是更新固件的過程。
(2)三種程序編燒寫方式——ISP/ICP/IAP
ISP:In System Programing,在系統(tǒng)編程
只需上電,處理器無需工作,更新整個存儲內(nèi)容的方式,不需要處理器中間操作,不需要存在引導(dǎo)程序,屬于硬件單獨處理行為。
ICP:In Circuit Programing,在電路編程
可以編程寫入最終用戶代碼,不需要從電路板上取下器件,已經(jīng)編程的器件也可以用ISP方式擦除或者進行再次編程,需要一些必要的硬件邏輯或引導(dǎo)代碼,例如使用JTAG下載。
IAP:In Applicating Programing,在應(yīng)用編程
IAP從結(jié)構(gòu)上將Flash存儲器映射為多個存儲體區(qū)域(引導(dǎo)區(qū)、運行區(qū)、下載存儲區(qū)等等),第一個項目程序存放在應(yīng)用引導(dǎo)區(qū),不執(zhí)行正常的功能操作,而只是通過某種通信管道接收程序或數(shù)據(jù),執(zhí)行對其他部分代碼的更新;其他代碼才是真正的功能代碼,存放在程序存儲區(qū)。當芯片上電后,首先運行應(yīng)用引導(dǎo)區(qū)程序,檢查是否需要對第二部分代碼進行更新,存在更新則進行更新后執(zhí)行,否則直接執(zhí)行。所以引導(dǎo)區(qū)程序應(yīng)該不可以IAP方式更新。總而言之,就是將存儲體分區(qū)來進行嵌入系統(tǒng)運行調(diào)度和管理。
Q4: 常使用的程序燒寫方式有哪些?
1、把系統(tǒng)當做一個存儲區(qū)域進行燒寫,相當于把單片機當成一個ROM芯片。
2、采用專門接口及專用的下載線將程序燒寫到固件中。這時CPU除了執(zhí)行單片機本身的指令之外,還能執(zhí)行對存儲器進行操作的特殊指令,擦除、燒寫和校驗指令。先通過傳輸相應(yīng)的指令給CPU執(zhí)行(擦除、讀入、燒寫、校驗等),這樣完成燒寫?,F(xiàn)在普遍使用的JTAG仿真器也是這樣,CPU能執(zhí)行JTAG的特殊指令,完成對固件的燒寫操作。
3、 引導(dǎo)程序,即單片機中已經(jīng)存在了一個燒寫程序。啟動單片機時首先運行該段程序,程序判斷端口狀態(tài),識別燒寫的特殊狀態(tài),就從某個端口讀取數(shù)據(jù),然后寫入到存儲單元中。如果是正常的狀態(tài),就轉(zhuǎn)到用戶的程序開始執(zhí)行。需要觸發(fā)硬件選擇用戶程序模式還是燒寫模式。
評論