请教,执行 CH374ByteRead 时死锁。

初始化正常,读取文件时,如果一次读取64个字节正常,如果一次读取128个字节就会无响应,表现是CH374ByteRead函数一直无返回。

相关代码如下:

i = CH374DiskConnect(); if(i != ERR_SUCCESS ) { return; } // 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 for ( i = 0; i < 5; i ++ ) // 有的U盘总是返回未准备好,不过可以被忽略 { Util_Delay(8000); //printf( "Ready ?\n" ); if ( CH374DiskReady( ) == ERR_SUCCESS ) // 查询磁盘是否准备好 break; } // 查询磁盘物理容量 i = CH374DiskSize( ); UI32 size = mCmdParam.DiskSize.mDiskSizeSec * ( CH374vSectorSize / 512 ) >> 11 ; my_memcpy(mCmdParam.Open.mPathName, "/xxx/xxx.xx", nLen); //文件名 i = CH374FileOpen( ); // 打开文件 if(i != ERR_SUCCESS) return; int read = 64; <------------此处如果较大就无响应 mCmdParam.ByteRead.mByteCount = read i = CH374ByteRead(); if(i == ERR_SUCCESS) { UsartSend(mCmdParam.ByteRead.mByteBuffer, read); } CH374FileClose( );

读取的字节数 不可以超过数据缓冲区的大小 修改下面的宏 就可以 #define MAX_BYTE_IO 35 /* 以字节为单位单次读写文件时的最大长度,默认值是29,值大则占用内存多,值小则超过该长度必须分多次读写 */ struct { UINT8 mByteCount; /* 输入参数 准备读取的字节数,不得大于MAX_BYTE_IO, 返回: 实际读出的字节数 */ UINT8 mByteBuffer[ MAX_BYTE_IO ]; /* 返回: 读出的数据块 */ } ByteRead; /* CMD_ByteRead, 以字节为单位从当前文件读取数据块 */


谢谢。再问一下:

如果我将 DISK_BASE_BUF_LEN 设置为0, 然后指定了缓冲,并且这个缓冲足够大,也要受限于MAX_BYTE_IO吗? pDISK_BASE_BUF = (UI8 *)g_Buff;


不知道我这样理解对不对,不管采用字节读取还是扇区读取,必须有一个至少和U盘扇区一样大的RAM空间作为临时缓冲pDISK_BASE_BUF,并且这个缓冲区被库管理,应用程序不能去使用它。

而每次读取的 MAX_BYTE_IO 个自己,就是从 pDISK_BASE_BUF 中取出来的,然后应用程序再把它复制到别处使用。


MAX_BYTE_IO最大只能设置为256,DISK_BASE_BUF_LEN 不能设置为0,最小为512个字节。


只有登录才能回复,可以选择微信账号登录