Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
SDRAM
keil5+Env将变量定义到SDRAM中
发布于 2023-08-01 22:58:22 浏览:929
订阅该版
其实要把特别大的变量(数组)定义到SDRAM中步骤很简单,但这个过程却困扰了我好久,此篇文章就作为个人学习笔记参考参考吧。 (技术小白,如果有哪里写错的麻烦留言,我会尽力改正确,谢谢!) 一、开启SDRAM 在Env中输入menuconfig进入菜单,找到Enable SDRAM,开启该bsp ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230801/5c98efe1c23c1a857d1a7b7426112660.png) 可以看到在Drivers下多了一个drv_sdram.c文件 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230801/67fbd95e6a5386938277849ef035339c.png) 编译成功后可以看一下SDRAM的各项参数,在sdram_port.h文件中 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230801/3a9064fcee0b5b0b6af2c7df82821178.png) 查阅资料时,都提到如果要使用SDRAM,必须要在进入 __main 前对SDRAM进行初始化,但是RTT很人性化的直接解决了这个问题,这个BSP已经实现了初始化这一步。可以看看串口打印的数据: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230801/abcd4e41a23a7e84b6d137da844a0b58.png) 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 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230801/93d50e94b693d2b60278897e3ee841c5.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230801/d8265e83a2c41b78ad7120ce90daebd1.png) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230801/36be703d4399362b6f2ec7f310073868.png) 开启后生成新工程,实际上就是开启了RT_USING_MEMHEAP_AS_HEAP ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230801/6cbb61516256876878e8cc30e5fd849b.png) 三、定义和使用变量 我们可以使用rt_memheap_alloc来直接申请SDRAM内的空间,直接上代码 ```c 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]:%d\r\n",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设为了外部变量 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230801/dd07d89398341b867dade547bb042068.png) 这样就可以在其他文件中继续使用这个初始化好的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); ```c for(ts=0;ts<800;ts++) { for(ty=0;ty<1280;ty++) { testsram[ts*ty]=ty*ts; } } ``` ```c for(ts=0;ts<1280*800;ts++) { rt_kprintf("testsram[%d]:%d\r\n",ts,testsram[ts]);//显示测试数据 ts+=200; } ``` 四、烧写到板子上,验证结果 在调用sdram_sample前使用命令list_memheap可以看到: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230801/924e52156b621dd6f26a14f9149e19f0.png) SDRAM初始化成功,大小和使用量都有,我们可以看到片外的 SDRAM 初始化之后我们并没有使用,但是在 max used size 字段中确显示已经使用了 48 字节的空间,这部分空间是内存堆的数据头,用于 magic、used 信息及链表节点使用。 使用sdram_sample后,可以看到打印数据: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230801/3848949714031c960f2822f364890209.png) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230801/997319ca1accf79c7f16bfadf5effcff.png) 由于定义的是16位,最大为65535,所以后面溢出了。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230801/3c825d1cf8fb114106cbfb153d9a0ef8.png) 最后打印完毕(因为一个一个打印太慢了,所以我加了“ts+=200”的语句,跳着打印),再使用list_memheap可以看到: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230801/60250d3f2b37772b60913d685f18d985.png) SDRAM内的空间已经使用了一部分,而内部RAM使用量没有变。2050KBytes乘以1024=2099200字节,这就是我们申请使用的空间。 希望上面的方法能给到读者一点帮助,同时也让自己不要忘记这样的用法,共勉。 最后附上大佬的文章,很有帮助! https://club.rt-thread.org/ask/article/515cd53659579d05.html https://zhuanlan.zhihu.com/p/564636262
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
疯洋CrazySheep
这家伙很懒,什么也没写!
文章
2
回答
4
被采纳
0
关注TA
发私信
相关文章
1
外部内存分配SDRAM
2
rtthread sdram
3
rtthread studio修改lds支持SDRAM后编译出来的文件变大了很多
4
RTT STUDIO如何定义数组到外部SDRAM。
5
rt-thread如何管理外部32M的SDRAM内存,求指教
6
求助,外部SDRAM使用memheap管理后系统起不来了
7
SDRAM 初始化的延时特别慢
8
rtrhread SDRAM 绝对地址定义,怎么解?
9
RTT STUDIO 如何动态分配SDRAM
10
SDRAM 加载慢 速度正常
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部