登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

对<AVR 单片机GCC 程序设计>中bootloader功能应用中的不理解地方

作者:Anitya 栏目:单片机
对<AVR 单片机GCC 程序设计>中bootloader功能应用中的不理解地方
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

而芯艺提到使用编译选项--section-start=.text=0xXXXXX来定位text于bootloader区,使用BOOTRST熔丝位来使程序由bootloader区开始执行.
假设使用的芯片是MEGA8,按照MEGA8的PDF,烧写熔丝位BOOTRST则复位和中断向量改变为:
.org 0x001
0x001 rjmp EXT_INT0 ; IRQ0 中断向量
0x002 rjmp EXT_INT1 ; IRQ1 中断向量
... ... . .. ;
0x014 rjmp SPM_RDY ; SPM 就绪中断向量
;
.org $c00 ;bootloader区假设为2K
$c00 rjmp RESET ; 复位中断向量
;
$c01 RESET:ldi r16,high(RAMEND); 主程序
$c02 out SPH,r16 ; 设置堆栈指针为RAM 的顶部
$c03 ldi r16,low(RAMEND)
$c04 out SPL,r16

而按照WinAVR的编译链接文件.则是:
     *(.vectors)
     __ctors_start = . ;
     *(.ctors)
     __ctors_end = . ;
     __dtors_start = . ;
     *(.dtors)
     __dtors_end = . ;
那么.使用默认的ldscripts时,用编译选项--section-start=.text=0xXXXXX,编译后的结果不是把整个向量表等同于都放在bootloader区么?

若这样,那么应用程序如果用到了中断,则中断的入口地址此时是位于bootloader区,假定BL熔丝位有被烧写,不是应用程序就错了么?!!!

哪位看过的大人指教一下,我是avr菜鸟,希望讲这句话hotpower不会跟我急,告我侵权.哈

2楼: >>参与讨论
Anitya
困扰我的地方?
无论gcc还是icc,程序编译后都有自动添加一段数据初始化和堆栈初始化程序,
那么,进入bootloader程序时已经执行过一遍了此初始化了.
在bootloader中判断完跳转到0x0000起始地址执行app程序,而app程序又是由另一个文件编译后产生的.不就又要再次执行一次?!!!!!
还是我的理解有问题?
还是升级的ihex文件要上位端处理过后再升级?!

3楼: >>参与讨论
BitFu
芯艺
"<AVR 单片机GCC 程序设计>上的例子没有用到中断,故意的。是否将向量表放到了
BOOT区,我会做实验。不过我想不论向量表放的正确与否器件执行时都会从绝对地址进入中断,所以我认为BOOT程序不应该用中断,如果非要用那可能就要使用特殊的一些技巧了。"

以上说的错了,.text定位到BOOT区的确把中断向量程序也移动到了BOOT区,设置IVSEL可以使中断向量从BOOT区执行。引导程序的确可以用中断。


* - 本贴最后修改时间:2005-1-14 12:01:52 修改者:BitFu

4楼: >>参与讨论
hudaidai
可以下载一个例子看一看
http://www.ethernut.de/arc/eboot100.zip

这是通过以太网tftp下载程序ISP的开源软件。

参与讨论
昵称:
讨论内容:
 
 
相关帖子
双龙杭州也开分公司了吗?
急问:调试时的中断问题
我用tiny26,默認內部1m振蕩,為什麼不工作呢?
MEGA16的T/C1能否同时工作于外部捕获和PWM输出状态?
GCC中定义了FLASH内的数组,但编译后依然显示DATA上用了数据:
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号