像使用内部SRAM一样定义使用SDRAM和CCM RAM,可以随意定义到指定的RAM区域且无需具体地址
基于V6的测试例程:static/image/hrline/4.gif
实现说明:
默认情况下,我们都是通过MDK的option选项设置Flash和RAM
这种情况下,所有管理工作都是编译来处理的,不方面用户将变量定义到指定的CCM 或者SDRAM中。而使用__attribute__指定具体地址又不方便管理。
针对这种情况,使用一个脚本文件即可解决,脚本定义如下:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00200000{ ; load region size_region
ER_IROM1 0x08000000 0x00200000{; load address = execution address
*.o (RESET, +First)
*(InRoot$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00030000{; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x10000000 0x00010000{; RW data
*(.CCM_RAM)
}
RW_IRAM3 0xC0000000 0x01000000{; RW data
*(.SDRAM)
}
}
同时配置option的链接选项使用此脚本:
static/image/hrline/4.gif
使用方法:
使用方便很简单,依然是使用__attribute__,但是不指定具体地址了,指定RAM区,方法如下,仅需加个前缀即可:
/* 定义在CCM RAM里面的变量 */
__attribute__((section (".CCM_RAM"))) uint32_t CCMBuf1;
__attribute__((section (".CCM_RAM"))) uint16_t CCMCount;
/* 定义在SDRAM里面的变量 */
__attribute__((section (".SDRAM"))) uint32_t SDRAMBuf1;
__attribute__((section (".SDRAM"))) uint32_t SDRAMCount;
然后就可以直接使用变量,不过注意一点,使用SDRAM中的变量前,优先初始化SDRAM.
测试效果:
辛苦硬汉了,第一次离硬汉这么近。 多谢硬汉哥
感谢分享。 修改scatter loader文件的方式也有确定,一般sct文件keil自动生成的时候一般放在obj等中间文件所在的文件夹,一般我们习惯在原有的基础上修改,一旦代码搬移、obj文件夹删除、SVN提交等方式,obj文件夹内容一般不随工程移动,从而导致sct文件容易丢失,所以尽量拷出来防止误删除比较好
如果变量同在一个文件夹,可以通过文件指定RAM的方式更方便
zwmasdf 发表于 2018-9-4 11:01
修改scatter loader文件的方式也有确定,一般sct文件keil自动生成的时候一般放在obj等中间文件所在的文件夹 ...
是的,我这个是新建的sct,不再使用自带生成的。所以没有删除问题。 还不错,这样更方便了,支持下 这个方法,使用sdram 内存部分时,需要 4字节对齐操作吗 ? hpdell 发表于 2018-10-8 10:27
这个方法,使用sdram 内存部分时,需要 4字节对齐操作吗 ?
无限制。 eric2013 发表于 2018-10-8 10:35
无限制。
那感情好哇,有空捣鼓看看 很好的方法,确实可用。但是在rgb屏下,操作4k的sdram后,屏幕会花屏,有什么解决办法吗? 张晓 发表于 2018-12-5 23:22
很好的方法,确实可用。但是在rgb屏下,操作4k的sdram后,屏幕会花屏,有什么解决办法吗?
实测没问题,估计是你的程序有些问题。 代码比较简单,移植了emwin,但是内存分配用指定sdram区域有问题,给起始地址,emwin不启动,给个末尾地址可以启动,用的是原子的开发板,有些问题他们没有人跟踪回复。外存的分配方法也是按照修你的这个方法来的,找不到问题,大量访问sdram外存的时候,屏幕就像电视机做调试的那样规律的斑块:( 张晓 发表于 2018-12-6 10:10
代码比较简单,移植了emwin,但是内存分配用指定sdram区域有问题,给起始地址,emwin不启动,给个末尾地址 ...
你可以指定一块区域专门给emwin 使用啊,
分配给 emwin 使用的内存就不用加载到 脚本就可以了吧 @Eric 现在开始研究分散加载了,现在还有一个问题搞不清,加载时域与运行时域概念还是不是很清楚,可不可理解为加载时域是代码或者数据在ROM中的储存位置,而运行时域是代码运行时的绝对的连接地址?比如我要将代码拷贝到ARM中去运行,负责拷贝的代码运行时域可以定义在ROM的地址中,要被复制的ARM中的程序的运行时域定义在ARM的地址中,系统运行后负责拷贝的代码现运行起来,代码拷贝完后跳转到程序入口执行? yoyotansa 发表于 2019-4-11 11:00
@Eric 现在开始研究分散加载了,现在还有一个问题搞不清,加载时域与运行时域概念还是不是很清楚,可不可理 ...
多谢硬汉,HAL库驱动SDRAM之后通过楼主位的脚本,测试已经可以正常读写 声明变量时没有添加__attribute__((section (".CCM_RAM")))或者__attribute__((section (".SDRAM"))) 的话,变量都是默认在RW_IRAM1 中吗? mingri 发表于 2020-3-6 11:40
声明变量时没有添加__attribute__((section (".CCM_RAM")))或者__attribute__((section (".SDRAM"))) 的话 ...
对,要设置下分散加载。 每次来硬汉论坛都能学到东西:D 请教硬汉大哥:如果用ucos的话,任务堆栈也可以这样放在SDRAM中吗? jerry2020 发表于 2020-8-3 13:24
请教硬汉大哥:如果用ucos的话,任务堆栈也可以这样放在SDRAM中吗?
可以,但是不推荐,因为任务堆栈直接决定了任何切换速度,任务内部数据运算速度等核心部分。
eric2013 发表于 2020-8-3 13:39
可以,但是不推荐,因为任务堆栈直接决定了任何切换速度,任务内部数据运算速度等核心部分。
哦,是的。不知道比用内部SRAM慢多少? jerry2020 发表于 2020-8-3 14:57
哦,是的。不知道比用内部SRAM慢多少?
F429的内部SRAM是0等待周期,32bit带宽的,比如主频我们设置为168MHz。
那么读写速度就都是168MHz * 4= 672MB/S
而F429外接32bit带宽SDRAM的性能如下:
32位SDRAM写速度狂飙300MB/S,读速度90MB/S,需要专业的SDRAM测试方案来进一步测试
http://www.armbbs.cn/forum.php?mod=viewthread&tid=16836&fromuid=58
(出处: 硬汉嵌入式论坛)
eric2013 发表于 2020-8-3 15:26
F429的内部SRAM是0等待周期,32bit带宽的,比如主频我们设置为168MHz。
那么读写速度就都是168MHz * 4 ...
好的,还是用内部SRAM吧 此方法非常有用,和DATA_SECTION有异曲同工之效,可以把内存分成不同的片区,不同的变量定义到不同的内存下,方便管理。我一般都把数组跟敏感变量分开定义,至少会防止因数组越界造成程序发生异常。 请教硬汉哥,如果变量定义在SDRAM里面,是无法赋初值的吧? 例如: __attribute__((section (".SDRAM"))) uint32_t CCMBuf1={4,5,6}; 云琴箫龙 发表于 2020-12-10 23:24
例如: __attribute__((section (".SDRAM"))) uint32_t CCMBuf1={4,5,6};
对,不适合定义的时候设置。 请教硬汉哥,最近发现同样的方法在H743上分散加载SDRAM会造成死机(SDRAM驱动是正常的),请问你是否遇到过这个问题? 云琴箫龙 发表于 2021-4-19 22:37
请教硬汉哥,最近发现同样的方法在H743上分散加载SDRAM会造成死机(SDRAM驱动是正常的),请问你是否遇到过 ...
像使用内部SRAM一样定义使用STM32H7的外部SDRAM,含MDK和IAR两版
http://www.armbbs.cn/forum.php?mod=viewthread&tid=98697&fromuid=58
(出处: 硬汉嵌入式论坛)
eric2013 发表于 2021-4-20 10:06
像使用内部SRAM一样定义使用STM32H7的外部SDRAM,含MDK和IAR两版
http://www.armbbs.cn/forum.php?mod=v ...
可以了,非常感谢:handshake eric2013 发表于 2019-4-12 00:44
我想问一下加载域和执行域的地址是一样的吗?
做了BootLoader的话,APP程序的LR_IROM1 是从 0x804B000 开始的。那它的执行域也是要从0X804B000开始吗?
我还有个疑问,如果没有attribute的变量的话,是保存在IRAM1(RW+ZI)这里吗? 会飞的猪_2020 发表于 2021-5-26 02:50
我想问一下加载域和执行域的地址是一样的吗?
做了BootLoader的话,APP程序的LR_IROM1 是从 0x804B000...
对,这个BootLoader是的。
会飞的猪_2020 发表于 2021-5-26 03:02
我还有个疑问,如果没有attribute的变量的话,是保存在IRAM1(RW+ZI)这里吗?
对。 辛苦了学习下 多谢硬汉 硬汉,类似的IAR的工程能否也提供一个
gnail092 发表于 2023-4-18 14:19
硬汉,类似的IAR的工程能否也提供一个
像使用内部SRAM一样定义使用STM32H7的外部SDRAM,含MDK和IAR两版
https://www.armbbs.cn/forum.php?mod=viewthread&tid=98697&fromuid=58
(出处: 硬汉嵌入式论坛) 如果把 GUI 的读写缓存放到外部sram上,除了使用分散加载文件定义sram地址与外部sram初始化,还需要做其他的类似读写外部sram的操作吗?
页:
[1]
2