<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/201611/318645.htm

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

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

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

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

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



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

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();