|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
對(duì)<AVR 單片機(jī)GCC 程序設(shè)計(jì)>中bootloader功能應(yīng)用中的不理解地方 |
| 作者:Anitya 欄目:單片機(jī) |
WinAVR的ldscripts中avr4.x描述WinAVR編譯后的空間分配: .text : { *(.vectors) __ctors_start = . ; *(.ctors) __ctors_end = . ; __dtors_start = . ; *(.dtors) __dtors_end = . ; *(.progmem.gcc*) *(.progmem*) . = ALIGN(2); *(.init0) /* Start here after reset. */ *(.init1) *(.init2) /* Clear __zero_reg__, set up stack pointer. */ *(.init3) *(.init4) /* Initialize data and BSS. */ *(.init5) *(.init6) /* C++ constructors. */ *(.init7) *(.init8) *(.init9) /* Call main(). */ *(.text) . = ALIGN(2); *(.text.*) . = ALIGN(2); *(.fini9) /* _exit() starts here. */ *(.fini8) *(.fini7) *(.fini6) /* C++ destructors. */ *(.fini5) *(.fini4) *(.fini3) *(.fini2) *(.fini1) *(.fini0) /* Infinite loop after program termination. */ _etext = . ; } > text 而芯藝提到使用編譯選項(xiàng)--section-start=.text=0xXXXXX來定位text于bootloader區(qū),使用BOOTRST熔絲位來使程序由bootloader區(qū)開始執(zhí)行. 假設(shè)使用的芯片是MEGA8,按照MEGA8的PDF,燒寫熔絲位BOOTRST則復(fù)位和中斷向量改變?yōu)? .org 0x001 0x001 rjmp EXT_INT0 ; IRQ0 中斷向量 0x002 rjmp EXT_INT1 ; IRQ1 中斷向量 ... ... . .. ; 0x014 rjmp SPM_RDY ; SPM 就緒中斷向量 ; .org $c00 ;bootloader區(qū)假設(shè)為2K $c00 rjmp RESET ; 復(fù)位中斷向量 ; $c01 RESET:ldi r16,high(RAMEND); 主程序 $c02 out SPH,r16 ; 設(shè)置堆棧指針為RAM 的頂部 $c03 ldi r16,low(RAMEND) $c04 out SPL,r16 而按照WinAVR的編譯鏈接文件.則是: *(.vectors) __ctors_start = . ; *(.ctors) __ctors_end = . ; __dtors_start = . ; *(.dtors) __dtors_end = . ; 那么.使用默認(rèn)的ldscripts時(shí),用編譯選項(xiàng)--section-start=.text=0xXXXXX,編譯后的結(jié)果不是把整個(gè)向量表等同于都放在bootloader區(qū)么? 若這樣,那么應(yīng)用程序如果用到了中斷,則中斷的入口地址此時(shí)是位于bootloader區(qū),假定BL熔絲位有被燒寫,不是應(yīng)用程序就錯(cuò)了么?!!! 哪位看過的大人指教一下,我是avr菜鳥,希望講這句話hotpower不會(huì)跟我急,告我侵權(quán).哈 |
| 2樓: | >>參與討論 |
| 作者: Anitya 于 2005/1/6 17:29:00 發(fā)布:
困擾我的地方? 無論gcc還是icc,程序編譯后都有自動(dòng)添加一段數(shù)據(jù)初始化和堆棧初始化程序, 那么,進(jìn)入bootloader程序時(shí)已經(jīng)執(zhí)行過一遍了此初始化了. 在bootloader中判斷完跳轉(zhuǎn)到0x0000起始地址執(zhí)行app程序,而app程序又是由另一個(gè)文件編譯后產(chǎn)生的.不就又要再次執(zhí)行一次?!!!!! 還是我的理解有問題? 還是升級(jí)的ihex文件要上位端處理過后再升級(jí)?! |
|
| 3樓: | >>參與討論 |
| 作者: BitFu 于 2005/1/6 18:02:00 發(fā)布:
芯藝 "<AVR 單片機(jī)GCC 程序設(shè)計(jì)>上的例子沒有用到中斷,故意的。是否將向量表放到了 BOOT區(qū),我會(huì)做實(shí)驗(yàn)。不過我想不論向量表放的正確與否器件執(zhí)行時(shí)都會(huì)從絕對(duì)地址進(jìn)入中斷,所以我認(rèn)為BOOT程序不應(yīng)該用中斷,如果非要用那可能就要使用特殊的一些技巧了。" 以上說的錯(cuò)了,.text定位到BOOT區(qū)的確把中斷向量程序也移動(dòng)到了BOOT區(qū),設(shè)置IVSEL可以使中斷向量從BOOT區(qū)執(zhí)行。引導(dǎo)程序的確可以用中斷。 * - 本貼最后修改時(shí)間:2005-1-14 12:01:52 修改者:BitFu |
|
| 4樓: | >>參與討論 |
| 作者: hudaidai 于 2005/1/7 8:53:00 發(fā)布:
可以下載一個(gè)例子看一看 http://www.ethernut.de/arc/eboot100.zip 這是通過以太網(wǎng)tftp下載程序ISP的開源軟件。 |
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |