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)策劃正確而安全的通信協議與上位機軟件進行通信;加密