加入收藏

keil5+Env将变量定义到SDRAM中的过程

2023-08-03 01:01:41 来源:疯洋CrazySheep

其实要把特别大的变量(数组)定义到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字节,这就是我们申请使用的空间。

关键词:

相关新闻

资讯

文昌市城区初中招生工作开始啦
文昌市城区初中招生工作开始啦

注意啦!注意啦!2023年文昌市城区初中招生工作即将开......更多>

农发行剑阁县支行:助力剑阁县城乡一体化发展
农发行剑阁县支行:助力剑阁县城乡一体化发展

近日,农发行剑阁县支行向四川健腾建设工程有限公司再......更多>

科研人员提出促进糖尿病伤口愈合新策略
科研人员提出促进糖尿病伤口愈合新策略

科研人员提出促进糖尿病伤口愈合新策略...更多>

蔬菜肉丝面(关于蔬菜肉丝面简述)
蔬菜肉丝面(关于蔬菜肉丝面简述)

,你们好,今天0471房产来聊聊一篇菜肉丝面,菜肉丝面......更多>

欧洲主要股指集体低开 德国DAX指数跌1.20%
欧洲主要股指集体低开 德国DAX指数跌1.20%

证券时报e公司讯,欧洲主要股指集体低开,德国DAX指数......更多>

洗牌加速,街边照相馆要关门?
洗牌加速,街边照相馆要关门?

时代抛弃你不会打招呼,时代选择你其实也不会打招呼。......更多>

西安市医保门诊新增11个慢性病病种
西安市医保门诊新增11个慢性病病种

原标题:西安市医保门诊新增11个慢性病病种三秦都市报......更多>

少年离家出走 民警通宵找回
少年离家出走 民警通宵找回

7月30日19时许,汉中市公安局汉台分局汉中路派出所接......更多>

2023国航股份集中采购部采购业务岗位招聘结果公示
2023国航股份集中采购部采购业务岗位招聘结果公示

点击查看>>>国航股份集中采购部2023年度采购业务岗位......更多>

关注

奥迪q5除雾键在哪里打开(奥迪q5除雾键在哪里?)
奥迪q5除雾键在哪里打开(奥迪q5除雾键在哪里?)
奥迪q5除雾键在空调控制面板,采用的是机械按键,分为... 更多>
奥迪q5除雾键在哪里打开(奥迪q5除雾键在哪里?)
奥迪q5除雾键在空调控制面板,采用的是机械按键,分为... 更多>
暗黑4变身索债之威能怎么获得
会有许多暗黑4朋友还不了解暗黑4变身索债之威能怎么获... 更多>
A股三大指数收跌:沪指跌近1% 北向资金净卖50亿
A股三大指数今日集体收跌,沪指跌%,收报点;深证成指... 更多>
亚太股市全线飘绿,日经225指数收跌2.3%,A股沪指一度跌超1%
8月2日,亚洲股市普遍下跌,日经225指数收跌2 3%,报... 更多>
下横线用键盘怎么打 下横线用键盘怎么打印出来
1 4在英文输入状态下2 4按住键盘上的shift键3 4再... 更多>
杨春红(关于杨春红的简介)
杨春红,春红的简介很多人还不知道,现在让我们一起来... 更多>
北京降级发布暴雨黄色预警 今明两天大部分地区有中雨
人民网北京8月1日电北京市气象台2023年8月1日07时00分... 更多>
2023年养老金补发时间:7月底前补发到账,哪些人能补发1500元以上?
2023年,养老金将会得到补发,这对于广大老年人来说无... 更多>
大写日期改成数字日期(大写日期怎么写)
今天小红来为大家带来的是大写日期改成数字日期,大写... 更多>
国家网信办:将全面升级“青少年模式”为“未成年人模式”
指南指出,移动智能终端、应用程序和应用程序分发平台... 更多>
小儿体重计算公式最新 小儿体重计算公式
0471房产来为大家解答以上的问题。小儿体重计算公式最... 更多>
探秘鼠尾草修剪技巧与圣诞时刻最佳英文小朋友礼物推荐
与许多多年生植物一样,修剪鼠尾草可以使其更加旺盛。... 更多>