无法跳入arduino引导加载程序

时间:2013-07-17 08:37:56

标签: arduino avr bootloader

我想从我的应用程序跳转到引导程序(我通过蓝牙加载并有一个应用程序命令跳转到引导加载程序)。

以下工作:

void* bl = (void *) 0x3c00;
goto *bl;

asm volatile { jmp BOOTL ::}

asm volatile { .org 0x3c00
               BOOTL: }

(但代码大小增加到0x3c00)

但是,最明显的选择

asm volatile { jmp 0x3c00 ::}

没有(似乎它甚至不生成代码}

知道为什么吗?

2 个答案:

答案 0 :(得分:0)

如上所述的问题尚不清楚,哪些是有效的,哪些是失败的。关于你的环境,这很重要。这就是说我猜你的陈述空虚和/或“jmp BOOTL”按照需要工作,但使代码看起来很大。

我在Arduino IDE 1.0.5上尝试过,只看到不到1 / 2K的代码。注16K或巨大。

void * bl =(void *)0x3c00;

void setup()
{
  // put your setup code here, to run once:
}

void loop()
{
  goto *bl;  
  // put your main code here, to run repeatedly:

}

编译输出为......

Binary sketch size: 474 bytes (of a 32,256 byte maximum)
Estimated used SRAM memory: 11 bytes (of a 2048 byte maximum)

我怀疑你的观察是链接器看到指针在0x3C00处看到BOOTSECTOR的位置(注意它在代码的末尾)所以它看起来只是很大。我怀疑你可能想要使用“avr-objdump.exe -d output.elf”来查看它实际上在做什么,与你期望的相比有很多空白。

答案 1 :(得分:0)

0x3C00是一个16位字地址。

如果您正在使用goto,请在GCC中使用0x7800。 GCC使用字节地址(0x3C00 * 2 = 0x7800)。

示例:

void *bl = (void *) 0x7800;
goto *bl;

将创建以下汇编语言(请参阅* .lss输出文件):

c4:0c 94 00 3c jmp 0x7800; 0x7800< __ stack + 0x6d01>