新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > AVR單片機(jī)的BOOT區(qū)

AVR單片機(jī)的BOOT區(qū)

作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
BOOT區(qū)的由來基于一個簡單的道理,即單片機(jī)的程序是保存在FLASH中的,要運(yùn)行程序就必須不停的訪問FLASH存儲器。對于一般的FLASH存儲器,數(shù)據(jù)的寫入需要一定的時間來完成,在數(shù)據(jù)寫入完成之前,存儲器中所有的數(shù)據(jù)都是不可讀的,這就在運(yùn)行舊程序和寫入新程序之間造成了一個矛盾。

  使用BOOT區(qū)是解決這個矛盾的方法之一,它將FLASH存儲器從物理上分為兩個獨立的區(qū)域,對其中的一個區(qū)的數(shù)據(jù)寫入不會影響到另一個區(qū)的數(shù)據(jù)讀取操作。我們可以讓單片機(jī)的程序在其中一個區(qū)(通常是BOOT區(qū))運(yùn)行,而運(yùn)行著的程序代碼寫入另外一個區(qū)(通常為應(yīng)用程序區(qū))內(nèi)。

本文引用地址:http://butianyuan.cn/article/201611/318645.htm

  AVR高檔單片機(jī)ATmega系列中含有BOOT代碼區(qū),即程序引導(dǎo)區(qū),也可稱器件自身監(jiān)控區(qū),有了此BOOT區(qū)監(jiān)控,該器件就可對自己器件的Flash程序存儲器及EEPROM數(shù)據(jù)存儲器進(jìn)行讀、寫操作,即實現(xiàn)自編程功能,也可稱IAP在系統(tǒng)應(yīng)用中編程,這種自編程程序區(qū)我們稱其用戶管理程序,簡稱用戶程序。

  BOOT區(qū)大小可根據(jù)實際需要用寄存器設(shè)定,并可鎖定加密,使外界無法讀取其監(jiān)控。如果BOOT區(qū)監(jiān)控設(shè)計得好,可把該器件的主要、關(guān)鍵控制對象放在BOOT區(qū)監(jiān)控內(nèi)(如中斷控制),其它工作讓用戶自己設(shè)計,可變成傻瓜式控制器、檢測儀,可遠(yuǎn)程對嵌入式設(shè)備進(jìn)行檢測、維護(hù)、升級等操作。也可通過有線、無線網(wǎng)絡(luò)監(jiān)控設(shè)備。實現(xiàn)秀才不出門,也可管世界。這種帶BOOT區(qū)監(jiān)控的AVR器件,可應(yīng)用于程序、數(shù)據(jù)需變動的場合;可用于自適應(yīng)、自修正場合;可用于閉環(huán)控制,人工智能;可用于統(tǒng)一計量、計價,又必須在同一時間內(nèi)快速調(diào)正的設(shè)備中(例:IC卡計費電話機(jī));可用于……
  有了BOOT區(qū)監(jiān)控,用戶程序可通過單片機(jī)通訊口與PC機(jī)RS232接口來寫用戶程序,可省去AVR串行或并行下載電纜,這對外出維護(hù)設(shè)備帶來方便。雙龍SL-MEGA8開發(fā)實驗器出廠就提供BOOT區(qū)演示監(jiān)控,用標(biāo)準(zhǔn)RS232通訊電纜就可做程序下載實驗(對Flash程序存儲器及EEPROM數(shù)據(jù)存儲器實驗擦、寫、讀取)。這樣對有的AVR高檔單片機(jī)編程方法有:編程器編程,ISP串行、并行下載編程,JTGA線編程,IAP在應(yīng)用中編程(僅用串行通訊線)多種形式,給科研、生產(chǎn)帶來方便??梢宰约涸O(shè)計編程器件,對用戶將提供BOOT區(qū)監(jiān)控方案框架,你只需簡單連接,就可組成自己的BOOT區(qū)監(jiān)控。以上設(shè)計思想也適合所有AVR高檔單片機(jī)ATmega系列中含帶有BOOT代碼區(qū)的器件。

  AVR的BOOTLOAD功能同其它一些芯片不同,它的BOOTLOAD程序沒有固化在芯片內(nèi)部(出廠為空),而是需要由用戶設(shè)計實現(xiàn)(實際上,你第一次下載BOOTLOAD程序還必須使用其它的方式編程,如ISP、JTAG等),因此對一般的用戶掌握起來有一定的困難,不如一些其它芯片的BOOTLOAD使用方便。但對高手來講,可以根據(jù)實際需要編寫高級、高效、專用的BOOTLOAD程序,如從一個U盤讀取數(shù)據(jù),更新用戶的應(yīng)用程序;編寫一個時間炸彈,或?qū)τ脩舻拿艽a進(jìn)行驗證,10次不對則將系統(tǒng)程序銷毀等等。簡單意味著使用方便,但靈活和適應(yīng)性差,而靈活性需要你具備更高的能力去駕馭它??赡軙幸惶?,在單片機(jī)的系統(tǒng)上也出現(xiàn)了“病毒”程序,其原因就是使用了固化的BOOTLOAD程序。由于固化的程序必須有統(tǒng)一開放的接口,那么用一個帶“病毒”的應(yīng)用程序更新原來的應(yīng)用程序也就輕而易舉了。

相關(guān)問題的總結(jié):

1.AVR自編程是如何實現(xiàn)的?
答:要想回答這個問題必須先了解AVR的FLASH的分區(qū)結(jié)構(gòu):AVR單片機(jī)FLASH分成RWW(READ-WHILE-WRITE)和NRWW(NO-READ-WHILE-WRITE)兩個區(qū);其中RWW區(qū)的含義是:如果Boot Loader 軟件是對RWW 區(qū)內(nèi)的某一頁進(jìn)行編程,則可以從Flash 中讀取代碼,但只限于NRWW 區(qū)內(nèi)的代碼。在Flash 編程期間,用戶軟件必須保證沒有對RWW 區(qū)的讀訪問。如果用戶軟件在編程過程中試圖讀取位于RWW 區(qū)的代碼( 如通過call/jmp/lpm指令或中斷),軟件可能會終止于一個未知狀態(tài)。為了避免這種情況的發(fā)生,需要禁止中斷或?qū)⑵滢D(zhuǎn)移到Boot Loader 區(qū)。Boot Loader 總是位于NRWW 存儲區(qū)。只要 RWW 區(qū)處于不能讀訪問的狀態(tài),存儲程序存儲器控制和狀態(tài)寄存器(SPMCSR) 的RWW 區(qū)忙標(biāo)志位RWWSB 置位。編程結(jié)束后,要在讀取位于RWW 區(qū)的代碼之前通過軟件清除RWWSB。而NRWW區(qū)的含義是:在Boot Loader 軟件更新RWW 區(qū)的某一頁時,可以讀取位于NRWW 區(qū)的代碼。當(dāng) BootLoader 代碼更新NRWW 區(qū)時,在整個頁擦除或?qū)懖僮鬟^程中CPU 被掛起。而且AVR還自帶讀寫程序區(qū)的指令(LPM讀程序區(qū)指令,SPM寫程序區(qū)指令),實現(xiàn)程序的更新操作。
================================================================================
2.能否在進(jìn)行自編過程中,修改復(fù)位中斷向量的位置(從APP區(qū)移至BOOTLOADER區(qū)或者相反)?
答:不能。我們一般通過編程Boot復(fù)位熔絲位使得復(fù)位向量指向Boot 區(qū)的起始地址。這樣,復(fù)位后
Boot Loader 立即就啟動了。加載了應(yīng)用代碼后,程序再開始執(zhí)行應(yīng)用代碼。但,有一點必須指出
的是,MCU 本身不能改變?nèi)劢z位的設(shè)置。也就是說,一旦Boot 復(fù)位熔絲位被編程,復(fù)位向量將一直指向Boot 區(qū)的起始地址。熔絲位只能通過串行或并行編程的方法來改變。故,在自編程過程中,無法實現(xiàn)修改復(fù)位中斷向量的位置。
================================================================================
3.如何將一個函數(shù)定義在BOOT區(qū)呢?
答:首先對函數(shù)進(jìn)行連接編譯聲明,再先修改MAKEFILE里連接編譯的相關(guān)選項如M16里想將GETCHAR(VOID)定位在BOOT區(qū)里則:
(1)聲明GETCHAR(VOID __attribute__ ((section (".bootloader")));
(2)在"LDFLAGS=-Wl,-Map=$(TRG).map,--cref"行加進(jìn)",--section=.bootloader=0x3800"聲明即可
================================================================================
4.如何將整個工程連接編譯的起始地址定義在BOOT區(qū)首地址
答:只需修改MAKEFILE里的TEXT段的值即可
如:"LDFLAGS=-Wl,-Map=$(TRG).map,--section-start=.text=0x3800"
================================================================================
5.在編譯BOOTLOADER時設(shè)置引導(dǎo)程序的起始,為什么與STUDIO顯示的設(shè)置RWW區(qū)大小顯示的不一樣
如設(shè)置M16時會顯示(Boot Flash size = 1024 words Boot start address=$1c00;[BOOTSZ=00]:default
而在MAKEFILE里則是.startsection.bootsection=0x3800呢?
答:在STUDIO里是用字描述地址,而在GCC卻用字節(jié)描述。
================================================================================
6.實現(xiàn)AVR的BOOTLOADER工作需要注意那些事項?
答:(1)了解AVR的FLASH的結(jié)構(gòu)分區(qū)的含義及APPLICATION;
(2)理解AVR GCC的BOOT.H庫文件的例子,并進(jìn)行測試;
(3)懂得利用AVR GCC的MAKFILE連接編譯選項,修改函數(shù)或者程序的編譯時重定位操作;
(4)進(jìn)行簡單仿真的測試;
(5)策劃正確而安全的通訊協(xié)議與上位機(jī)軟件進(jìn)行通訊;



關(guān)鍵詞: AVR單片機(jī)BOOT

評論


技術(shù)專區(qū)

關(guān)閉