音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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ī)
對(duì)<AVR 單片機(jī)GCC 程序設(shè)計(jì)>中bootloader功能應(yīng)用中的不理解地方
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
困擾我的地方?
無論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
芯藝
"<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
可以下載一個(gè)例子看一看
http://www.ethernut.de/arc/eboot100.zip

這是通過以太網(wǎng)tftp下載程序ISP的開源軟件。

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
雙龍杭州也開分公司了嗎?
急問:調(diào)試時(shí)的中斷問題
我用tiny26,默認(rèn)內(nèi)部1m振蕩,為什麼不工作呢?
MEGA16的T/C1能否同時(shí)工作于外部捕獲和PWM輸出狀態(tài)?
GCC中定義了FLASH內(nèi)的數(shù)組,但編譯后依然顯示DATA上用了數(shù)據(jù):
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)