嵌入式開發之程序燒寫


Q1:    嵌入式開發中程序下載后存儲在什么地方?

 

      嵌入式開發范圍較廣,根據系統處理器的處理能力以及資源分配情況,又有許多不同處理器。常說的有MCU、MPU等,兩者有着不同的處理計算能力。以下內容主要來談談關於MCU的相關內容。

         一般MCU 包含的存儲空間有:片內Flash 與片內RAM,相比個人電腦(PC)來說,RAM 相當於內存,Flash 相當於硬盤。編譯器會將一個程序分類為好幾個部分,分別存儲在MCU 不同的存儲區,這些都是編譯器的功勞。編譯器相當於 一個中間翻譯者,將計算機編程語言翻譯成機器內碼,從而控制計算體系。

    說明:

    Program Size包含有:
        ·Code:代碼段,存放程序的代碼部分
        ·RO-data:只讀數據段,存放程序中定義的常量
        ·RW-data:讀寫數據段,存放初始化為非0值的全局變量
        ·ZI-data: 0數據段,存放未初始化的全局變量及初始化為0的變量
   
   注:在keil中編譯完后,工程會生成一個.map的文件,該文件說明了各個函數占用的尺寸和地址,在文件的最后幾行說明了存儲關系,查看此文件可以得到許多關於程序代碼的重要信息。如下所示(該文件的最后幾行信息):

  

     1)RO Size 包含了Code 及RO-data,表示程序占用Flash 空間的大小;
         2)RW Size 包含了RW-data 及ZI-data,表示運行時占用的RAM 的大小;
         3)ROM Size 包含了Code、RO Data 以及RW Data,表示程序燒寫所占用的Flash 空間的大小;

 

Q2:    程序在MCU中的運行過程?

 

          程序燒寫到了MCU后,程序是怎樣運行呢?這里以STM32為例來探討一下。

       (1)程序運行之前,需要有文件實體被燒錄到STM32 的Flash 中,一般是bin 或者hex 文件,該被燒錄文件又被稱為可執行映像文件。如下圖所示,可執行映像文件燒錄到STM32 后的內存分布,它包含RO 段和RW 段兩個部分:其中RO 段中保存了Code、RO-data 的數據,RW 段保存了RW-data 的數據,由於ZI-data 都是0,所以未包含在映像文件中。如下圖所示:

      

        (2)STM32 在上電啟動之后默認從Flash 啟動,啟動之后會將RW 段中的RW-data(初始化的全局變量)搬運到RAM 中,但不會搬運RO 段,即CPU 的執行代碼從Flash 中讀取,另外根據編譯器給出的ZI 地址和大小分配出ZI 段,並將這塊RAM 區域清零。

        說明:其中動態內存堆為未使用的RAM 空間,應用程序在申請和釋放的內存塊都來自該空間。

           一些全局變量則是存放於RW 段和ZI 段中,RW 段存放的是具有初始值的全局變量(而常量形式的全局變量則放置在RO 段中,是只讀屬性的),ZI 段存放的系統未初始化的全局變量。

 

Q3:    嵌入式開發中是如何實現程序下載(燒寫)的?

      (1)首先談談兩個概念:燒寫和固件。嵌入式系統需要預先將程序寫入ROM/FLASH中,在啟動時載入才能夠運行這些程序,將已經生成的程序寫入ROM/FLASH的過程叫做燒寫。這樣固化在存儲介質上的文件叫固件(firmware)。燒寫即是更新固件的過程。

       (2)三種程序編燒寫方式——ISP/ICP/IAP

          ISP:In System Programing,在系統編程

        只需上電,處理器無需工作,更新整個存儲內容的方式,不需要處理器中間操作,不需要存在引導程序,屬於硬件單獨處理行為.

          ICP:In Circuit Programing,在電路編程

        可以編程寫入最終用戶代碼,不需要從電路板上取下器件,已經編程的器件也可以用ISP方式擦除或者進行再次編程,需要一些必要的硬件邏輯或引導代碼,例如使用JTAG下載。

         IAP:In Applicating Programing,在應用編程

           IAP從結構上將Flash存儲器映射為多個存儲體區域(引導區、運行區、下載存儲區等等),第一個項目程序存放在應用引導區,不執行正常的功能操作,而只是通過某種通信管道接收程序或數據,執行對其他部分代碼的更新;其他代碼才是真正的功能代碼,存放在程序存儲區。當芯片上電后,首先運行應用引導區程序,檢查是否需要對第二部分代碼進行更新,存在更新則進行更新后執行,否則直接執行。所以引導區程序應該不可以IAP方式更新。總而言之,就是將存儲體分區來進行嵌入系統運行調度和管理。

      

Q4:     常使用的程序燒寫方式有哪些?
      

        1、把系統當做一個存儲區域進行燒寫,相當於把單片機當成一個ROM芯片。

         2、采用專門接口及專用的下載線將程序燒寫到固件中。這時CPU除了執行單片機本身的指令之外,還能執行對存儲器進行操作的特殊指令,擦除、燒寫和校驗指令。先通過傳輸相應的指令給CPU執行(擦除、讀入、燒寫、校驗等),這樣完成燒寫。現在普遍使用的JTAG仿真器也是這樣,CPU能執行JTAG的特殊指令,完成對固件的燒寫操作。

        3、 引導程序,即單片機中已經存在了一個燒寫程序。啟動單片機時首先運行該段程序,程序判斷端口狀態,識別燒寫的特殊狀態,就從某個端口讀取數據,然后寫入到存儲單元中。如果是正常的狀態,就轉到用戶的程序開始執行。需要觸發硬件選擇用戶程序模式還是燒寫模式。

 

 注:部分內容參考於《rt-thread官方開發手冊》 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM