日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DDR读写源码测试

發(fā)布時(shí)間:2025/3/21 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DDR读写源码测试 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

DDR讀寫程序:

Uint32 memfill32( Uint32 start, Uint32 len, Uint32 val ) {Uint32 i;Uint32 end = start + len;Uint32 errorcount = 0;/* Write Pattern */for ( i = start; i < end; i += 4 ){*( volatile Uint32* )i = val;}/* Read Pattern */for ( i = start; i < end; i += 4 ){if ( *( volatile Uint32* )i != val ){errorcount++;break;}}return errorcount; }

(volatile Uint32 *)i :將 i 強(qiáng)制轉(zhuǎn)換成易變指針,指向start,start為DDR寫入的首地址。

*(volatile Uint32 *)i :改寫 i 指向地址中的值。

test:

Int16 ddr_test( ) {ddr_base = 0x80000000; // DDR memoryddr_size = 0x00100000; // 1 MBif ( memfill32( ddr_base, ddr_size, 0xFFFFFFFF ) )return 1;if ( memfill32( ddr_base, ddr_size, 0xAAAAAAAA ) )return 2;if ( memfill32( ddr_base, ddr_size, 0x55555555 ) )return 4;if ( memfill32( ddr_base, ddr_size, 0x00000000 ) )return 8;return 0; }

main.c

void main( void ) {/* Initialize BSL */EVMDM6437_init( );TEST_execute( ddr_test, "DDR", 1 );printf( "\n***ALL Tests Passed***\n" ); }

volatile關(guān)鍵字的作用:

簡單的說使用 volatile的目的就是:?
讓對(duì) volatile 變量的存取不能緩存到寄存器,每次使用時(shí)需要重新存取。?

編譯器對(duì)代碼的優(yōu)化是指:?
CPU 在執(zhí)行的過程中,因?yàn)樵L問內(nèi)存的速度遠(yuǎn)沒有 cpu 的執(zhí)行速度快,為了提高效率,引入了
高速緩存 cache. C 編譯器在編譯時(shí)如果不知道變量會(huì)被其它外部因素(操作系統(tǒng)、硬件或者
其它線程)修改,那么就會(huì)對(duì)該變量進(jìn)行標(biāo)識(shí),即優(yōu)化.那么這個(gè)變量在 CPU的執(zhí)行過程中,就
會(huì)被放到高速緩存 cache 去,進(jìn)而達(dá)到對(duì)變量的快速訪問. 在了解了優(yōu)化的概念后,試想如
果我們事先就知道該變量會(huì)被外部因素改變,那么我們就在這個(gè)變量定義前加上 Volatile,
這樣編譯器就不會(huì)對(duì)該變量進(jìn)行優(yōu)化.這樣該變量在 cpu 處理的過程當(dāng)中,就不會(huì)被放到高
速緩存 cache 中
。?

#define A (*(volatile unsigned long *)0x48000000)?
...?
???? A = 0x01;?
...?
??? 這實(shí)際上就是內(nèi)存映射機(jī)制的方便性了。其中 volatile 關(guān)鍵字是嵌入式系統(tǒng)開發(fā)的一個(gè)重要特點(diǎn)。上述表達(dá)式拆開來分析,首先(volatile unsigned long *)0x48000000的意
思是把 0x48000000 強(qiáng)制轉(zhuǎn)換成 volatile unsigned long 類型的指針,暫記為 p,那么就是
#define A *p, 即A 為P 指針指向位置的內(nèi)容了。 這里就是通過內(nèi)存尋址訪問到寄存器 A,
可以讀/寫操作。?
用 GCC 編譯時(shí)。volatile 所指示的寄存器不進(jìn)行優(yōu)化!!!?

理解#define rRTCCON??? (*(volatile unsigned char *)0x57000043) //RTC control?
嵌入式系統(tǒng)編程,要求程序員能夠利用 C 語言訪問固定的內(nèi)存地址。既然是個(gè)地址,那么按
照 C 語言的語法規(guī)則,這個(gè)表示地址的量應(yīng)該是指針類型。所以,知道要訪問的內(nèi)存地址后,
比如 0x57000043,?
?? 第一步是要把它強(qiáng)制轉(zhuǎn)換為指針類型?
(unsigned char *)0x57000043, s3c2410 的rRTCCON是單字節(jié)訪問的(怎么看出來的???
我無法理解),所以 0x57000043 強(qiáng)制轉(zhuǎn)換為指向 unsigned char 類型。?
???volatile(可變的)這個(gè)關(guān)鍵字說明這變量可能會(huì)被意想不到地改變,這樣編譯器就不
會(huì)去假設(shè)這個(gè)變量的值了。這種“意想不到地改變”,不是由程序去改變,而是由硬件去改
變——意想不到。?
?? 第二步,對(duì)指針變量解引用,就能操作指針?biāo)赶虻牡刂返膬?nèi)容了?
?? *(volatile unsigned char *)0x57000043?
?? 第三步,小心地把#define 宏中的參數(shù)用括號(hào)括起來,這是一個(gè)很好的習(xí)慣。?
在嵌入式系統(tǒng)中經(jīng)常使用到 Volatile,對(duì)于volatile 的用法?

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的DDR读写源码测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。