搜索
bottom↓
回复: 7

mega8从应用区跳转至BOOTLOADER区成功不了?

[复制链接]

出0入0汤圆

发表于 2009-9-16 18:27:53 | 显示全部楼层 |阅读模式
请教邵先生:用串口指令从用户区跳转到BOOT死活不行,详细如下:
考虑到用户区和BOOT区都用到串口资源,所以跳转BOOT区前,先将串口资源清0.
#define BootStart        2 * 0x0C00UL      
void Jum2Boot(void)
{
  cli();
  UCSRB = 0x00;  //串口设置清0
  UCSRA = 0x00;   
  UCSRC = 0x00;                       
  UBRRL = 00;                  
  UBRRH = 0x00;                     
  
  LED_ON;        //led显示程序已执行到此   
  
(*((void(*)(void))(BootStart)))();
}
结果:程序死活跳不到BOOT区,且串口通讯依然正常。我判断程序跳转到BOOT区失败后,从用户区首地址0X0000执行,重新初始化了串口。
请问:为什么会跳转失败呢,需要对主要寄存器R1~R32,Z等寄存器清0吗?还是需要其他操作?谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-9-16 20:40:21 | 显示全部楼层
看起来跳转部分是没有问题的,可能需要检查一下Bootcfg.h的设置参数,以及熔丝位的设置中是否设置了访问保护。

另外,访问UCSRC寄存器,需要设置URSEL位,否则访问的是UBRRH寄存器。

出0入0汤圆

 楼主| 发表于 2009-9-16 21:39:16 | 显示全部楼层
因为程序还没有调好,所以没有编程加密位,所以没有访问保护吧。
Bootcfg.h是自动生成的,如图设置:
(原文件名:Bootcfg.JPG)
URSEL:应用程序对串口初始化时已做了:UCSRC = _BV(URSEL) | 0x06;
  能实现的是:利用上电复位从boot区启动的机会,已能顺利的通过串口将用户程序引导成功。说名Bootcfg.h配置正确,可以这么认为吗?而且根据LED指示,明明执行了Jum2Boot()函数,即将串口参数设置清0了。可我的用户程序还能正常接受我的指令,说明程序跳到过0x0000重新初始化过。看门狗在bootloader和用户程序中都没有开启,所以不会是它引起的。那会是什么原因呢?莫非是从用户区向BOOT区跳转时需将堆栈SP,通用寄存器组清0.我上学的时候学的是C51,不会AVR的汇编操作啊。有人能教教我怎么在MEGA8里将这些清0?
  请问邵大侠在BOOT程序入口处是否将这些寄存器清0?或者是不需要这么做?
  邵先生的代码中:
  //如果你要删除中断向量表(interrupt vect table), 定义 noIVT 为 1
//并在链接选项中添加 "-nostartfiles" 选项
//删除中断向量表
#if noIVT
void initstack(void) __attribute__ ((section(".init9")));
void initstack(void)
{
  //设置堆栈
  asm volatile ( ".set __stack, %0" :: "i" (RAMEND) );
  //跳转到主程序
  asm volatile ( "rjmp main");
}
#endif
“在链接选项中添加 "-nostartfiles" 选项
”我不明白什么是nostartfiles,指的是那个链接选项?抱歉!

出0入0汤圆

 楼主| 发表于 2009-9-17 13:44:53 | 显示全部楼层
找到原因了。
若:#define BootStart 2 * 0x0C00UL
通过模拟仿真,打开反汇编窗口,观测到实际跳到0x800,2*0xc00=0x1800,应该是跳转超范围溢出了 ?  
0x1800的模拟仿真跳转地址 (原文件名:jump.JPG)   
将“ 2 * 0x0C00UL”改为“0x0C00UL”就正确的跳转到BOOT区了。
邵先生的bootloader程序明明定义的BOOT起始地址是:2 * 0x0C00UL
   为什么我这里跳转不需要乘以2 ???
   我用的调试环境是avrstudio 4.13+WinAVR20071221
是不是在编译器哪儿的设置不同,请有过此经验的网友解答一下?
我先把邵先生的BOOTLOADER程序用ISP的方式烧到MEGA8,再用它正确引导用户程序的。最后读出FLASH内的HEX文件,将boot区的起始地址截图下,
boot区首地址 (原文件名:bootstart.JPG) 说明它已正确写到0x1800的位置上了?

出0入0汤圆

发表于 2009-9-17 21:37:36 | 显示全部楼层
看起来好像是因为地址引起的,我在仔细检查一下,可能是我程序的错误。

nostartfiles的设置参考下图。这个选项主要是为了去掉中断向量表,减少bootloader的大小。特别在使用了AES加密后,只有删除中断向量表才能使得整个bootloader小于2K。


(原文件名:剪贴板011.jpg)

出0入0汤圆

 楼主| 发表于 2009-9-19 16:44:18 | 显示全部楼层
顶!谢谢邵先生!
   另外我试图启用AES加密,在Linker Options里添加了-nostartfiles,的确,代码空间节省了96byte。
优化选项设置最高级别“-0s”.
#define VERBOSE            0
#define CRCMODE            1
#define LED_En             0
做了以上事情代码量的确又减少了,但还是很难压缩在2Kbyte以内?
c:/winavr-20071221/bin/../lib/gcc/avr/4.2.2/../../../../avr/bin/ld.exe: address 0x2006 of Bootldr.elf section .text is not within region text
奇怪的是定义noIVT为1后代码量反而增加了8byte???
c:/winavr-20071221/bin/../lib/gcc/avr/4.2.2/../../../../avr/bin/ld.exe: address 0x200a of Bootldr.elf section .text is not within region text
分析一下:邵先生说去掉中断向量表减少的代码量,似乎不是这样?减少代码量的真正原因应该是在连接时设置了“-nostartfiles”查了一下“-nostartfiles”含义是:“ 当linking时,不使用标准的启动文件。但是通常是使用的。”
这里需要邵先生批判一下?
而且我希望用CRC16校验且不想删掉LED指示功能
换句话说,AES加密算法目前在BOOT区小于2Kbyte的单片机上基本用不了(mega8),不知邵先生试过用AES时将代码调试至2Kbyte以内吗?
用PC1_128是可以的,代码量少了很多,呵呵!

对于设置起始FLASH地址的问题,打开AVRstudio的project options帮助,找到了下列这段文字“The address must be given as a hexadecimal number prefixed with 0x. It is interpreted as a word address for flash memory and as byte addresses for sram and eeprom memory.”
这段文字
肯定了对FLASH操作是按“word”计算的,对SRAM和eeprom的操作是按“byte ”计算的。
另一方面打开default文件夹下的makefile看到:
## Linker flags
LDFLAGS = $(COMMON)
LDFLAGS +=  -nostartfiles  -Wl,-Map=Bootldr.map
LDFLAGS += -Wl,-section-start=.text=0x1800
的确,-nostartfiles  在这里被添加进来了
而且显示FLASH的起始地址为0x1800。在makefile里对FLASH的计算是按byte的。这和project options里的说明矛盾了,就是“它”混淆了我们的视听。我觉得,既然我们使用AVRstudio,而且要在它的环境下编程,就完全按它的“规矩”来,这样自然不会错。事实证明也是这样,把BOOT首地址设为0xc00,就正确跳转了。至于makefile里的0x1800是给GCC编译器看的,既然我们选择在project options里配置让它自动生成makefile,那就完全相信project options吧,不要被它生成的makefile干扰了。看到很多网友也困扰于什么时候乘2什么时候不乘,不知道是不是这个原因。欢迎指正

出0入0汤圆

发表于 2009-9-21 09:19:59 | 显示全部楼层
使用AES后,将代码压缩到2K以内的确有些困难。除了去掉IVT以外,还需要将其他一些功能裁剪才行(比如改成电平方式),而且代码大小与AVR的型号还有一定关系。所以下一版我会增加一个XTEA算法(目前已经测试通过),这个算法也很有名,但是代码小一些,应该很容易控制代码到2K了。

另外你提的建议很不错,如果方便你也可以发EMAIL给我,这样交流会更方便一些。

出0入0汤圆

发表于 2012-9-20 23:52:33 | 显示全部楼层
这个一定要mark啊,感谢邵先生,真的非常感谢有开拓精神和分享精神的前辈,你们是我们前进的标杆
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-10 16:41

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

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