BOOT區的由來基於一個簡單的道理,即單片機的程序是保存在FLASH中的,要運行程序就必須不停的訪問FLASH存儲器。對於一般的FLASH存儲器,數據的寫入需要一定的時間來完成,在數據寫入完成之前,存儲器中所有的數據都是不可讀的,這就在運行舊程序和寫入新程序之間造成了一個矛盾。
使用BOOT區是解決這個矛盾的方法之一,它將FLASH存儲器從物理上分為兩個獨立的區域,對其中的一個區的數據寫入不會影響到另一個區的數據讀取操作。我們可以讓單片機的程序在其中一個區(通常是BOOT區)運行,而運行着的程序代碼寫入另外一個區(通常為應用程序區)內。
AVR高檔單片機ATmega系列中含有BOOT代碼區,即程序引導區,也可稱器件自身監控區,有了此BOOT區監控,該器件就可對自己器件的Flash程序存儲器及EEPROM數據存儲器進行讀、寫操作,即實現自編程功能,也可稱IAP在系統應用中編程,這種自編程程序區我們稱其用戶管理程序,簡稱用戶程序。
BOOT區大小可根據實際需要用寄存器設定,並可鎖定加密,使外界無法讀取其監控。如果BOOT區監控設計得好,可把該器件的主要、關鍵控制對象放在BOOT區監控內(如中斷控制),其它工作讓用戶自己設計,可變成傻瓜式控制器、檢測儀,可遠程對嵌入式設備進行檢測、維護、升級等操作。也可通過有線、無線網絡監控設備。實現秀才不出門,也可管世界。這種帶BOOT區監控的AVR器件,可應用於程序、數據需變動的場合;可用於自適應、自修正場合;可用於閉環控制,人工智能; 可用於統一計量、計價,又必須在同一時間內快速調正的設備中(例:IC卡計費電話機); 可用於……
有了BOOT區監控,用戶程序可通過單片機通訊口與PC機RS232接口來寫用戶程序,可省去AVR串行或並行下載電纜,這對外出維護設備帶來方便。雙龍SL-MEGA8開發實驗器出廠就提供BOOT區演示監控,用標准RS232通訊電纜就可做程序下載實驗(對Flash程序存儲器及EEPROM數據存儲器實驗擦、寫、讀取)。這樣對有的AVR高檔單片機編程方法有:編程器編程,ISP串行、並行下載編程,JTGA線編程,IAP在應用中編程(僅用串行通訊線)多種形式,給科研、生產帶來方便。可以自己設計編程器件,對用戶將提供BOOT區監控方案框架,你只需簡單連接,就可組成自己的BOOT區監控。以上設計思想也適合所有AVR高檔單片機ATmega系列中含帶有BOOT代碼區的器件。
AVR的BOOTLOAD功能同其它一些芯片不同,它的BOOTLOAD程序沒有固化在芯片內部(出廠為空),而是需要由用戶設計實現(實際上,你第一次下載BOOTLOAD程序還必須使用其它的方式編程,如ISP、JTAG等),因此對一般的用戶掌握起來有一定的困難,不如一些其它芯片的BOOTLOAD使用方便。但對高手來講,可以根據實際需要編寫高級、高效、專用的BOOTLOAD程序,如從一個U盤讀取數據,更新用戶的應用程序;編寫一個時間炸彈,或對用戶的密碼進行驗證,10次不對則將系統程序銷毀等等。簡單意味着使用方便,但靈活和適應性差,而靈活性需要你具備更高的能力去駕馭它。可能會有一天,在單片機的系統上也出現了“病毒”程序,其原因就是使用了固化的BOOTLOAD程序。由於固化的程序必須有統一開放的接口,那么用一個帶“病毒”的應用程序更新原來的應用程序也就輕而易舉了。
相關問題的總結:
1.AVR自編程是如何實現的?
答:要想回答這個問題必須先了解AVR的FLASH的分區結構:AVR單片機FLASH分成RWW(READ-WHILE-WRITE)和NRWW(NO-READ-WHILE-WRITE)兩個區;其中RWW區的含義是:如果Boot Loader 軟件是對RWW 區內的某一頁進行編程,則可以從Flash 中讀取代碼,但只限於NRWW 區內的代碼。在Flash 編程期間,用戶軟件必須保證沒有對RWW 區的讀訪問。如果用戶軟件在編程過程中試圖讀取位於RWW 區的代碼( 如通過call/jmp/lpm指令或中斷),軟件可能會終止於一個未知狀態。為了避免這種情況的發生,需要禁止中斷或將其轉移到Boot Loader 區。Boot Loader 總是位於NRWW 存儲區。只要 RWW 區處於不能讀訪問的狀態,存儲程序存儲器控制和狀態寄存器(SPMCSR) 的RWW 區忙標志位RWWSB 置位。編程結束后,要在讀取位於RWW 區的代碼之前通過軟件清除RWWSB。而NRWW區的含義是:在Boot Loader 軟件更新RWW 區的某一頁時,可以讀取位於NRWW 區的代碼。當 BootLoader 代碼更新NRWW 區時,在整個頁擦除或寫操作過程中CPU 被掛起。而且AVR還自帶讀寫程序區的指令(LPM讀程序區指令,SPM寫程序區指令),實現程序的更新操作。
================================================================================
2.能否在進行自編過程中,修改復位中斷向量的位置(從APP區移至BOOTLOADER區或者相反)?
答:不能。我們一般通過編程Boot復位熔絲位使得復位向量指向Boot 區的起始地址。這樣,復位后
Boot Loader 立即就啟動了。加載了應用代碼后,程序再開始執行應用代碼。但,有一點必須指出
的是,MCU 本身不能改變熔絲位的設置。也就是說,一旦Boot 復位熔絲位被編程,復位向量將一直指向Boot 區的起始地址。熔絲位只能通過串行或並行編程的方法來改變。故,在自編程過程中,無法實現修改復位中斷向量的位置。
================================================================================
3.如何將一個函數定義在BOOT區呢?
答:首先對函數進行連接編譯聲明,再先修改MAKEFILE里連接編譯的相關選項如M16里想將GETCHAR(VOID)定位在BOOT區里則:
(1)聲明GETCHAR(VOID __attribute__ ((section (".bootloader")));
(2)在"LDFLAGS=-Wl,-Map=$(TRG).map,--cref"行加進",--section=.bootloader=0x3800"聲明即可
================================================================================
4.如何將整個工程連接編譯的起始地址定義在BOOT區首地址
答:只需修改MAKEFILE里的TEXT段的值即可
如:"LDFLAGS=-Wl,-Map=$(TRG).map,--section-start=.text=0x3800"
================================================================================
5.在編譯BOOTLOADER時設置引導程序的起始,為什么與STUDIO顯示的設置RWW區大小顯示的不一樣
如設置M16時會顯示(Boot Flash size = 1024 words Boot start address=$1c00;[BOOTSZ=00]:default
而在MAKEFILE里則是.startsection.bootsection=0x3800呢?
答:在STUDIO里是用字描述地址,而在GCC卻用字節描述。
================================================================================
6.實現AVR的BOOTLOADER工作需要注意那些事項?
答:(1)了解AVR的FLASH的結構分區的含義及APPLICATION;
(2)理解AVR GCC的BOOT.H庫文件的例子,並進行測試;
(3)懂得利用AVR GCC的MAKFILE連接編譯選項,修改函數或者程序的編譯時重定位操作;
(4)進行簡單仿真的測試;
(5)策划正確而安全的通訊協議與上位機軟件進行通訊;