奇怪了,我用MEGA128晶振8MHz,速度沒有51快.....

我用51系列單片機用18.432MHz晶振6時鐘周期,文件緩沖區(qū)16KB,寫U盤速度接近200KB的速度,寫一個2MB的文件使用時間不到10s 現在改用MEGA128,用8.000MHz晶振,文件緩沖區(qū)16KB,寫一個2MB的文件使用時間要30s的時間。

同樣的程序,按理論AVR應該比51快不少,可以為什么慢了這么多,高手可否指點一二...謝謝了。。。

樓上的朋友,請問閣下用的是iccavr編譯器嗎?我用的是AtmanAvr4.x,沒有測試通過,閣下試過沒有?謝謝了。。。


你查一下讀寫一個字節(jié)到CH375用多少時間啊


128,網上的例子是模擬總線時序的,速度當然慢, 你應該將CH375掛在128的總線上,那樣讀寫U盤速度250K一點問題也沒有!


我用的是ICC編譯器,采用總線讀寫,函數采用沁恒電子的2.8版本庫函數,讀寫速度只能達到70KB左右,樓上的是怎么做到250KB的.


影響讀寫速度的,主要是在數據和數據之間的時間,如果你產生或處理數據的時間長的話,對速度影響很大


采用Mega128L-8AI ,3.3V供電,8MHz,總線0等待時序

讀寫函數如下: void xWriteCH375Data(unsigned char mData ) { *(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData; //mDelay1uS();//至少延時1.2uS } unsigned char xReadCH375Data(void) { unsigned char mData; mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR; mDelay1uS();//至少延時1.2uS return mData; } void xWriteCH375Cmd(unsigned char mCmd ) { mDelay1uS();//至少延時1uS *(volatile unsigned char *)CH375_CMD_PORT_ADDR = mCmd; mDelay1uS(); //mDelay1uS();//至少延時2uS } 測試函數如下: i = StrCopy(mCmdParam.Create.mPathName, "\\AAAA.XXX"); i = CH375FileCreate(); for(j=0; j<64 * 2; j++) { mCmdParam.WriteX.mSectorCount = 32;//16K緩沖 mCmdParam.WriteX.mDataBuffer = FileBuff; i = CH375FileWriteX(); } mCmdParam.Modify.mFileAttr = ATTR_ARCHIVE; mCmdParam.Modify.mFileTime = MAKE_FILE_TIME(12, 12, 12); mCmdParam.Modify.mFileDate = MAKE_FILE_DATE(2002, 2, 2 ); mCmdParam.Modify.mFileSize = 0xFFFFFFFF; i = CH375FileModify(); mCmdParam.Close.mUpdateLen = 1; i = CH375FileClose(); NOP(); 測試結果: 寫2M字節(jié)需要時間31秒,以前用51系列單片機用18.432MHz晶振6時鐘周期,文件緩沖區(qū)16KB,寫U盤速度接近200KB的速度,這次不同的是用3。3V供電,以前是用5V。


我嚴重懷疑MEGA128L-8L+375能否到傳說中的250K的速度....有誰真正側過....


用AtmanAvr4.x編譯器好象頭文件是不一樣的,你換下頭文件試試看可不可以


讀寫函數如下: void xWriteCH375Data(unsigned char mData ) { *(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData; //mDelay1uS();//至少延時1.2uS } unsigned char xReadCH375Data(void) { unsigned char mData; mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR; mDelay1uS();//至少延時1.2uS return mData; } void xWriteCH375Cmd(unsigned char mCmd ) { mDelay1uS();//至少延時1uS

*(volatile unsigned char *)CH375_CMD_PORT_ADDR = mCmd;

mDelay1uS(); //mDelay1uS();//至少延時2uS } 真正影響速度的是這三個函數,你查看其匯編看看每一個函數用了多長時間. 還有你數據讀出來怎麼存放的也會影響速度.


我的系統從U盤讀的數據量不大,主要是設置信息和命令信息。

主要是采集數據到U盤,數據量比較多,我的主存儲芯片是K9F5608或1208,主要數據有16M,其他都是小的數據片,速度可以不考慮,但是這個16M的數據塊是用戶最常用的數據,里面有電壓,電流,幾個地方的溫度,壓力,轉速,還有幾十個開關量等,都是小于1s的時間采集記錄的,也是最關鍵常用的數據.

我程序開辟了16K的文件緩沖區(qū),從NAND Flash中讀取數據是很快的,我測試過,影響寫U盤速度的因素不太大。

我查過匯編代碼: (0071) void xWriteCH375Data(unsigned char mData ) (0072) { (0073) *(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData; _xWriteCH375Data: mData --> R16 2999 93008400 STS 0x8400,R16 299B 9508 RET

我估計時間都消耗在反復調用在該函數上:

call 調用該函數 消耗4T mData --> R16 消耗1T STS 0x8400,R16 消耗2T RET 消耗4T

如果在庫函數里面采用類似下面寫U盤的方式: for(j=0; j{ xWriteCH375Data(FileBuff[j++]); }

那速度是絕對很難塊起來的....因為程序要判斷j和ByteCnt,還要跳轉,中間間雜這調用xWriteCH375Data,這樣程序怎么可能塊...AVR的結構決定AVR跳轉判斷塊不了。。。

寫U盤的函數應該改為類似種就好點了: void MoveData(char* a, char* b, int len) { switch(len & 7) { default: while (len > 7) { len -= 8; *b++ = *a++; case 7:*b++ = *a++; case 6:*b++ = *a++; case 5:*b++ = *a++; case 4:*b++ = *a++; case 3:*b++ = *a++; case 2:*b++ = *a++; case 1:*b++ = *a++; } } } 盡量減少判斷和跳轉,這樣才可以發(fā)揮AVR的速度優(yōu)勢,才比51寫U盤真的快...

以上觀點本人沒有帶任何評論別人的心態(tài)發(fā)言,如果觸犯您,在這里說聲對不起,我只是想讓我寫U盤的速度提高而已。。。


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

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