0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

keil5+Env將變量定義到SDRAM中的過程

冬至子 ? 來源:瘋洋CrazySheep ? 作者:瘋洋CrazySheep ? 2023-08-02 14:39 ? 次閱讀

其實(shí)要把特別大的變量(數(shù)組)定義到SDRAM中步驟很簡(jiǎn)單,但這個(gè)過程卻困擾了我好久,此篇文章就作為個(gè)人學(xué)習(xí)筆記參考參考吧。

一、開啟SDRAM

在Env中輸入menuconfig進(jìn)入菜單,找到Enable SDRAM,開啟該bsp

1.jpg

可以看到在Drivers下多了一個(gè)drv_sdram.c文件

1.jpg

編譯成功后可以看一下SDRAM的各項(xiàng)參數(shù),在sdram_port.h文件中

1.jpg

查閱資料時(shí),都提到如果要使用SDRAM,必須要在進(jìn)入 __main 前對(duì)SDRAM進(jìn)行初始化,但是RTT很人性化的直接解決了這個(gè)問題,這個(gè)BSP已經(jīng)實(shí)現(xiàn)了初始化這一步??梢钥纯创诖蛴〉臄?shù)據(jù):

1.jpg

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

1.jpg

1.jpg

開啟后生成新工程,實(shí)際上就是開啟了RT_USING_MEMHEAP_AS_HEAP

1.jpg

三、定義和使用變量

我們可以使用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è)為了外部變量

1.jpg

這樣就可以在其他文件中繼續(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可以看到:

1.jpg

SDRAM初始化成功,大小和使用量都有,我們可以看到片外的 SDRAM 初始化之后我們并沒有使用,但是在 max used size 字段中確顯示已經(jīng)使用了 48 字節(jié)的空間,這部分空間是內(nèi)存堆的數(shù)據(jù)頭,用于 magic、used 信息及鏈表節(jié)點(diǎn)使用。

使用sdram_sample后,可以看到打印數(shù)據(jù):

1.jpg

由于定義的是16位,最大為65535,所以后面溢出了。

1.jpg

最后打印完畢(因?yàn)橐粋€(gè)一個(gè)打印太慢了,所以我加了“ts+=200”的語(yǔ)句,跳著打?。偈褂胠ist_memheap可以看到:

1.jpg

SDRAM內(nèi)的空間已經(jīng)使用了一部分,而內(nèi)部RAM使用量沒有變。2050KBytes乘以1024=2099200字節(jié),這就是我們申請(qǐng)使用的空間。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SDRAM
    +關(guān)注

    關(guān)注

    7

    文章

    422

    瀏覽量

    55133
  • led燈
    +關(guān)注

    關(guān)注

    22

    文章

    1592

    瀏覽量

    107751
  • BSP
    BSP
    +關(guān)注

    關(guān)注

    1

    文章

    86

    瀏覽量

    26085
  • SDRAM控制器
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    8125
  • RTThread
    +關(guān)注

    關(guān)注

    7

    文章

    132

    瀏覽量

    40776
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    stm32f429如何把變量定義sdram中去?

    最近搞stm32f429,請(qǐng)教如何把變量定義sdram中去?能夠同時(shí)使用內(nèi)部的sram和外部的sdram嗎?
    發(fā)表于 05-15 07:54

    Keil C51變量的使用方法詳解

    引言 8051內(nèi)核單片機(jī)是一種通用單片機(jī),在國(guó)內(nèi)占有較大的市場(chǎng)份額。在C語(yǔ)言用于51內(nèi)核單片機(jī)的研究方面,Keil公司做得最為成功。由于51內(nèi)核單片機(jī)的存儲(chǔ)結(jié)構(gòu)的特殊性,Keil C51
    發(fā)表于 11-30 17:21

    keil局部變量分配地址問題

    得到的結(jié)論是兩個(gè)task的a和b地址被ucos的其它變量使用了 只有a和b變量定義為sta
    發(fā)表于 01-20 12:25

    keil單片機(jī)C編程指針與變量的關(guān)系

    賦值;q=&qq;p或q的值會(huì)出問題正常,沒問題(Type為一結(jié)構(gòu)體)結(jié)論:情景二,是指針使用的規(guī)范過程,先分配了變量,然后指針指向變量。情景一
    發(fā)表于 07-14 08:35

    51單片機(jī)的變量的位如何定義

    51單片機(jī)的變量的位如何定義,在單片機(jī)編程使用,會(huì)涉及某些函數(shù)定義
    發(fā)表于 07-19 09:02

    RT Thread Studio如何數(shù)據(jù)定義到外部SDRAM中去?

    在LVGL為了提高LCD RGB屏幕的刷新速度,現(xiàn)在static lv_color_t buf_1[MY_DISP_HOR_RES * 20]; 的buf_1緩存改大,并定義
    發(fā)表于 05-20 15:20

    如何讓鏈接器識(shí)別變量sdram定義并對(duì)其進(jìn)行內(nèi)存管理?

    DEADBEEF 分配給 sdram[0] 之前在 main() 內(nèi)部本地聲明它,編譯器 barfs。如何讓鏈接器識(shí)別變量 sdram定義
    發(fā)表于 01-04 09:04

    RT Thread Studio怎么數(shù)據(jù)定義到外部SDRAM中去呢?

    在LVGL為了提高LCD RGB屏幕的刷新速度,現(xiàn)在static lv_color_t buf_1[MY_DISP_HOR_RES * 20];的buf_1緩存改大,并定義
    發(fā)表于 02-22 14:27

    請(qǐng)問如何通過某些修改變量定義SRAM或SDRAM?

    現(xiàn)在,我正在使用帶有 SDRAM 的 imxrt1052。所有變量都在 SDRAM 。但我想要 SRAM 的一些
    發(fā)表于 05-12 08:23

    西門子PLC變量定義變量

    什么是變量變量是用于程序的,可以有不同值的變量。? 根據(jù)應(yīng)用范圍,變量可分為以下幾類 ●? 局部變量:? 局部
    的頭像 發(fā)表于 12-23 16:25 ?2w次閱讀
    西門子PLC<b class='flag-5'>變量</b>表<b class='flag-5'>中</b><b class='flag-5'>定義</b><b class='flag-5'>變量</b>

    IAR EWARM的一個(gè)函數(shù)拷貝Keil里后編譯出錯(cuò)了?

    有讀者問了這樣一個(gè)問題:我IAR EWARM的一個(gè)函數(shù),拷貝Keil MDK-ARM之后,編譯出錯(cuò)了? 為什么在EWARM
    的頭像 發(fā)表于 04-02 10:56 ?2314次閱讀
    <b class='flag-5'>將</b>IAR EWARM的一個(gè)函數(shù)拷貝<b class='flag-5'>到</b><b class='flag-5'>Keil</b>里后編譯出錯(cuò)了?

    【STM32CubeIDE】變量定義指定地址

    使用Keil在使用Keil編寫程序的時(shí)候我們可以很輕松的變量定義指定地址uint8_t ar
    發(fā)表于 12-27 19:08 ?28次下載
    【STM32CubeIDE】<b class='flag-5'>將</b><b class='flag-5'>變量</b><b class='flag-5'>定義</b><b class='flag-5'>到</b>指定地址

    KEIL5C語(yǔ)言編程時(shí)可以在可執(zhí)行語(yǔ)句之后定義變量

    以前看過有的程序在可執(zhí)行變量之后定義,當(dāng)時(shí)就挺納悶,C語(yǔ)言不是只能在函數(shù)的可執(zhí)行語(yǔ)句之前定義變量嗎。后來偶然發(fā)現(xiàn)KEIL5
    發(fā)表于 01-13 13:05 ?2次下載
    <b class='flag-5'>KEIL5</b><b class='flag-5'>中</b>C語(yǔ)言編程時(shí)可以在可執(zhí)行語(yǔ)句之后<b class='flag-5'>定義</b><b class='flag-5'>變量</b>

    oracle sql 定義變量并賦值

    賦值可以通過使用PL/SQL語(yǔ)句塊或使用SQL*Plus工具來實(shí)現(xiàn)。下面詳細(xì)介紹這兩種方法以及它們的具體用法。 使用PL/SQL語(yǔ)句塊定義和賦值變量: 在Oracle SQL,PL
    的頭像 發(fā)表于 12-06 10:46 ?2565次閱讀

    Keil變量不被初始化方法

    有些時(shí)候在我們的應(yīng)用過程中要求變量有連續(xù)性,或者現(xiàn)場(chǎng)保留,例如Bootloader跳轉(zhuǎn),某種原因的復(fù)位過程中我們有些關(guān)鍵變量不能被初始化,在不同的編譯環(huán)境下有不同的設(shè)置,本文就這個(gè)操作
    的頭像 發(fā)表于 08-30 11:47 ?470次閱讀
    <b class='flag-5'>Keil</b><b class='flag-5'>中</b><b class='flag-5'>變量</b>不被初始化方法