搜索
bottom↓
回复: 4

bootloader, temporary buffer 与 z-register

[复制链接]

出0入0汤圆

发表于 2013-5-8 16:45:16 | 显示全部楼层 |阅读模式
本帖最后由 guew 于 2013-5-8 16:51 编辑

诸位,小弟想写个的8位avr的bootloader程序。
结合网上流传的那个马老师十年前的程序,和atmega32的datasheet,我有如下几个疑惑:
1. 既然页写(page write)的数据来源是temporary buffer,那么这个buffer在硬件上是不是一个独立于flash,eeprom与ram的储存空间?
如果是,那么每次执行页写时,数据都实实在在的从那个独立的buffer拷贝到了目标页上的?
如果不是,那么页写的操作机制是不是这样的:1. 加载页:数据写到App区(RWW区)2. 页写:仅仅是将已经写好数据的区域(加载页时写的数据)标识(label)一下,告诉单片机:哎,这就是page1了~

2. datasheet上说Z 寄存器在给SPM指令寻址时,是有格式要求的(见附件)如:最低位是0,然后是PCWORD,再是PCPAGE。但马老师的程序中,不管是加载页,还是页写,都没有按这个要求来做,而是直接赋值,比方说下面这个加载页函数。
  1. for(i=0;i<SPM_PAGESIZE;i+=2)
  2. {
  3.     boot_page_fill(i, data[i]+(data[i+1]<<8));
  4. }

  5. void boot_page_fill(unsigned int address,int data)
  6. {
  7.      asm("mov r30,r16/n"
  8.     "mov r31,r17/n"
  9.     "mov r0,r18/n"
  10.     "mov r1,r19/n");
  11.     SPMSR = 0x01;
  12.     asm("spm/n");
  13. }
复制代码
希望大伙一起来讨论讨论。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-5-8 19:39:24 | 显示全部楼层
1. 既然页写(page write)的数据来源是temporary buffer,那么这个buffer在硬件上是不是一个独立于flash,eeprom与ram的储存空间?(是的)
2.如果是,那么每次执行页写时,数据都实实在在的从那个独立的buffer拷贝到了目标页上的?
看一下器件手册就知道了:

Alternative 1, fill the buffer before a Page Erase
• Fill temporary page buffer
• Perform a Page Erase
• Perform a Page Write

Alternative 2, fill the buffer after Page Erase
• Perform a Page Erase
• Fill temporary page buffer
• Perform a Page Write

其实AVR对flash的写操作都需要:1,将要写的数据填到temporary中;2,执行写flash操作。这个写操作就是把独立的buffer拷贝到了目标页上的。

3.请认真读懂我原先的代码,两个地址都是已经算好的,一次直接写入寄存器的。

你的汇编基础太差。

出0入0汤圆

 楼主| 发表于 2013-5-9 00:03:36 | 显示全部楼层
本帖最后由 guew 于 2013-5-9 00:08 编辑
machao 发表于 2013-5-8 19:39
1. 既然页写(page write)的数据来源是temporary buffer,那么这个buffer在硬件上是不是一个独立于flash, ...


我太粗心了,既然是先填buffer,再擦除page,那这势必是两独立的东西。
马老师有木有学汇编的速成手册或独门秘籍哈?(玩笑了~)

哎……汇编,我这总是拿起又放下的,少个能往上爬的抓手,没个入门口 ……

出0入0汤圆

 楼主| 发表于 2013-5-9 11:08:33 | 显示全部楼层
本帖最后由 guew 于 2013-5-9 11:20 编辑
machao 发表于 2013-5-8 19:39
1. 既然页写(page write)的数据来源是temporary buffer,那么这个buffer在硬件上是不是一个独立于flash, ...


终于看懂了。
其一、中文datasheet把本来应该是“页数”的“no. of pages”翻译成了"页号",所以我错误的以为选页时,只能填写0~255(mega32)的数字。
根据您程序中的address += page_size 可知,页号0是第一页,页号256是第二页……

其二、在加载页函数的入口处,以“i +=2”的形式给Z寄存器赋值,一来是给最低为加了个0,二来对应到PCWORD又正好是“+1”操作。一石二鸟,妙!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-5-9 11:17:16 | 显示全部楼层
本帖最后由 guew 于 2013-5-9 11:18 编辑
machao 发表于 2013-5-8 19:39
1. 既然页写(page write)的数据来源是temporary buffer,那么这个buffer在硬件上是不是一个独立于flash, ...


再补充一个问题:z寄存器有16位长度,一次寻址2个byte,是不是和AVR广告中宣传的“可预取指令,实现流水作业”有某些联系?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-25 22:16

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

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