其實要把特別大的變量(數組)定義到SDRAM中步驟很簡單,但這個過程卻困擾了我好久,此篇文章就作為個人學習筆記參考參考吧。
一、開啟SDRAM
在Env中輸入menuconfig進入菜單,找到Enable SDRAM,開啟該bsp
可以看到在Drivers下多了一個drv_sdram.c文件
編譯成功后可以看一下SDRAM的各項參數,在sdram_port.h文件中
查閱資料時,都提到如果要使用SDRAM,必須要在進入 __main 前對SDRAM進行初始化,但是RTT很人性化的直接解決了這個問題,這個BSP已經實現了初始化這一步。可以看看串口打印的數據:
sdram init success, mapped at 0xC0000000, size is 33554432 bytes, data width is 16
初始化已經成功,首地址、大小以及數據長度的信息都已經打印出來,所以不需要畫蛇添足地再在start_up.s文件中添加SDRAM_Init函數
二、使用memheap申請和管理SDRAM空間
這一步要在Env中開啟Use all of memheap objects as heap
開啟后生成新工程,實際上就是開啟了RT_USING_MEMHEAP_AS_HEAP
三、定義和使用變量
我們可以使用rt_memheap_alloc來直接申請SDRAM內的空間,直接上代碼
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已經初始化了
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)//打印預存測試數據
{
for(ts=0;ts<1280*800;ts++)
{
rt_kprintf("testsram[%d]:%drn",ts,testsram[ts]);//顯示測試數據
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設為了外部變量
這樣就可以在其他文件中繼續使用這個初始化好的SDRAM。
接下來我主要是想定義一個16位1280*800大小的數組,是1280 乘以 800 乘以 2字節(16位為2字節)再除以1024等于2000KBytes,多算一點2050KBytes。
代碼中的按鍵和LED相關代碼可以刪除,要驗證的話可以直接看這三處:
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]);//顯示測試數據
ts+=200;
}
四、燒寫到板子上,驗證結果
在調用sdram_sample前使用命令list_memheap可以看到:
SDRAM初始化成功,大小和使用量都有,我們可以看到片外的 SDRAM 初始化之后我們并沒有使用,但是在 max used size 字段中確顯示已經使用了 48 字節的空間,這部分空間是內存堆的數據頭,用于 magic、used 信息及鏈表節點使用。
使用sdram_sample后,可以看到打印數據:
由于定義的是16位,最大為65535,所以后面溢出了。
最后打印完畢(因為一個一個打印太慢了,所以我加了“ts+=200”的語句,跳著打印),再使用list_memheap可以看到:
SDRAM內的空間已經使用了一部分,而內部RAM使用量沒有變。2050KBytes乘以1024=2099200字節,這就是我們申請使用的空間。
-
SDRAM
+關注
關注
7文章
422瀏覽量
55160 -
led燈
+關注
關注
22文章
1592瀏覽量
107841 -
BSP
+關注
關注
1文章
86瀏覽量
26111 -
SDRAM控制器
+關注
關注
0文章
28瀏覽量
8132 -
RTThread
+關注
關注
8文章
132瀏覽量
40811
發布評論請先 登錄
相關推薦
評論