我想一次性写入32个扇区的数据,可是发送SEC_WRITE申请扇区,紧接着写入扇区数32,等待中断,中断来了以后再写入读取数据命令,紧接着读取9次数据,发现申请到的扇区数为8,实际写入到txt文档的数据也只有8个扇区的数据量,轻问诊是什么原因呢??
你好:
发送SEC_WRITE命令申请写入32个扇区后,应该收到中断状态为成功,然后读取8字节数据,第一个字节就是允许写入的扇区数,你第一个字节收到多少?一般只有磁盘满了,才会收到小于申请的扇区数。
读取的第一个字节永远都是8,第二个字节是申请到的扇区数。我也是参考了file_sys.c里面的函数才发现是要读取9次数据,而最终的扇区起始号是由最后四个数据决定的
不好意思,上次说错了,是连续读取了9个数据,第一个字节代表后续可以读出的数据个数,所以固定是8字节。而接着读出的8字节,第一个字节是申请到的写入的扇区数,最后4字节是写入数据的LBA扇区地址,用于DISK_WRITE命令的参数。你现在有成功写入32个扇区吗?
可以成功写入,但是这好像是与U盘格式化时候所选的文件格式有关。比如格式化为FAT32,选择最小单元最大为8192(这是FAT32下可选择的最大单元了),此时最多写入扇区数为8192/512=16。再比如格式化为FAT默认格式时,最小单元可选为16k和32K,此时可写入的最大扇区数为32和64。我不知道是不是还有问题???望回复
你好:
你写入的一个完整文件如果很大,一般不是连续空间存储的,例如FAT32格式中,你选择最小单元分配为8K,那么一个文件的前8k内容是连续的,如果文件 没结束,那么会再分配8K空间存储,只是这8k不一定与上面的8k连续。之前申请写入扇区数后,会读到LAB地址,这就是8K空间的首地址,所以允许写入 的扇区是16(8K),如果没写完,再次申请会受到两外分配8K空间的LAB地址。这段实现过程在FILE_SYS.c文件中的CH376SecWrite()函数中实现,你可以参考。