本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注
SPI NAND驅(qū)動(dòng)性能測(cè)試分析與優(yōu)化 (qq.com)
一.前言
https://mp.weixin.qq.com/s/hgogGTFzBDx83sFjDX8lVw一文中我們?cè)敿?xì)介紹了SPI NAND,也實(shí)現(xiàn)了相關(guān)的驅(qū)動(dòng)(如果需要驅(qū)動(dòng)源碼可以和我聯(lián)系)。X1和x4模式的擦除,寫,讀等都測(cè)試OK了。現(xiàn)在我們需要進(jìn)行性能測(cè)試和優(yōu)化。https://mp.weixin.qq.com/s/uLraKF5kWMTHLpTggh2Q4Q一文中也介紹了ONFI。
二. 性能測(cè)試
既然是追求性能,所以我們后面就都基于X4模式進(jìn)行了。
我們分別進(jìn)行擦除,寫,讀全盤測(cè)試(128MB),然后使用定時(shí)器計(jì)算操作的時(shí)間。
性能測(cè)試代碼如下:
nand_set_qe(1,3); /* 使能QE模式 */
/* 擦除 */
pre = iot_timer_get_time();
for(uint32_t block=0; block < dev.blocks_per_lun*dev.luns; block++)
{
if(0 != (res = nand_block_erase(block*dev.pages_per_block)))
{
iot_printf("block %d erase err
",block,res);
}
}
cur = iot_timer_get_time();
if(cur < pre)
{
used = 0xFFFFFFFF - pre + cur;
}
else
{
used = cur-pre;
}
printf("erase time:%duS
",used);
/* 編程 */
memset(w_buffer,0xFF,sizeof(w_buffer));
w_buffer[dev.page_size] = 0xFF; /* 壞塊標(biāo)志不能擦除 */
pre = iot_timer_get_time();
for(uint32_t block=0; block < dev.blocks_per_lun*dev.luns; block++)
{
for(uint32_t page=0; page< dev.pages_per_block; page++)
{
if(0 != (res = nand_write_page_x4(w_buffer, block*dev.pages_per_block+page, 0, dev.page_size+dev.page_spare_size)))
{
iot_printf("write page %d err %d
",block*dev.pages_per_block+page,res);
}
}
}
cur = iot_timer_get_time();
if(cur < pre)
{
used = 0xFFFFFFFF - pre + cur;
}
else
{
used = cur-pre;
}
printf("write time:%duS
",(cur-pre));
/* 讀 */
pre = iot_timer_get_time();
for(uint32_t block=0; block < dev.blocks_per_lun*dev.luns; block++)
{
for(uint32_t page=0; page< dev.pages_per_block; page++)
{
if(0 != (res = nand_read_page_x4(r_buffer, block*dev.pages_per_block+page, 0, dev.page_size+dev.page_spare_size)))
{
iot_printf("write page %d err %d
",block*dev.pages_per_block+page,res);
}
}
}
cur = iot_timer_get_time();
if(cur < pre)
{
used = 0xFFFFFFFF - pre + cur;
}
else
{
used = cur-pre;
}
printf("read time:%duS
",(cur-pre));
測(cè)試結(jié)果如下
對(duì)于寫
128MB花了17.40S
所以速度是7.36MB/S
三. 性能分析
我們使用邏輯分析儀抓取總線波形,用于進(jìn)行性能分析
參考文章https://mp.weixin.qq.com/s/bCdgCNsGPbYjSzjv8VJyRA
我們以編程為例,擦除和讀類似。
編程PAGE的代碼如下,有三個(gè)步驟
即先寫數(shù)據(jù)到CACHE,然后寫使能,最后執(zhí)行CACHE到PAGE的數(shù)據(jù)編程。
int nand_write_page_x4(uint8_t* buffer, uint32_t pageaddr, uint16_t start, uint16_t len)
{
int res = 0;
res = nand_write_to_cache_x4(start, len, buffer);
if(res == 0)
{
res = nand_write_enable();
if(res == 0)
{
res = nand_write_cache_to_page(pageaddr,NAND_PROG_CHECK_RETRY);
if(res == 0)
{
return 0;
}
else
{
return -3;
}
}
else
{
return -2;
}
}
else
{
return -1;
}
}
查看邏輯分析儀抓取到的數(shù)據(jù)如下,對(duì)應(yīng)如下三個(gè)步驟
(1)總線上寫數(shù)據(jù)到NAND的Cache
(2)寫使能,并查詢寫使能OK
(3)執(zhí)行CACHE到PAGE編程,并查詢完成
從以上時(shí)間戳可以看到三個(gè)步驟分別對(duì)應(yīng)的時(shí)間是
第一次開始
19:48:31.513.198.648,PROGRAM LOAD x4(32),0000, ,FF,FF,FF,FF,FF,FF,FF,FF,........,
開始寫使能
19:48:31.513.259.134,WRITE ENABLE(06), , , , , , , , , , , ,
開始編程
19:48:31.513.273.890,PROGRAM EXECUTE(10),0040BE, , , , , , , , , , ,
編程完成
19:48:31.513.344.141,GET FEATURE(0F),C0, ,00, , , , , , , ,.,
下一次開始
19:48:31.513.435.474,PROGRAM LOAD x4(32),0000, ,FF,FF,FF,FF,FF,FF,FF,FF,........,
一個(gè)PAGE編程的周期
所以一個(gè)PAGE的編程時(shí)間是下一次開始和前一次開始的時(shí)間間隔
435.474-198.648=236.826uS
一次操作是寫2048+128字節(jié),對(duì)應(yīng)236.826uS,換算就是8.76MB/S比使用軟件定時(shí)器測(cè)試的7.36MB/S大一點(diǎn),因?yàn)檐浖~外一些邏輯處理需要一些時(shí)間,比如獲取定時(shí)器時(shí)間,塊之間的循環(huán)切換等。
波形如下
總線上數(shù)據(jù)傳輸時(shí)間
總線寫數(shù)據(jù)時(shí)間即第一次開始到開始寫使能,
259.134-198.648=60.486uS
如下如圖,后面6.96uS是兩次傳輸之間的間隔,即軟件完成一次傳輸?shù)较乱淮蝹鬏斨g的時(shí)間,也算在這個(gè)階段了。
寫使能時(shí)間
由于編程完之后,NAND會(huì)自動(dòng)寫禁止,所以每次都需要重新寫使能。
執(zhí)行寫使能后要回讀是否設(shè)置成功(當(dāng)然回讀也可以省略但是出于可靠性考慮還是建議回讀,如果回讀未使能再重試)。
對(duì)應(yīng)如下
273.890-259.134=14.756uS
編程時(shí)間
344.141-273.890=70.251
軟件處理時(shí)間
從下可以看出編程完成到下一次開始,還有
91uS
這一部分是軟件處理時(shí)間,主要是軟件從NAND控制器的緩存區(qū)中將數(shù)據(jù)搬運(yùn)到用戶存儲(chǔ)中去。
所以整理下各階段的時(shí)間消耗如下
總線傳輸 | 寫使能 | 編程 | 軟件處理 | 總 | |
---|---|---|---|---|---|
時(shí)間 | 60.49 | 14.76 | 70.25 | 91 | 236.5 |
占比 | 25.58% | 6.24% | 29.7% | 38.48% | 100% |
可以看出軟件處理實(shí)際占用時(shí)間比例最大,主要是從控制器的緩沖區(qū)中將數(shù)據(jù)搬運(yùn)到用戶存儲(chǔ)的時(shí)間。
四. 性能優(yōu)化
針對(duì)以上性能分析過(guò)程,對(duì)各個(gè)階段考慮優(yōu)化
1. 總線傳輸
已經(jīng)使用了X4模式, 如果還要縮短該階段的時(shí)間,只能繼續(xù)提高頻率了,目前是80M的時(shí)鐘,手冊(cè)中參數(shù)是3.3V快讀可達(dá)133MHz。
針對(duì)讀還可以使用DTR雙邊沿模式但是這時(shí)最大時(shí)鐘頻率只有70MHz,雙邊沿也就是140M所以比133M也大不了多少。
2. 寫使能時(shí)間
由于每次編程之后,NAND自動(dòng)寫禁止,所以該步驟不能少,可以減少回讀操作大約節(jié)省7uS,但是出于可靠性設(shè)計(jì),建議還是回讀,如果回讀不成功則重試。
3. 編程時(shí)間
手冊(cè)中描述的時(shí)間是不使能ECC也最少要300uS,我們實(shí)測(cè)是70uS左右,所以手冊(cè)已經(jīng)寫的很保守了,這里也沒有優(yōu)化空間了。
4軟件處理時(shí)間
這一部分主要是軟件在用戶存儲(chǔ)和NAND控制器的緩存之間拷貝數(shù)據(jù)的時(shí)間。
可以使用DMA或者提高Burst來(lái)減少該時(shí)間,
最好是這一部分工作由控制器完成,而不是軟件去搬運(yùn),比如軟件指定一個(gè)地址,控制器自動(dòng)從這個(gè)地址讀,或者寫入這個(gè)地址,而不是通過(guò)緩存再轉(zhuǎn)一遍,減少拷貝時(shí)間。
軟件時(shí)間還包括邏輯處理時(shí)間,比如一次傳輸?shù)较乱淮蝹鬏敚枰渲?a href="http://m.xsypw.cn/tags/寄存器/" target="_blank">寄存器,進(jìn)行判斷,等邏輯處理。
由于軟件是分層設(shè)計(jì)包括HW層寄存器的封裝,HAL層傳輸?shù)?a target="_blank">接口,以設(shè)備驅(qū)動(dòng)層,
對(duì)于HW層封裝可以使用宏或者內(nèi)聯(lián)函數(shù)替代函數(shù),減少函數(shù)調(diào)用時(shí)間,HW層和HAL不做參數(shù)檢查,因?yàn)榻涌谡{(diào)用頻繁等,在設(shè)備驅(qū)動(dòng)層做參數(shù)檢查。
/**
* n int nfc_set_datalen(uint8_t id, uint16_t len)
* param[in] id port id
* param[in] len data len
*
etval 0 ok
*
etval < 0 param err
*
*/
NFC_INLINE int nfc_set_datalen(uint8_t id, uint16_t len)
{
uint32_t tmp;
(void)id;
tmp = NFC_READ_REG(CFG_NFC_ENA_ADDR);
tmp &= ~NFC_DATA_LEN_MASK;
tmp |= (len < < NFC_DATA_LEN_OFFSET);
NFC_WRITE_REG(CFG_NFC_ENA_ADDR,tmp);
return 0;
}
六.波形文件
這里分享一些實(shí)際抓取到的波形文件供參考
波形文件使用軟件Acute TravelLogic Analyzer打開查看。
鏈接:https://pan.baidu.com/s/103HHT4qcvFjGn1q-jJhAUg?pwd=iqlm
提取碼:iqlm
七. 總結(jié)
從以上分析可以看出最大的優(yōu)化空間是減少軟件從控制器緩沖區(qū)去搬運(yùn)數(shù)據(jù)的時(shí)間,這一部分時(shí)間占最大頭,可IP設(shè)計(jì)優(yōu)化直接硬件搬運(yùn)數(shù)據(jù)到用戶存儲(chǔ)。
審核編輯:湯梓紅
-
NAND
+關(guān)注
關(guān)注
16文章
1719瀏覽量
137861 -
存儲(chǔ)
+關(guān)注
關(guān)注
13文章
4507瀏覽量
87114 -
SPI
+關(guān)注
關(guān)注
17文章
1785瀏覽量
94890 -
性能測(cè)試
+關(guān)注
關(guān)注
0文章
219瀏覽量
21723
發(fā)布評(píng)論請(qǐng)先 登錄
使用邏輯分析儀Acute TravelLogic Analyzer進(jìn)行SPI NAND驅(qū)動(dòng)開發(fā)調(diào)試

雷龍CS SD NAND:貼片式TF卡體驗(yàn)與性能測(cè)試
SD NAND、SPI NAND 和 Raw NAND 的定義與比較
SPI NAND FLASH 的簡(jiǎn)介和優(yōu)點(diǎn)
怎樣對(duì)基于NK-980IOT開發(fā)板的SPI NAND Flash進(jìn)行讀寫測(cè)試呢
SPI Nand Flash 簡(jiǎn)介
《現(xiàn)代CPU性能分析與優(yōu)化》--讀書心得筆記
NAND_Flash結(jié)構(gòu)與驅(qū)動(dòng)分析
永磁驅(qū)動(dòng)電機(jī)接線盒結(jié)構(gòu)優(yōu)化熱性能分析_丁樹業(yè)
linux spi應(yīng)用層驅(qū)動(dòng)以及回環(huán)測(cè)試代碼
SPI Nand Flash簡(jiǎn)介

SD NAND和SPI NAND的區(qū)別
SD NAND、SPI NAND和eMMC的區(qū)別對(duì)比分析

華為云 X 實(shí)例 CPU 性能測(cè)試詳解與優(yōu)化策略

SD NAND、SPI NAND 和 Raw NAND 的定義與比較

評(píng)論