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