其實(shí)要把特別大的變量(數(shù)組)定義到SDRAM中步驟很簡(jiǎn)單,但這個(gè)過程卻困擾了我好久,此篇文章就作為個(gè)人學(xué)習(xí)筆記參考參考吧。
一、開啟SDRAM
在Env中輸入menuconfig進(jìn)入菜單,找到Enable SDRAM,開啟該bsp
可以看到在Drivers下多了一個(gè)drv_sdram.c文件
編譯成功后可以看一下SDRAM的各項(xiàng)參數(shù),在sdram_port.h文件中
查閱資料時(shí),都提到如果要使用SDRAM,必須要在進(jìn)入 __main 前對(duì)SDRAM進(jìn)行初始化,但是RTT很人性化的直接解決了這個(gè)問題,這個(gè)BSP已經(jīng)實(shí)現(xiàn)了初始化這一步??梢钥纯创诖蛴〉臄?shù)據(jù):
sdram init success, mapped at 0xC0000000, size is 33554432 bytes, data width is 16
初始化已經(jīng)成功,首地址、大小以及數(shù)據(jù)長(zhǎng)度的信息都已經(jīng)打印出來,所以不需要畫蛇添足地再在start_up.s文件中添加SDRAM_Init函數(shù)
二、使用memheap申請(qǐng)和管理SDRAM空間
這一步要在Env中開啟Use all of memheap objects as heap
開啟后生成新工程,實(shí)際上就是開啟了RT_USING_MEMHEAP_AS_HEAP
三、定義和使用變量
我們可以使用rt_memheap_alloc來直接申請(qǐng)SDRAM內(nèi)的空間,直接上代碼
struct rt_memheap system_heap;
#define LED0 GET_PIN(B,1)
void sdram_entry()
{
rt_uint8_t key;
rt_uint8_t i=0,led0sta=1;
rt_uint32_t ts=0,ty=0;
rt_uint16_t * testsram = RT_NULL;
testsram = rt_memheap_alloc(&system_heap, 2050*1024);
led_Init();
key_init();
//SDRAM_INIT();//RTT已經(jīng)初始化了
for(ts=0;ts<800;ts++)
{
for(ty=0;ty<1280;ty++)
{
testsram[ts*ty]=ty*ts;
}
}
while(1)
{
key=key_scan(0);//不支持連按
if(key==KEY1_PRES)//打印預(yù)存測(cè)試數(shù)據(jù)
{
for(ts=0;ts<1280*800;ts++)
{
rt_kprintf("testsram[%d]:%drn",ts,testsram[ts]);//顯示測(cè)試數(shù)據(jù)
ts+=200;
}
}else rt_thread_mdelay(10);
i++;
if(i==20)//DS0閃爍.
{
i=0;
led0sta=!led0sta;
rt_pin_write(LED0,led0sta);
}
}
}
#define THREAD_STACK_SIZE 440
#define THRAED_PRIORITY 20
#define THREAD_TIMESKICE 10
int sdram_sample(void)
{
rt_thread_t tid = RT_NULL;
tid = rt_thread_create("sdram_thread",sdram_entry(void*)1,THREAD_STACK_SIZE,THRAED_PRIORITY,THREAD_TIMESKICE);
if(tid!=RT_NULL)rt_thread_startup(tid);
return 0;
}
MSH_CMD_EXPORT(sdram_sample,sdram sample);
struct rt_memheap system_heap;
考慮到SDRAM初始化的問題,這一句主要是把初始化好的SDRAM空間用上,我在drv_sdram.c中將system_heap設(shè)為了外部變量
這樣就可以在其他文件中繼續(xù)使用這個(gè)初始化好的SDRAM。
接下來我主要是想定義一個(gè)16位1280*800大小的數(shù)組,是1280 乘以 800 乘以 2字節(jié)(16位為2字節(jié))再除以1024等于2000KBytes,多算一點(diǎn)2050KBytes。
代碼中的按鍵和LED相關(guān)代碼可以刪除,要驗(yàn)證的話可以直接看這三處:
rt_uint16_t * testsram = RT_NULL;
testsram = rt_memheap_alloc(&system_heap, 2050*1024);
for(ts=0;ts<800;ts++)
{
for(ty=0;ty<1280;ty++)
{
testsram[ts*ty]=ty*ts;
}
}
for(ts=0;ts<1280*800;ts++)
{
rt_kprintf("testsram[%d]:%drn",ts,testsram[ts]);//顯示測(cè)試數(shù)據(jù)
ts+=200;
}
四、燒寫到板子上,驗(yàn)證結(jié)果
在調(diào)用sdram_sample前使用命令list_memheap可以看到:
SDRAM初始化成功,大小和使用量都有,我們可以看到片外的 SDRAM 初始化之后我們并沒有使用,但是在 max used size 字段中確顯示已經(jīng)使用了 48 字節(jié)的空間,這部分空間是內(nèi)存堆的數(shù)據(jù)頭,用于 magic、used 信息及鏈表節(jié)點(diǎn)使用。
使用sdram_sample后,可以看到打印數(shù)據(jù):
由于定義的是16位,最大為65535,所以后面溢出了。
最后打印完畢(因?yàn)橐粋€(gè)一個(gè)打印太慢了,所以我加了“ts+=200”的語(yǔ)句,跳著打?。偈褂胠ist_memheap可以看到:
SDRAM內(nèi)的空間已經(jīng)使用了一部分,而內(nèi)部RAM使用量沒有變。2050KBytes乘以1024=2099200字節(jié),這就是我們申請(qǐng)使用的空間。
-
SDRAM
+關(guān)注
關(guān)注
7文章
422瀏覽量
55133 -
led燈
+關(guān)注
關(guān)注
22文章
1592瀏覽量
107751 -
BSP
+關(guān)注
關(guān)注
1文章
86瀏覽量
26085 -
SDRAM控制器
+關(guān)注
關(guān)注
0文章
28瀏覽量
8125 -
RTThread
關(guān)注
7文章
132瀏覽量
40776
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論