当前位置:  技术问答>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天了,求高手求高手求高手!!!

|
mkcramfs生成的镜像 让这个镜像大小是块的整数倍.
然后再write.

|
rv = write(fd, buf, uiLength);

rv的值多少, 最后一次此值还会对齐块大小不?

|


-1肯定有问题了.  你代码write出错了.

    
 
 

您可能感兴趣的文章:

  • 写入mtd的囧问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • MTD字符设备和块设备有着什么样的关系????
  • 无法对/dev/mtd0设备进行cp操作了??
  • linux内核空间操作flash mtd问题
  • MTD ECC 相关问题
  • fat分区与mtd看看我的理解对不对
  • mtd与mtdblock节点的对应问题
  • Web服务器/前端 iis7站长之家
  • jffs2,MTD讨论
  • 如何修改linux系统自带mtd驱动的情况下支持2G nandflash
  • MTD驱动擦除地址的问题
  • Linux 2.6.12的内核,mips CPU, /dev/目录下mtd字符设备只能挂载7个的问题。
  • 关于直接编写应用程序读写/dev/mtd0 或者 /dev/mtdblock0的问题。
  • MTD驱动获取flash布局的疑问
  • 求助:如何将2.6.30上的jffs2/MTD相关代码移植到2.6.14上


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3