guew 发表于 2013-5-8 16:45:16

bootloader, temporary buffer 与 z-register

本帖最后由 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。但马老师的程序中,不管是加载页,还是页写,都没有按这个要求来做,而是直接赋值,比方说下面这个加载页函数。for(i=0;i<SPM_PAGESIZE;i+=2)
{
    boot_page_fill(i, data+(data<<8));
}

void boot_page_fill(unsigned int address,int data)
{
   asm("mov r30,r16/n"
    "mov r31,r17/n"
    "mov r0,r18/n"
    "mov r1,r19/n");
    SPMSR = 0x01;
    asm("spm/n");
}希望大伙一起来讨论讨论。

machao 发表于 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.请认真读懂我原先的代码,两个地址都是已经算好的,一次直接写入寄存器的。

你的汇编基础太差。

guew 发表于 2013-5-9 00:03:36

本帖最后由 guew 于 2013-5-9 00:08 编辑

machao 发表于 2013-5-8 19:39 static/image/common/back.gif
1. 既然页写(page write)的数据来源是temporary buffer,那么这个buffer在硬件上是不是一个独立于flash, ...

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

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

guew 发表于 2013-5-9 11:08:33

本帖最后由 guew 于 2013-5-9 11:20 编辑

machao 发表于 2013-5-8 19:39 static/image/common/back.gif
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”操作。一石二鸟,妙!

guew 发表于 2013-5-9 11:17:16

本帖最后由 guew 于 2013-5-9 11:18 编辑

machao 发表于 2013-5-8 19:39 static/image/common/back.gif
1. 既然页写(page write)的数据来源是temporary buffer,那么这个buffer在硬件上是不是一个独立于flash, ...

再补充一个问题:z寄存器有16位长度,一次寻址2个byte,是不是和AVR广告中宣传的“可预取指令,实现流水作业”有某些联系?
页: [1]
查看完整版本: bootloader, temporary buffer 与 z-register