0

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

以下工作:

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

或者

asm volatile { jmp BOOTL ::}

asm volatile { .org 0x3c00
               BOOTL: }

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

但是,最明显的选择

asm volatile { jmp 0x3c00 ::}

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

知道为什么吗?

4

2 回答 2

0

上述问题尚不清楚,什么是有效的,什么是失败的。关于你的环境,这很重要。也就是说,我猜你说 void 和/或“jmp BOOTL”可以按需要工作,但会使代码看起来很大。

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

无效* bl =(无效*)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”来查看它实际在做什么,而不是您所期望的之间有很多空白。

于 2013-07-17T21:05:34.040 回答
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>

于 2014-08-11T20:49:34.780 回答