当前位置: 技术问答>linux和unix
mtd写入数据使用write函数有时会出错,困扰n天了
来源: 互联网 发布时间:2016-12-27
本文导语: 已经给flash分区,往同一个地方写数据,有时候会成功,有时候会失败。 自己写的flash_write函数大致过程就是 fd = open("/dev/mtd5", O_RDWR); ... rv = lseek(fd, iOffset, SEEK_SET); ... uiLength = (2 * 1024) * ((uiLength - 1) / (2 *...
已经给flash分区,往同一个地方写数据,有时候会成功,有时候会失败。
自己写的flash_write函数大致过程就是
fd = open("/dev/mtd5", O_RDWR);
...
rv = lseek(fd, iOffset, SEEK_SET);
...
uiLength = (2 * 1024) * ((uiLength - 1) / (2 * 1024) + 1);
rv = write(fd, buf, uiLength);
写入的数据是使用mkcramfs生成的镜像(大小为4M多),用来更新程序的。大致过程如下
while (iDataLen > 0)
{
int rlen;
int wlen;
if (iDataLen > UPDATE_BLOCK_SIZE)
{
rlen = UPDATE_BLOCK_SIZE;
}
else
{
rlen = iDataLen;
}
wlen = flash_write(iOffset, rlen, pRead, fd);
pRead += rlen;
iDataLen -= rlen;
iOffset += rlen;
}
------------------------
执行到最后一次flash_write时,在write那里写入失败,返回-1,errno为14(地址不正确?)
奇怪的现象是,一切都准备好,把设备上电启动,然后更新镜像,没有错误发生,不重启的情况下,再升级一次,就发生错误了。
都是在最后一次写入出错的,最后一次要写入的数据不满足UPDATE_BLOCK_SIZE,所以执行else里的语句,我猜想可能是什么对齐什么的。
我发现每次最少要写入2K的字节,于是在调用write前,对写入的数据长度做了处理(uiLength = (2 * 1024) * ((uiLength - 1) / (2 * 1024) + 1);这样保证每次写入都是2K的倍数),但是悲剧还是发生了,实在想不通了,困扰n天了,求高手求高手求高手!!!
自己写的flash_write函数大致过程就是
fd = open("/dev/mtd5", O_RDWR);
...
rv = lseek(fd, iOffset, SEEK_SET);
...
uiLength = (2 * 1024) * ((uiLength - 1) / (2 * 1024) + 1);
rv = write(fd, buf, uiLength);
写入的数据是使用mkcramfs生成的镜像(大小为4M多),用来更新程序的。大致过程如下
while (iDataLen > 0)
{
int rlen;
int wlen;
if (iDataLen > UPDATE_BLOCK_SIZE)
{
rlen = UPDATE_BLOCK_SIZE;
}
else
{
rlen = iDataLen;
}
wlen = flash_write(iOffset, rlen, pRead, fd);
pRead += rlen;
iDataLen -= rlen;
iOffset += rlen;
}
------------------------
执行到最后一次flash_write时,在write那里写入失败,返回-1,errno为14(地址不正确?)
奇怪的现象是,一切都准备好,把设备上电启动,然后更新镜像,没有错误发生,不重启的情况下,再升级一次,就发生错误了。
都是在最后一次写入出错的,最后一次要写入的数据不满足UPDATE_BLOCK_SIZE,所以执行else里的语句,我猜想可能是什么对齐什么的。
我发现每次最少要写入2K的字节,于是在调用write前,对写入的数据长度做了处理(uiLength = (2 * 1024) * ((uiLength - 1) / (2 * 1024) + 1);这样保证每次写入都是2K的倍数),但是悲剧还是发生了,实在想不通了,困扰n天了,求高手求高手求高手!!!
|
mkcramfs生成的镜像 让这个镜像大小是块的整数倍.
然后再write.
然后再write.
|
rv = write(fd, buf, uiLength);
rv的值多少, 最后一次此值还会对齐块大小不?
rv的值多少, 最后一次此值还会对齐块大小不?
|
-1肯定有问题了. 你代码write出错了.