[求助] 關于文件大小的 問題 ?

如果一個文件越大的話是不是后面添加的數據需要的時候越長? 我現在是每5秒往U盤中存一次數據,每次存儲12KB。 現在實時運行, 剛開始的時候存儲速度還可以, 幾百毫秒就搞定,現在需要近兩秒才寫進去。目前文件是30MB左右,我想如果文件到了100MB寫起來豈不是更慢?

有可能會產生這種情況,但是您描述的速度太慢了,這樣吧,你把程序貼出來看看有什么需要修改的地方.


代碼如下,中斷采集數據,200Hz, my_buffer[]做數據緩沖區(qū)。

每次把數據寫入u盤后把未寫入的數據移至&my_buffer[1024], 而文件尾的零頭數據導至&my_buffer[1024]前。 然后設置mDataBuffer指針用CH375FileWriteX()寫入。

//------------------------------------------

//#include "REG52.H" #include "GSSC.H" #include #include #include

#define ulong unsigned long #define uint unsigned int #define uchar unsigned char

// 磁盤讀寫的數據的復制方式,1為"單DPTR復制",2為"雙DPTR復制",3為"單DPTR和P2+R0復制" #define LIB_CFG_DISK_IO 1 // 文件讀寫的數據的復制方式,0為"外部子程序",1為"單DPTR復制",2為"雙DPTR復制",3為"單DPTR和P2+R0復制" #define LIB_CFG_FILE_IO 1 // CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" #define LIB_CFG_INT_EN 0 // CH375命令端口的I/O地址 #define CH375_CMD_PORT_ADDR 0xB001 // CH375數據端口的I/O地址 #define CH375_DAT_PORT_ADDR 0xB000 // 外部RAM的磁盤數據緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE #define DISK_BASE_BUF_ADDR 0x0400 // 默認的磁盤數據緩沖區(qū)大小為1024字節(jié),建議選擇為2048甚至4096以支持某些大扇區(qū)的U盤, // 為0則禁止在.H文件中定義緩沖區(qū)并由應用程序在pDISK_BASE_BUF中指定 #define DISK_BASE_BUF_LEN 4096 // 外部RAM的文件數據緩沖區(qū)的起始地址,緩沖區(qū)長度不小于一次讀寫的數據長度 #define FILE_DATA_BUF_ADDR 0x1400 // 外部RAM的文件數據緩沖區(qū),緩沖區(qū)長度不小于一次讀寫的數據長度,本例要求不小于0x400即可 //#define FILE_DATA_BUF_LEN 0x5000 // P3.2, CH375_INT, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態(tài) #define CH375_INT_WIRE CH375_INT // 未調用CH375FileEnumer程序故禁止以節(jié)約代碼 #define NO_DEFAULT_CH375_F_ENUM 1 // 未調用CH375FileQuery程序故禁止以節(jié)約代碼 #define NO_DEFAULT_CH375_F_QUERY 1

#include "CH375HF6.H"

#define SAMPL 0x7A // 定時器產生200Hz的中斷 #define SAMPH 0x94

uchar xdata my_buffer[0x6400] _at_ FILE_DATA_BUF_ADDR; // 數據緩沖區(qū)

unsigned char bdata adsDataH = 0; sbit adsDataH0 = adsDataH^0; sbit adsDataH1 = adsDataH^1; sbit adsDataH2 = adsDataH^2; sbit adsDataH3 = adsDataH^3; sbit adsDataH4 = adsDataH^4; sbit adsDataH5 = adsDataH^5; sbit adsDataH6 = adsDataH^6; sbit adsDataH7 = adsDataH^7; unsigned char bdata adsDataM = 0; sbit adsDataM0 = adsDataM^0; sbit adsDataM1 = adsDataM^1; sbit adsDataM2 = adsDataM^2; sbit adsDataM3 = adsDataM^3; sbit adsDataM4 = adsDataM^4; sbit adsDataM5 = adsDataM^5; sbit adsDataM6 = adsDataM^6; sbit adsDataM7 = adsDataM^7; unsigned char bdata adsDataL = 0; sbit adsDataL0 = adsDataL^0; sbit adsDataL1 = adsDataL^1; sbit adsDataL2 = adsDataL^2; sbit adsDataL3 = adsDataL^3; sbit adsDataL4 = adsDataL^4; sbit adsDataL5 = adsDataL^5; sbit adsDataL6 = adsDataL^6; sbit adsDataL7 = adsDataL^7;

uint total; uint newDataNum; uint resDataNum;

unsigned char bdata iicTemp = 0; sbit iicTemp0 = iicTemp^0;

uchar xdata DisplayDataBuf[4][16] = 0; uchar xdata TimeBuf[15] = 0;

uchar idata DateTime[7]; uchar idata ADCData[4];

#define LED_OUT_INIT() {LED1 = 1;} #define LED_OUT_ACT() {LED1 = 0;} #define LED_OUT_INACT() {LED1 = 1;}

#define LED_RUN_ACT() {LED2 = 0;} #define LED_RUN_INACT() {LED2 = 1;}

#define LED_WR_ACT() {LED1 = 0;} #define LED_WR_INACT() {LED1 = 1;}

//-------子函數實現區(qū)------- void SystemInit(void) {

// ES = 1; //串口中斷允許

TMOD = 0x21; //定時器1自動重載方式,定時器0工作在方式1(16位計數) TL1 = 0xEE; //6T模式,設置波特率9600 TH1 = 0xEE; SCON = 0x50; //串口工作在方式2(10位異步收發(fā)) PCON = 0x00; //電源控制器寄存器設置 TR1 = 1; //啟動T1計數(啟動波特率計數) // 定時器產生200Hz中斷 TL0 = SAMPL; TH0 = SAMPH; ET0 = 1; // 定時器0中斷允許

EA = 1; // CPU中斷允許 TR0 = 1; // 啟動定時器1記數 AUXR = AUXR | 0x02; //禁止訪問內部擴展RAM

}

void SendOneByte(unsigned char temp) { SBUF = temp; while(TI == 0); TI = 0; }

void Delay(unsigned int t) // Delay about 3.5 uS { do { _nop_(); }while(t--); }

uchar mCopyCodeStringToIRAM(uchar idata *iDestination, uchar code *iSource) { uchar i = 0; while(*iDestination = *iSource) { iDestination++; iSource++; i++; } return i; }

uint mCopyXRAMtoXRAM(uchar xdata *iDestination, uchar xdata *iSource, uint num) { uint i = 0; for(i = 0; i < num; i++) { *iDestination = *iSource; iDestination++; iSource++; } return i; }

uchar mCopyIRAMtoXRAM(uchar xdata *iDestination, uchar idata *iSource, uchar num) { uchar i = 0; for(i = 0; i < num; i++) { *iDestination = *iSource; iDestination++; iSource++; } return i; }

void SendString(uchar code *iString) { while(*iString) { SendOneByte(*iString); iString++; } }

void SendRAMString(uchar xdata *pString) { while(*pString) { SendOneByte(*pString); pString++; } }

void mStopIfError(uchar iError) { if(iError == ERR_SUCCESS) return; // 操作成功 while(1) { LED_OUT_ACT(); // LED閃爍 Delay(10000); LED_OUT_INACT(); Delay(10000); } }

void mFlushBufferToDisk(uchar force) { uchar i; ulong NewSize; // ulong datCount; if(force) // 強制刷新 { // 將緩沖區(qū)中的字節(jié)數轉換為扇區(qū)數(除以CH375vSectorSize),長度加上CH375vSectorSize-1用于確保寫入最后的零頭數據 total = newDataNum + resDataNum; // 新數據字數 + 舊零頭數據字節(jié)數 // datCount = total & ~(CH375vSectorSize - 1); // 數據整扇區(qū)字節(jié)數 mCmdParam.Write.mSectorCount = (total + CH375vSectorSize - 1) / CH375vSectorSize; // 以扇區(qū)為單位向文件寫入數據,寫入緩沖區(qū)中的所有數據,含最后的零頭數據 mCmdParam.WriteX.mDataBuffer = &my_buffer[1024] - resDataNum; i = CH375FileWriteX(); mStopIfError(i); // 有些U盤可能會要求在寫數據后等待一會才能繼續(xù)操作,所以如果在某些U盤中發(fā)生數據丟失現象,建議在每次寫入數據后稍作延時在繼續(xù)操作 Delay(2000); TR0 = 0; // T0 停止記數 // 把數據存儲過程中采樣的數據移到緩沖區(qū)首部 mCopyXRAMtoXRAM(&my_buffer[1024], &my_buffer[1024] + total - resDataNum, newDataNum + resDataNum - total); // 緩沖區(qū)中零頭數據字節(jié)數 newDataNum = newDataNum + resDataNum - total; // 緩沖區(qū)中只剩下剛才已寫入U盤的零頭數據,繼續(xù)保留在緩沖區(qū)中是為了方便以后在其后面追加數據 total &= CH375vSectorSize - 1; TR0 = 1; // T0 啟動記數 // if(total) // 以扇區(qū)為單位,有零頭數據,計算出真正的文件長度(有效數據的長度) NewSize = CH375vFileSize - CH375vSectorSize + total; else // 以扇區(qū)為單位,沒有零頭數據,文件長度是CH375vSectorSize的倍數 NewSize = CH375vFileSize; // 輸入參數: 新的文件長度,扇區(qū)模式下涉及到零頭數據不便自動更新長度 mCmdParam.Modify.mFileSize = NewSize; // 輸入參數: 新的文件屬性,為0FFH則不修改 mCmdParam.Modify.mFileAttr = 0xFF; // 輸入參數: 新的文件時間,為0FFH則不修改 mCmdParam.Modify.mFileTime = 0xFFFF; // 輸入參數: 新的文件日期,為0FFH則不修改 mCmdParam.Modify.mFileDate = 0xFFFF; // 修改當前文件的信息,修改文件長度 i = CH375FileModify(); mStopIfError(i); // 移到文件的尾部,以扇區(qū)為單位,所以會忽略文件尾部的零頭數據 mCmdParam.Locate.mSectorOffset = 0xFFFFFFFF; // 重新回到原文件的尾部,下面如果再寫入數據將覆蓋尾部零頭數據,不過該零頭數據有一份副本保留在緩沖區(qū)中 i = CH375FileLocate(); mStopIfError(i); } }

void ServiceT0(void) interrupt 1 {

// 重置計數器 TL0 = SAMPL; TH0 = SAMPH; // 讀取時間轉換為ASC碼 read_rtc(); newDataNum += mCopyIRAMtoXRAM(&my_buffer[1024] + newDataNum, &DateTime[0], 6); // 讀取ADC值并轉換為ASC碼 // ch1 ================================ AD_CHS0 = 0; AD_CHS1 = 0; Delay(1); ReadDataFromADC(); newDataNum += mCopyIRAMtoXRAM(&my_buffer[1024] + newDataNum, &ADCData[0], 3); // ch2 ================================ AD_CHS0 = 1; AD_CHS1 = 0; Delay(1); ReadDataFromADC(); newDataNum += mCopyIRAMtoXRAM(&my_buffer[1024] + newDataNum, &ADCData[0], 3); // SendOneByte(DateTime[5]);

}

void main(void) {

uchar idata i = 0; uint idata j = 0, k = 0; ucha


你可以這樣,你不需要每次寫完數據之后在更新文件長度,你可以多次寫完之后在關閉文件,更新文件長度,或者你把數據寫完了之后在更新文件長度這樣的話速度會快很多,LOCATE命令在數據很多的時候會浪費很長時間。


哦,這樣啊,我主要是擔心斷電啊?

再者,我發(fā)現我cpu寫數據已經寫完了(我有指示燈),可是U盤燈還在不停的閃(標示還在寫數據或者讀數據),現在文件到了70多MB了,U盤一直不停的閃 。 先前是cpu寫數據完了,U盤燈也就 不閃了,下次寫再閃。

這樣下去如果一個文件到了200MB的話,速度太慢了!


我上面說了,你可以寫一個大文件比如寫10M之后更新下文件長度在寫下一個文件的時候在用LOCATE跳到文件末尾在去打開文件在寫10M的數據。往后面寫的話,是因為在更新文件的時候時間比較的長。


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频