我想从我的应用程序跳转到引导程序(我通过蓝牙加载并有一个应用程序命令跳转到引导加载程序)。
以下工作:
void* bl = (void *) 0x3c00;
goto *bl;
或
asm volatile { jmp BOOTL ::}
asm volatile { .org 0x3c00
BOOTL: }
(但代码大小增加到0x3c00)
但是,最明显的选择
asm volatile { jmp 0x3c00 ::}
没有(似乎它甚至不生成代码}
知道为什么吗?
答案 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>