我想一次性寫入32個(gè)扇區(qū)的數(shù)據(jù),可是發(fā)送SEC_WRITE申請扇區(qū),緊接著寫入扇區(qū)數(shù)32,等待中斷,中斷來了以后再寫入讀取數(shù)據(jù)命令,緊接著讀取9次數(shù)據(jù),發(fā)現(xiàn)申請到的扇區(qū)數(shù)為8,實(shí)際寫入到txt文檔的數(shù)據(jù)也只有8個(gè)扇區(qū)的數(shù)據(jù)量,輕問診是什么原因呢??
你好:
????發(fā)送SEC_WRITE命令申請寫入32個(gè)扇區(qū)后,應(yīng)該收到中斷狀態(tài)為成功,然后讀取8字節(jié)數(shù)據(jù),第一個(gè)字節(jié)就是允許寫入的扇區(qū)數(shù),你第一個(gè)字節(jié)收到多少?一般只有磁盤滿了,才會收到小于申請的扇區(qū)數(shù)。
讀取的第一個(gè)字節(jié)永遠(yuǎn)都是8,第二個(gè)字節(jié)是申請到的扇區(qū)數(shù)。我也是參考了file_sys.c里面的函數(shù)才發(fā)現(xiàn)是要讀取9次數(shù)據(jù),而最終的扇區(qū)起始號是由最后四個(gè)數(shù)據(jù)決定的
不好意思,上次說錯(cuò)了,是連續(xù)讀取了9個(gè)數(shù)據(jù),第一個(gè)字節(jié)代表后續(xù)可以讀出的數(shù)據(jù)個(gè)數(shù),所以固定是8字節(jié)。而接著讀出的8字節(jié),第一個(gè)字節(jié)是申請到的寫入的扇區(qū)數(shù),最后4字節(jié)是寫入數(shù)據(jù)的LBA扇區(qū)地址,用于DISK_WRITE命令的參數(shù)。你現(xiàn)在有成功寫入32個(gè)扇區(qū)嗎?
可以成功寫入,但是這好像是與U盤格式化時(shí)候所選的文件格式有關(guān)。比如格式化為FAT32,選擇最小單元最大為8192(這是FAT32下可選擇的最大單元了),此時(shí)最多寫入扇區(qū)數(shù)為8192/512=16。再比如格式化為FAT默認(rèn)格式時(shí),最小單元可選為16k和32K,此時(shí)可寫入的最大扇區(qū)數(shù)為32和64。我不知道是不是還有問題???望回復(fù)
你好:
?? 你寫入的一個(gè)完整文件如果很大,一般不是連續(xù)空間存儲的,例如FAT32格式中,你選擇最小單元分配為8K,那么一個(gè)文件的前8k內(nèi)容是連續(xù)的,如果文件 沒結(jié)束,那么會再分配8K空間存儲,只是這8k不一定與上面的8k連續(xù)。之前申請寫入扇區(qū)數(shù)后,會讀到LAB地址,這就是8K空間的首地址,所以允許寫入 的扇區(qū)是16(8K),如果沒寫完,再次申請會受到兩外分配8K空間的LAB地址。這段實(shí)現(xiàn)過程在FILE_SYS.c文件中的CH376SecWrite()函數(shù)中實(shí)現(xiàn),你可以參考。