eric2013 发表于 2018-9-4 01:06:32

像使用内部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.

测试效果:





片羽之神 发表于 2018-9-4 06:33:39

辛苦硬汉了,第一次离硬汉这么近。

MaxChen 发表于 2018-9-4 08:35:25

多谢硬汉哥

byccc 发表于 2018-9-4 10:02:05

感谢分享。

zwmasdf 发表于 2018-9-4 11:01:34

修改scatter loader文件的方式也有确定,一般sct文件keil自动生成的时候一般放在obj等中间文件所在的文件夹,一般我们习惯在原有的基础上修改,一旦代码搬移、obj文件夹删除、SVN提交等方式,obj文件夹内容一般不随工程移动,从而导致sct文件容易丢失,所以尽量拷出来防止误删除比较好
如果变量同在一个文件夹,可以通过文件指定RAM的方式更方便

eric2013 发表于 2018-9-4 11:25:02

zwmasdf 发表于 2018-9-4 11:01
修改scatter loader文件的方式也有确定,一般sct文件keil自动生成的时候一般放在obj等中间文件所在的文件夹 ...
是的,我这个是新建的sct,不再使用自带生成的。所以没有删除问题。

honami520 发表于 2018-9-4 13:27:30

还不错,这样更方便了,支持下

hpdell 发表于 2018-10-8 10:27:28

这个方法,使用sdram 内存部分时,需要 4字节对齐操作吗 ?

eric2013 发表于 2018-10-8 10:35:11

hpdell 发表于 2018-10-8 10:27
这个方法,使用sdram 内存部分时,需要 4字节对齐操作吗 ?

无限制。

hpdell 发表于 2018-10-8 11:52:12

eric2013 发表于 2018-10-8 10:35
无限制。

那感情好哇,有空捣鼓看看

张晓 发表于 2018-12-5 23:22:29

很好的方法,确实可用。但是在rgb屏下,操作4k的sdram后,屏幕会花屏,有什么解决办法吗?

eric2013 发表于 2018-12-6 00:38:17

张晓 发表于 2018-12-5 23:22
很好的方法,确实可用。但是在rgb屏下,操作4k的sdram后,屏幕会花屏,有什么解决办法吗?

实测没问题,估计是你的程序有些问题。

张晓 发表于 2018-12-6 10:10:20

代码比较简单,移植了emwin,但是内存分配用指定sdram区域有问题,给起始地址,emwin不启动,给个末尾地址可以启动,用的是原子的开发板,有些问题他们没有人跟踪回复。外存的分配方法也是按照修你的这个方法来的,找不到问题,大量访问sdram外存的时候,屏幕就像电视机做调试的那样规律的斑块:(

hpdell 发表于 2019-1-8 17:19:24

张晓 发表于 2018-12-6 10:10
代码比较简单,移植了emwin,但是内存分配用指定sdram区域有问题,给起始地址,emwin不启动,给个末尾地址 ...

你可以指定一块区域专门给emwin 使用啊,

分配给 emwin 使用的内存就不用加载到 脚本就可以了吧

yoyotansa 发表于 2019-4-11 11:00:30

@Eric 现在开始研究分散加载了,现在还有一个问题搞不清,加载时域与运行时域概念还是不是很清楚,可不可理解为加载时域是代码或者数据在ROM中的储存位置,而运行时域是代码运行时的绝对的连接地址?比如我要将代码拷贝到ARM中去运行,负责拷贝的代码运行时域可以定义在ROM的地址中,要被复制的ARM中的程序的运行时域定义在ARM的地址中,系统运行后负责拷贝的代码现运行起来,代码拷贝完后跳转到程序入口执行?

eric2013 发表于 2019-4-12 00:44:34

yoyotansa 发表于 2019-4-11 11:00
@Eric 现在开始研究分散加载了,现在还有一个问题搞不清,加载时域与运行时域概念还是不是很清楚,可不可理 ...


weiyuliang 发表于 2020-2-25 21:39:51

多谢硬汉,HAL库驱动SDRAM之后通过楼主位的脚本,测试已经可以正常读写

mingri 发表于 2020-3-6 11:40:21

声明变量时没有添加__attribute__((section (".CCM_RAM")))或者__attribute__((section (".SDRAM"))) 的话,变量都是默认在RW_IRAM1 中吗?

eric2013 发表于 2020-3-6 11:51:18

mingri 发表于 2020-3-6 11:40
声明变量时没有添加__attribute__((section (".CCM_RAM")))或者__attribute__((section (".SDRAM"))) 的话 ...

对,要设置下分散加载。

youxiu 发表于 2020-4-10 15:56:58

每次来硬汉论坛都能学到东西:D

jerry2020 发表于 2020-8-3 13:24:55

请教硬汉大哥:如果用ucos的话,任务堆栈也可以这样放在SDRAM中吗?

eric2013 发表于 2020-8-3 13:39:02

jerry2020 发表于 2020-8-3 13:24
请教硬汉大哥:如果用ucos的话,任务堆栈也可以这样放在SDRAM中吗?

可以,但是不推荐,因为任务堆栈直接决定了任何切换速度,任务内部数据运算速度等核心部分。

jerry2020 发表于 2020-8-3 14:57:57

eric2013 发表于 2020-8-3 13:39
可以,但是不推荐,因为任务堆栈直接决定了任何切换速度,任务内部数据运算速度等核心部分。

哦,是的。不知道比用内部SRAM慢多少?

eric2013 发表于 2020-8-3 15:26:15

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
(出处: 硬汉嵌入式论坛)

jerry2020 发表于 2020-8-3 15:45:15

eric2013 发表于 2020-8-3 15:26
F429的内部SRAM是0等待周期,32bit带宽的,比如主频我们设置为168MHz。

那么读写速度就都是168MHz * 4 ...

好的,还是用内部SRAM吧

云琴箫龙 发表于 2020-8-19 13:30:36

此方法非常有用,和DATA_SECTION有异曲同工之效,可以把内存分成不同的片区,不同的变量定义到不同的内存下,方便管理。我一般都把数组跟敏感变量分开定义,至少会防止因数组越界造成程序发生异常。

云琴箫龙 发表于 2020-12-10 23:23:31

请教硬汉哥,如果变量定义在SDRAM里面,是无法赋初值的吧?

云琴箫龙 发表于 2020-12-10 23:24:03

例如: __attribute__((section (".SDRAM"))) uint32_t CCMBuf1={4,5,6};

eric2013 发表于 2020-12-11 08:57:24

云琴箫龙 发表于 2020-12-10 23:24
例如: __attribute__((section (".SDRAM"))) uint32_t CCMBuf1={4,5,6};

对,不适合定义的时候设置。

云琴箫龙 发表于 2021-4-19 22:37:27

请教硬汉哥,最近发现同样的方法在H743上分散加载SDRAM会造成死机(SDRAM驱动是正常的),请问你是否遇到过这个问题?

eric2013 发表于 2021-4-20 10:06:16

云琴箫龙 发表于 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
(出处: 硬汉嵌入式论坛)

云琴箫龙 发表于 2021-4-20 11:12:04

eric2013 发表于 2021-4-20 10:06
像使用内部SRAM一样定义使用STM32H7的外部SDRAM,含MDK和IAR两版
http://www.armbbs.cn/forum.php?mod=v ...

可以了,非常感谢:handshake

会飞的猪_2020 发表于 2021-5-26 02:50:21

eric2013 发表于 2019-4-12 00:44


我想问一下加载域和执行域的地址是一样的吗?
做了BootLoader的话,APP程序的LR_IROM1 是从 0x804B000 开始的。那它的执行域也是要从0X804B000开始吗?

会飞的猪_2020 发表于 2021-5-26 03:02:35

我还有个疑问,如果没有attribute的变量的话,是保存在IRAM1(RW+ZI)这里吗?

eric2013 发表于 2021-5-26 08:16:01

会飞的猪_2020 发表于 2021-5-26 02:50
我想问一下加载域和执行域的地址是一样的吗?
做了BootLoader的话,APP程序的LR_IROM1 是从 0x804B000...

对,这个BootLoader是的。

eric2013 发表于 2021-5-26 08:17:43

会飞的猪_2020 发表于 2021-5-26 03:02
我还有个疑问,如果没有attribute的变量的话,是保存在IRAM1(RW+ZI)这里吗?

对。

wangff2531 发表于 2022-6-18 10:08:10

辛苦了学习下 多谢硬汉

gnail092 发表于 2023-4-18 14:19:55

硬汉,类似的IAR的工程能否也提供一个

eric2013 发表于 2023-4-18 14:32:11

gnail092 发表于 2023-4-18 14:19
硬汉,类似的IAR的工程能否也提供一个

像使用内部SRAM一样定义使用STM32H7的外部SDRAM,含MDK和IAR两版
https://www.armbbs.cn/forum.php?mod=viewthread&tid=98697&fromuid=58
(出处: 硬汉嵌入式论坛)

TRX 发表于 2023-4-24 12:59:03

如果把 GUI 的读写缓存放到外部sram上,除了使用分散加载文件定义sram地址与外部sram初始化,还需要做其他的类似读写外部sram的操作吗?
页: [1] 2
查看完整版本: 像使用内部SRAM一样定义使用SDRAM和CCM RAM,可以随意定义到指定的RAM区域且无需具体地址