无法跳转到arduino引导加载程序

无法跳转到arduino引导加载程序,arduino,avr,bootloader,Arduino,Avr,Bootloader,我想从我的应用程序跳转到引导加载程序(我通过蓝牙加载,并有一个应用程序命令跳转到引导加载程序) 以下工作: void* bl = (void *) 0x3c00; goto *bl; 或 (但代码大小增加到0x3c00) 但是,最明显的选择是 asm volatile { jmp 0x3c00 ::} 不(似乎它甚至不产生代码} 知道为什么吗?所述的问题并不清楚,关于什么在起作用,什么在失败。关于您的环境,这很重要。也就是说,我猜您所述的void和/或“jmp BOOTL”按预期工作,但使代

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

以下工作:

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

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

但是,最明显的选择是

asm volatile { jmp 0x3c00 ::}
不(似乎它甚至不产生代码}


知道为什么吗?

所述的问题并不清楚,关于什么在起作用,什么在失败。关于您的环境,这很重要。也就是说,我猜您所述的void和/或“jmp BOOTL”按预期工作,但使代码显得庞大

我在ArduinoIDE1.0.5上试过,只看到不到1/2K的代码

void*bl=(void*)0x3c00

编译输出为

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

我怀疑您的观察结果是链接器看到指针指向引导扇区的0x3C00位置(注意它在代码末尾),所以看起来它只是很大。我怀疑在这两者之间有很多空白,您可能希望使用“avr-objdump.exe-d output.elf”查看它实际在做什么,与您期望的相比。

0x3C00是一个16位字地址

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

例如:

void *bl = (void *) 0x7800;
goto *bl;
将创建以下汇编语言(请参见*.lss输出文件):


c4:0c 94 00 3c jmp 0x7800;0x7800

谢谢,很抱歉不清楚,我想知道的是为什么jmp 0x3c00不工作,知道吗?
Binary sketch size: 474 bytes (of a 32,256 byte maximum)
Estimated used SRAM memory: 11 bytes (of a 2048 byte maximum)
void *bl = (void *) 0x7800;
goto *bl;