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

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

digilent Artix-7 FPGA开发板简介
aigo移动固态硬盘S9体验:张扬的外观+强劲的实力
数字资产抵押平台,数字资产区块链交易所开发公司
5G将如何启用和加速物联网?
未来语音芯片在AIoT道路上的发展情况如何
keil5+Env将变量定义到SDRAM中的过程
微星官方宣布将为符合条件的产品用户进行延保2个月
韩国呼吁对区块链行业进行监管,欧盟建议对区块链监管应采取哪五个步骤?
联想宣布了一个新的有趣的工作站-ThinkStation P620
西部数据和铠侠有望“再续前缘”?
交通信号机嵌入式开发板应用方案的详细说明
乐见华为参与德国5G建设
关于欧菲科技深圳公明园区发生员工群体事件说明
苹果在中国30多个地区跟100多家运营商完成了5G测试
5G垂直行业的拓展为小基站提供了新的应用场景
智能技术成工业4.0时代产业升级关键
美国Q-lab UVA-340+灯管
蓝奥声智慧用电监测节能解决方案
Node搭建本地MQTT服务器
可穿戴新式研究技术:可对婴幼儿大脑进行成像