其实要把特别大的变量(数组)定义到SDRAM中步骤很简单,但这个过程却
08月03日 01:01
其实要把特别大的变量(数组)定义到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中步骤很简单,但这个过程却
08月03日 01:01
第5号台风“杜苏芮”带来的清凉转瞬即逝,8月又将回归“烧烤”模式。广
08月03日 00:57
7月29日以来,河北中南部和东部、北京大部、天津、山西中东部、河南大
08月03日 00:53
如果说,新时代的中国乡村如一幅幅美丽的画卷,那么抚松县兴隆乡南天门
08月03日 01:02
兴安岭上绿意葱盈,八方来客齐聚林都。8月1日,黑龙江省首届生态康养旅
08月03日 00:57
【简介】盛夏时节,瓜果飘香。走进河北省隆化县蓝旗镇蓝旗村的西瓜大棚
08月03日 00:50
交易商品牌 产地交货地最新报价乙二胺四甲叉膦酸钠EDTMPS 国标山东蓝
08月03日 00:55
面对来势汹汹、步步逼近的“杜苏芮”,国网厦门供电公司团委迅速落实公
08月03日 00:48
8月2日,2023年世界田联钻石联赛在北京宣布,2023钻石联赛厦门站比赛将
08月03日 00:55
首届“出彩河南人”颁奖现场周兰一(左)荣获“最美军嫂”称号。7月31日
08月03日 00:47
这是7月17日在三星堆博物馆新馆拍摄的青铜鸟足神像局部。 在新落成
08月03日 00:52
截至2023年8月2日收盘,华辰装备(300809)报收于20 87元,上涨3 16%,换
08月03日 00:48
天眼查App显示,近日,北京雅思博文化发展有限公司因违反广告法,被北
08月03日 00:57
在迷你世界中除了原材料之外,是没有其他道具的,所需道具都是要我们自
08月03日 00:59
「宁波白癜风医院」“排名出炉”儿童白癫风多久才能治疗好?「公开宣布
08月03日 00:52
本报北京8月1日电(记者李红梅)8月1日18时,中央气象台发布暴雨蓝色预
08月03日 00:53
1、《水力机械空化和固液两相流体动力学》是2007年中国水利水电出版社
08月03日 00:58
近日,瑞星威胁情报中心捕获到疑似国内病毒团伙利用HFS服务器传播病毒
08月03日 00:55
奥迪q5除雾键在空调控制面板,采用的是机械按键,分为前风挡除雾以及后
08月03日 00:49
1、车载导航仪升级,售后服务是最简单的办法,目前很多品牌导航仪为了
08月03日 00:43
为贯彻落实3060目标,响应国家大力发展可再生能源产业战略,推动公司实
08月03日 00:45
注意啦!注意啦!2023年文昌市城区初中招生工作即将开始申请时间为:20
08月03日 00:50
农业农村部于2018年4月发布了农业农村部公告第20号,其中包括《宠物饲
08月03日 00:52
近日,农发行剑阁县支行向四川健腾建设工程有限公司再次投放城乡一体化
08月03日 00:49
天眼查App显示,近日,恒大集团有限公司新增多条被执行人信息,执行标
08月03日 00:47
科研人员提出促进糖尿病伤口愈合新策略
08月03日 00:43
文旅集装箱民宿越来越受到欢迎,对于那些想要从事该行业的人,必须
08月03日 00:49
第二硬盘为启动盘(设置第二块硬盘为启动盘)我个人由于长期从事核心机房
08月03日 00:47
一个人去看了《封神》,看完之后,只有一个感觉:太残暴了!这跟我所看
08月03日 00:43
1、宽敞宽敞kuānchǎng[解释]:宽阔;宽大:这间屋子很宽敞。2、宽敞
08月03日 00:44