精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

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

一、開啟SDRAM

在Env中輸入menuconfig進入菜單,找到Enable SDRAM,開啟該bsp

1.jpg

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

1.jpg

編譯成功后可以看一下SDRAM的各項參數,在sdram_port.h文件中

1.jpg

查閱資料時,都提到如果要使用SDRAM,必須要在進入 __main 前對SDRAM進行初始化,但是RTT很人性化的直接解決了這個問題,這個BSP已經實現了初始化這一步。可以看看串口打印的數據:

1.jpg

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

1.jpg

1.jpg

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

1.jpg

三、定義和使用變量

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

1.jpg

這樣就可以在其他文件中繼續使用這個初始化好的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可以看到:

1.jpg

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

使用sdram_sample后,可以看到打印數據:

1.jpg

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

1.jpg

最后打印完畢(因為一個一個打印太慢了,所以我加了“ts+=200”的語句,跳著打印),再使用list_memheap可以看到:

1.jpg

SDRAM內的空間已經使用了一部分,而內部RAM使用量沒有變。2050KBytes乘以1024=2099200字節,這就是我們申請使用的空間。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SDRAM
    +關注

    關注

    7

    文章

    422

    瀏覽量

    55160
  • led燈
    +關注

    關注

    22

    文章

    1592

    瀏覽量

    107841
  • BSP
    BSP
    +關注

    關注

    1

    文章

    86

    瀏覽量

    26111
  • SDRAM控制器
    +關注

    關注

    0

    文章

    28

    瀏覽量

    8132
  • RTThread
    +關注

    關注

    8

    文章

    132

    瀏覽量

    40811
收藏 人收藏

    評論

    相關推薦

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

    最近搞stm32f429,請教如何把變量定義sdram中去?能夠同時使用內部的sram和外部的sdram嗎?
    發表于 05-15 07:54

    Keil C51變量的使用方法詳解

    引言 8051內核單片機是一種通用單片機,在國內占有較大的市場份額。在C語言用于51內核單片機的研究方面,Keil公司做得最為成功。由于51內核單片機的存儲結構的特殊性,Keil C51
    發表于 11-30 17:21

    keil局部變量分配地址問題

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

    keil單片機C編程指針與變量的關系

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

    51單片機的變量的位如何定義

    51單片機的變量的位如何定義,在單片機編程使用,會涉及某些函數定義
    發表于 07-19 09:02

    RT Thread Studio如何數據定義到外部SDRAM中去?

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

    如何讓鏈接器識別變量sdram定義并對其進行內存管理?

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

    RT Thread Studio怎么數據定義到外部SDRAM中去呢?

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

    請問如何通過某些修改變量定義SRAM或SDRAM

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

    西門子PLC變量定義變量

    什么是變量變量是用于程序的,可以有不同值的變量。? 根據應用范圍,變量可分為以下幾類 ●? 局部變量:? 局部
    的頭像 發表于 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的一個函數拷貝Keil里后編譯出錯了?

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

    【STM32CubeIDE】變量定義指定地址

    使用Keil在使用Keil編寫程序的時候我們可以很輕松的變量定義指定地址uint8_t ar
    發表于 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語言編程時可以在可執行語句之后定義變量

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

    oracle sql 定義變量并賦值

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

    Keil變量不被初始化方法

    有些時候在我們的應用過程中要求變量有連續性,或者現場保留,例如Bootloader跳轉,某種原因的復位過程中我們有些關鍵變量不能被初始化,在不同的編譯環境下有不同的設置,本文就這個操作
    的頭像 發表于 08-30 11:47 ?535次閱讀
    <b class='flag-5'>Keil</b><b class='flag-5'>中</b><b class='flag-5'>變量</b>不被初始化方法