硬汉嵌入式论坛

 找回密码
 立即注册
查看: 12151|回复: 45
收起左侧

像使用内部SRAM一样定义使用SDRAM和CCM RAM,可以随意定义到指定的RAM区域且无需具体地址

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
发表于 2018-9-4 01:06:32 | 显示全部楼层 |阅读模式
基于V6的测试例程:
使用内部SRAM一样使用SDRAM和CCM RAM.7z (3.02 MB, 下载次数: 1204)


实现说明:

默认情况下,我们都是通过MDK的option选项设置Flash和RAM
1.png

这种情况下,所有管理工作都是编译来处理的,不方面用户将变量定义到指定的CCM 或者SDRAM中。而使用__attribute__指定具体地址又不方便管理。

针对这种情况,使用一个脚本文件即可解决,脚本定义如下:
  1. ; *************************************************************
  2. ; *** Scatter-Loading Description File generated by uVision ***
  3. ; *************************************************************

  4. LR_IROM1 0x08000000 0x00200000  {    ; load region size_region
  5.   ER_IROM1 0x08000000 0x00200000  {  ; load address = execution address
  6.    *.o (RESET, +First)
  7.    *(InRoot$Sections)
  8.    .ANY (+RO)
  9.   }
  10.   RW_IRAM1 0x20000000 0x00030000  {  ; RW data
  11.    .ANY (+RW +ZI)
  12.   }
  13.   RW_IRAM2 0x10000000 0x00010000  {  ; RW data
  14.    *(.CCM_RAM)
  15.   
  16.   }
  17.   RW_IRAM3 0xC0000000 0x01000000  {  ; RW data
  18.    *(.SDRAM)
  19.   
  20.   }
  21. }
复制代码

同时配置option的链接选项使用此脚本:
88.png


使用方法:
使用方便很简单,依然是使用__attribute__,但是不指定具体地址了,指定RAM区,方法如下,仅需加个前缀即可:
  1. /* 定义在CCM RAM里面的变量 */
  2. __attribute__((section (".CCM_RAM"))) uint32_t CCMBuf1[10];
  3. __attribute__((section (".CCM_RAM"))) uint16_t CCMCount;

  4. /* 定义在SDRAM里面的变量 */
  5. __attribute__((section (".SDRAM"))) uint32_t SDRAMBuf1[10];
  6. __attribute__((section (".SDRAM"))) uint32_t SDRAMCount;
复制代码

然后就可以直接使用变量,不过注意一点,使用SDRAM中的变量前,优先初始化SDRAM.

测试效果:
999.png




回复

使用道具 举报

0

主题

38

回帖

38

积分

新手上路

one is enough

积分
38
发表于 2018-9-4 06:33:39 | 显示全部楼层
辛苦硬汉了,第一次离硬汉这么近。
one is enough
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2018-9-4 08:35:25 | 显示全部楼层
多谢硬汉哥
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2018-9-4 10:02:05 | 显示全部楼层
感谢分享。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

8

主题

42

回帖

71

积分

初级会员

积分
71
发表于 2018-9-4 11:01:34 | 显示全部楼层
修改scatter loader文件的方式也有确定,一般sct文件keil自动生成的时候一般放在obj等中间文件所在的文件夹,一般我们习惯在原有的基础上修改,一旦代码搬移、obj文件夹删除、SVN提交等方式,obj文件夹内容一般不随工程移动,从而导致sct文件容易丢失,所以尽量拷出来防止误删除比较好
如果变量同在一个文件夹,可以通过文件指定RAM的方式更方便
捕获.PNG
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2018-9-4 11:25:02 | 显示全部楼层
zwmasdf 发表于 2018-9-4 11:01
修改scatter loader文件的方式也有确定,一般sct文件keil自动生成的时候一般放在obj等中间文件所在的文件夹 ...

是的,我这个是新建的sct,不再使用自带生成的。所以没有删除问题。
回复

使用道具 举报

5

主题

201

回帖

216

积分

高级会员

积分
216
发表于 2018-9-4 13:27:30 | 显示全部楼层
还不错,这样更方便了,支持下
回复

使用道具 举报

608

主题

3043

回帖

4887

积分

至尊会员

积分
4887
发表于 2018-10-8 10:27:28 | 显示全部楼层
这个方法,使用sdram 内存部分时,需要 4字节对齐操作吗 ?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2018-10-8 10:35:11 | 显示全部楼层
hpdell 发表于 2018-10-8 10:27
这个方法,使用sdram 内存部分时,需要 4字节对齐操作吗 ?

无限制。
回复

使用道具 举报

608

主题

3043

回帖

4887

积分

至尊会员

积分
4887
发表于 2018-10-8 11:52:12 | 显示全部楼层

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

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2018-12-5 23:22:29 | 显示全部楼层
很好的方法,确实可用。但是在rgb屏下,操作4k的sdram后,屏幕会花屏,有什么解决办法吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2018-12-6 00:38:17 | 显示全部楼层
张晓 发表于 2018-12-5 23:22
很好的方法,确实可用。但是在rgb屏下,操作4k的sdram后,屏幕会花屏,有什么解决办法吗?

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

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

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

使用道具 举报

608

主题

3043

回帖

4887

积分

至尊会员

积分
4887
发表于 2019-1-8 17:19:24 | 显示全部楼层
张晓 发表于 2018-12-6 10:10
代码比较简单,移植了emwin,但是内存分配用指定sdram区域有问题,给起始地址,emwin不启动,给个末尾地址 ...

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

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

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2019-4-12 00:44:34 | 显示全部楼层
yoyotansa 发表于 2019-4-11 11:00
@Eric 现在开始研究分散加载了,现在还有一个问题搞不清,加载时域与运行时域概念还是不是很清楚,可不可理 ...

QQ截图20190412004352.jpg
回复

使用道具 举报

32

主题

295

回帖

391

积分

高级会员

积分
391
发表于 2020-2-25 21:39:51 | 显示全部楼层
多谢硬汉,HAL库驱动SDRAM之后通过楼主位的脚本,测试已经可以正常读写
回复

使用道具 举报

3

主题

16

回帖

25

积分

新手上路

积分
25
发表于 2020-3-6 11:40:21 | 显示全部楼层
声明变量时没有添加__attribute__((section (".CCM_RAM")))或者__attribute__((section (".SDRAM"))) 的话,变量都是默认在RW_IRAM1 中吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2020-3-6 11:51:18 | 显示全部楼层
mingri 发表于 2020-3-6 11:40
声明变量时没有添加__attribute__((section (".CCM_RAM")))或者__attribute__((section (".SDRAM"))) 的话 ...

对,要设置下分散加载。
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2020-4-10 15:56:58 | 显示全部楼层
每次来硬汉论坛都能学到东西
回复

使用道具 举报

9

主题

34

回帖

61

积分

初级会员

积分
61
发表于 2020-8-3 13:24:55 | 显示全部楼层
请教硬汉大哥:如果用ucos的话,任务堆栈也可以这样放在SDRAM中吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2020-8-3 13:39:02 | 显示全部楼层
jerry2020 发表于 2020-8-3 13:24
请教硬汉大哥:如果用ucos的话,任务堆栈也可以这样放在SDRAM中吗?

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

回复

使用道具 举报

9

主题

34

回帖

61

积分

初级会员

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

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 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?m ... 6836&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

9

主题

34

回帖

61

积分

初级会员

积分
61
发表于 2020-8-3 15:45:15 | 显示全部楼层
eric2013 发表于 2020-8-3 15:26
F429的内部SRAM是0等待周期,32bit带宽的,比如主频我们设置为168MHz。

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

好的,还是用内部SRAM吧
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2020-8-19 13:30:36 | 显示全部楼层
此方法非常有用,和DATA_SECTION有异曲同工之效,可以把内存分成不同的片区,不同的变量定义到不同的内存下,方便管理。我一般都把数组跟敏感变量分开定义,至少会防止因数组越界造成程序发生异常。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2020-12-10 23:23:31 | 显示全部楼层
请教硬汉哥,如果变量定义在SDRAM里面,是无法赋初值的吧?
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2020-12-10 23:24:03 | 显示全部楼层
例如: __attribute__((section (".SDRAM"))) uint32_t CCMBuf1[10]={4,5,6};
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2020-12-11 08:57:24 | 显示全部楼层
云琴箫龙 发表于 2020-12-10 23:24
例如: __attribute__((section (".SDRAM"))) uint32_t CCMBuf1[10]={4,5,6};

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

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2021-4-19 22:37:27 | 显示全部楼层
请教硬汉哥,最近发现同样的方法在H743上分散加载SDRAM会造成死机(SDRAM驱动是正常的),请问你是否遇到过这个问题?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 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?m ... 8697&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 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 ...

可以了,非常感谢
回复

使用道具 举报

38

主题

194

回帖

318

积分

高级会员

积分
318
发表于 2021-5-26 02:50:21 | 显示全部楼层

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

回复

使用道具 举报

38

主题

194

回帖

318

积分

高级会员

积分
318
发表于 2021-5-26 03:02:35 | 显示全部楼层
我还有个疑问,如果没有attribute的变量的话,是保存在IRAM1(RW+ZI)这里吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2021-5-26 08:16:01 | 显示全部楼层
会飞的猪_2020 发表于 2021-5-26 02:50
我想问一下加载域和执行域的地址是一样的吗?
做了BootLoader的话,APP程序的LR_IROM1 是从 0x804B000  ...

对,这个BootLoader是的。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2021-5-26 08:17:43 | 显示全部楼层
会飞的猪_2020 发表于 2021-5-26 03:02
我还有个疑问,如果没有attribute的变量的话,是保存在IRAM1(RW+ZI)这里吗?

对。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-6-18 10:08:10 | 显示全部楼层
辛苦了  学习下 多谢硬汉
回复

使用道具 举报

12

主题

141

回帖

177

积分

初级会员

积分
177
发表于 2023-4-18 14:19:55 | 显示全部楼层
硬汉,类似的IAR的工程能否也提供一个
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2023-4-18 14:32:11 | 显示全部楼层
gnail092 发表于 2023-4-18 14:19
硬汉,类似的IAR的工程能否也提供一个

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

使用道具 举报

8

主题

43

回帖

67

积分

初级会员

积分
67
发表于 2023-4-24 12:59:03 | 显示全部楼层
如果把 GUI 的读写缓存放到外部sram上,除了使用分散加载文件定义  sram地址与外部sram初始化,还需要做其他的类似读写外部sram的操作吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-26 07:21 , Processed in 0.377638 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表