研究生
最后登录1970-1-1
在线时间 小时
注册时间2017-7-2
|
发表于 2018-4-12 21:34:38
|
显示全部楼层
if((DWORD)buff&3)
如果地址不是四字节对齐的那么buff的最低两位可能是是01,10,11可能是,而如果是四字节对齐的,那么最低两位只能是00,
所以根据buff&3取得最低两位的值,如果不为0,那么就说明地址不是四字节对齐的,所以申请一个临时的空间用来存放从
SD卡读取的数据DWORD scratch[SD_BLOCKSIZE / 4]总的字节数是一个sector大小。如果我们要读取的sector数量为count,
那么通过在循环while (count--) 里面每次读取一个sector的数据存放到临时数组scratch里面,然后通过memcpy(buff, scratch, SD_BLOCKSIZE);
把scratch的数组依次存放到已buff为起始地址的连续空间里面就可以了。
while (count--)
{
res = disk_read(ATA,(void *)scratch, sector++, 1); 这一句可以拆分为:res = disk_read(ATA,(void *)scratch, sector, 1);sector++;
这样更好理解一些,也就是调用自身读取一个sector的数据,那么怎么理解调用的自身呢?,其实只要把本次调用的部分替换到这里就饿好理解了。
if (res != RES_OK)
{
break;
}
memcpy(buff, scratch, SD_BLOCKSIZE);
buff += SD_BLOCKSIZE; 每次存放完SD_BLOCKSIZE个字节之后就更新下次存放的地址
}
替换一下递归部分
if((DWORD)buff&3)
{
while (count--)
{
由于递归的时候buff&3==0,所以只会执行if((DWORD)buff&3)之后的程序,并不会再次嵌套,所以直接将那一部分替换过来
SD_state=SD_ReadMultiBlocks(buff,(uint64_t)sector*SD_BLOCKSIZE,SD_BLOCKSIZE,count);
if(SD_state!=SD_OK)
status = RES_PARERR;
else
status = RES_OK;
break;
以上替换掉res = disk_read(ATA,(void *)scratch, sector, 1);
剩下:
sector++;
这时的res=status
if (res != RES_OK)
{
break;
}
memcpy(buff, scratch, SD_BLOCKSIZE); 将数组从缓冲区复制出来
buff += SD_BLOCKSIZE; }
如果buff&3!=0,那么程序最终会执行到这里就返回了,而上面嵌套调用的时候则只会执行下面深绿色的部分
return res;
}
如果buff&3==0,那么程序只会执行一次下面深绿色的程序就结束了。
SD_state=SD_ReadMultiBlocks(buff,(uint64_t)sector*SD_BLOCKSIZE,SD_BLOCKSIZE,count);
if(SD_state!=SD_OK)
status = RES_PARERR;
else
status = RES_OK;
break;
|
|