搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2017-6-3 15:16:12 | 显示全部楼层 |阅读模式
本帖最后由 权中正 于 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的程序是可以工作的.

出0入0汤圆

发表于 2017-6-4 07:45:31 | 显示全部楼层
为什么用相对跳转指令?  应该用绝对跳转指令吧!

出0入0汤圆

 楼主| 发表于 2017-6-4 11:25:06 | 显示全部楼层
not_at_all 发表于 2017-6-4 07:45
为什么用相对跳转指令?  应该用绝对跳转指令吧!

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

出0入0汤圆

发表于 2017-6-4 11:47:11 | 显示全部楼层
本帖最后由 not_at_all 于 2017-6-4 12:43 编辑
权中正 发表于 2017-6-4 11:25
手册上说明M88只能用相对跳转指令,用绝对跳转编译不过


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

出0入0汤圆

 楼主| 发表于 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

出0入0汤圆

 楼主| 发表于 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 端口立即复位为初始值。此时不要求任何时钟处于正常运行状态。

出0入0汤圆

发表于 2017-7-7 06:54:48 | 显示全部楼层
权中正 发表于 2017-7-6 23:32
手册第36页是以下描述:

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

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

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

出0入104汤圆

发表于 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 直接跳转指令),只能用这个方法。
                 }

出0入0汤圆

 楼主| 发表于 2018-5-14 10:17:54 | 显示全部楼层
谢谢楼上二位大侠指点,自觉的单片机几乎没有学过汇编直接学的C语言,虽然程序会写的但是有些问题还是会被卡住.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 06:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表