权中正 发表于 2017-6-3 15:16:12

关于M88V从用户程序跳转到BOOTLOADER区的问题

本帖最后由 权中正 于 2017-6-3 15:51 编辑

在用户程序中有这两个语句,如果PC2为高电平就转到BOOTLOADER区,但就是转不过去
                if ((PINC & _BV(PC2)) != 0)
                        asm("rjmp 0x0f00": : );//
我用的是GCC AVR,不知道插入汇编的方法是否正确,编译可以通过.

BOOTLOADER区空间是256,起始地址0xf00,我打开HEX文件BOOTLOADER的地址是从0x01f00开始的这是不有问题?但是如果我将复位向量指向BL区BL的程序是可以工作的.

not_at_all 发表于 2017-6-4 07:45:31

为什么用相对跳转指令?应该用绝对跳转指令吧!

权中正 发表于 2017-6-4 11:25:06

not_at_all 发表于 2017-6-4 07:45
为什么用相对跳转指令?应该用绝对跳转指令吧!

手册上说明M88只能用相对跳转指令,用绝对跳转编译不过

not_at_all 发表于 2017-6-4 11:47:11

本帖最后由 not_at_all 于 2017-6-4 12:43 编辑

权中正 发表于 2017-6-4 11:25
手册上说明M88只能用相对跳转指令,用绝对跳转编译不过

什么叫相对跳转?你仔细研究过rjmp是怎样跳转没有?以官方文档的说明为准。
---------------
指定跳转地址用相对跳转指令是自找麻烦,用不了 JMP 可以用 IJMP

权中正 发表于 2017-7-6 23:28:24

not_at_all 发表于 2017-6-4 11:47
什么叫相对跳转?你仔细研究过rjmp是怎样跳转没有?以官方文档的说明为准。
---------------
指 ...

当我用JMP是跳出以下错误
C:\Users\ADMINI~1\AppData\Local\Temp/cc1HyYb7.s:1778: Error: illegal opcode jmp for mcu atmega88

权中正 发表于 2017-7-6 23:32:30

权中正 发表于 2017-7-6 23:28
当我用JMP是跳出以下错误
C:\Users\ADMINI~1\AppData\Local\Temp/cc1HyYb7.s:1778: Error: illegal opcod ...

手册第36页是以下描述:

复位时所有的I/O 寄存器都被设置为初始值,程序从复位向量处开始执行。 对于
ATmega168 复位向量处的指令必须是绝对跳转JMP 指令,以使程序跳转到复位处理例
程。对于 ATmega48 与 ATmega88 复位向量处的指令必须是相对跳转RJMP 指令,以使
程序跳转到复位处理例程。如果程序永远不利用中断功能,中断向量可以由一般的程序代
码所覆盖。这个处理方法同样适用于复位向量位于应用程序区,中断向量位于Boot 区 —
或者反过来 — 的时候 ( 只适用于ATmega88/168)。Figure16 为复位逻辑的电路图。
Table20 则定义了复位电路的电气参数。
复位源有效时I/O 端口立即复位为初始值。此时不要求任何时钟处于正常运行状态。

not_at_all 发表于 2017-7-7 06:54:48

权中正 发表于 2017-7-6 23:32
手册第36页是以下描述:

复位时所有的I/O 寄存器都被设置为初始值,程序从复位向量处开始执行。 对于


我问你什么叫相对跳转指令,意思是说:你的程序用了相对跳转指令,但是地址是绝对地址,不是相对地址,所以跳不到正确地址。相对地址是以跳转前PC当前值开始计算,要跳多少个地址;绝对跳转统一以地址0来算。
你再仔细看看这条指令的具体用法。

------------------
ps:ATmega48 与 ATmega88复位向量处的指令必须是相对跳转RJMP 指令    这个的确有点坑

andy 发表于 2017-7-7 08:47:09

在用户程序中有这两个语句,如果PC2为高电平就转到BOOTLOADER区,但就是转不过去
                if ((PINC & _BV(PC2)) != 0)
                        asm("rjmp 0x0f00": : );//
我用的是GCC AVR,不知道插入汇编的方法是否正确,编译可以通过.

BOOTLOADER区空间是256,起始地址0xf00,我打开HEX文件BOOTLOADER的地址是从0x01f00开始的这是不有问题?但是如果我将复位向量指向BL区BL的程序是可以工作的.



你没有熟读兵书(数据手册), asm("rjmp 0x0f00": : );//这条是(相等转移)就是说,现在的PC值(程序计数器)+((-2048)或(+2047)),
                if ((PINC & _BV(PC2)) != 0)
               {
                        asm("ldi   r30,0x00": : );//   0xf000 低8bit -> r30
                        asm("ldi   r31,0x0f": : );   //   0xf000 高8bit -> r31
                        asm("ijmp ": : );                //   间接跳转到 Z (16Bit)值,因mega8系列没有(jmp xxxxx 直接跳转指令),只能用这个方法。
               }

权中正 发表于 2018-5-14 10:17:54

谢谢楼上二位大侠指点,自觉的单片机几乎没有学过汇编直接学的C语言,虽然程序会写的但是有些问题还是会被卡住.
页: [1]
查看完整版本: 关于M88V从用户程序跳转到BOOTLOADER区的问题