新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR單片機的BOOT區

        AVR單片機的BOOT區

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

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

        本文引用地址:http://www.104case.com/article/201611/318645.htm

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



        關鍵詞: AVR單片機BOOT

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 甘孜县| 永平县| 五峰| 九台市| 方城县| 绵阳市| 禹城市| 武乡县| 保亭| 锡林郭勒盟| 陆丰市| 准格尔旗| 上犹县| 通江县| 靖边县| 类乌齐县| 承德县| 武强县| 长岭县| 祁东县| 乐安县| 鄂伦春自治旗| 绥宁县| 长兴县| 昔阳县| 彩票| 长宁县| 枞阳县| 西乌| 黎川县| 临西县| 宜都市| 高尔夫| 临颍县| 敖汉旗| 黎川县| 郸城县| 鲜城| 女性| 上虞市| 丹江口市|