OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3090|回复: 18

SRAM

[复制链接]

20

主题

86

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1107
金钱
1107
注册时间
2017-10-6
在线时间
173 小时
发表于 2018-9-12 21:22:33 | 显示全部楼层 |阅读模式
1金钱
u32 testsram[250000] __attribute__((at(0X68000000)));//测试用数组

今天学了SRAM ,请问这句话是定义数组在内部的位置,然后通过fsmc将此位置写入到片外SRAM,还是直接就把变量定义到片外SRAM了?         

最佳答案

查看完整内容[请看2#楼]

这是指定数组首地址在0X6000 0000,即把这个数组定义到外部SRAM,你往数组里面写数据,就是写到外部SRAM.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-9-12 21:22:34 | 显示全部楼层
这是指定数组首地址在0X6000 0000,即把这个数组定义到外部SRAM,你往数组里面写数据,就是写到外部SRAM.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-9-12 23:40:42 | 显示全部楼层
个人理解:直接定义到外部sram
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-9-13 08:37:34 | 显示全部楼层
定义到外部SRAM,同时在片内会有一个指针变量(编译器自动处理、定义的)指向这个连续内存区域的首地址
十六进制带我飞。
回复

使用道具 举报

20

主题

86

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1107
金钱
1107
注册时间
2017-10-6
在线时间
173 小时
 楼主| 发表于 2018-9-14 20:46:02 | 显示全部楼层
DreamWaterPro 发表于 2018-9-13 08:37
定义到外部SRAM,同时在片内会有一个指针变量(编译器自动处理、定义的)指向这个连续内存区域的首地址

我想在不明白,定义这个变量,内存是32内部SRAM给分配的?还是外部SRAM给分配的?
回复

使用道具 举报

20

主题

86

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1107
金钱
1107
注册时间
2017-10-6
在线时间
173 小时
 楼主| 发表于 2018-9-14 20:46:31 | 显示全部楼层
peng1554 发表于 2018-9-12 23:40
个人理解:直接定义到外部sram

内存是外部SRAM给分配的吗?
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-14 20:58:33 | 显示全部楼层
是内部。。。。
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-9-15 08:16:09 | 显示全部楼层
32初学者 发表于 2018-9-14 20:46
内存是外部SRAM给分配的吗?

内存的分配,严格来说是那块内存的标记,是编译器进行的,这块内存地址区实际上对应的是在外部SRAM中。
十六进制带我飞。
回复

使用道具 举报

20

主题

86

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1107
金钱
1107
注册时间
2017-10-6
在线时间
173 小时
 楼主| 发表于 2018-9-16 12:42:13 | 显示全部楼层
正点原子 发表于 2018-9-12 21:22
这是指定数组首地址在0X6000 0000,即把这个数组定义到外部SRAM,你往数组里面写数据,就是写到外部SRAM.

噢噢,__attribute__用这个定义,就是告诉编译器,把数据写到外部SRAM中
回复

使用道具 举报

20

主题

86

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1107
金钱
1107
注册时间
2017-10-6
在线时间
173 小时
 楼主| 发表于 2018-9-16 12:44:50 | 显示全部楼层
DreamWaterPro 发表于 2018-9-15 08:16
内存的分配,严格来说是那块内存的标记,是编译器进行的,这块内存地址区实际上对应的是在外部SRAM中。

明白,谢谢,相当于告诉编译器把数据写到外部SRAM
回复

使用道具 举报

20

主题

86

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1107
金钱
1107
注册时间
2017-10-6
在线时间
173 小时
 楼主| 发表于 2018-9-16 13:59:01 | 显示全部楼层
DreamWaterPro 发表于 2018-9-13 08:37
定义到外部SRAM,同时在片内会有一个指针变量(编译器自动处理、定义的)指向这个连续内存区域的首地址

请问大神,这个定义然后通过编译器自动写入数据到外部SRAM和通过fsmc写入到外部SRAM有什么不一样吗?
回复

使用道具 举报

20

主题

86

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1107
金钱
1107
注册时间
2017-10-6
在线时间
173 小时
 楼主| 发表于 2018-9-16 14:00:02 | 显示全部楼层
正点原子 发表于 2018-9-12 21:22
这是指定数组首地址在0X6000 0000,即把这个数组定义到外部SRAM,你往数组里面写数据,就是写到外部SRAM.

请问原子哥,这个定义然后通过编译器自动写入数据到外部SRAM和通过fsmc写入到外部SRAM有什么不一样吗?
回复

使用道具 举报

20

主题

86

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1107
金钱
1107
注册时间
2017-10-6
在线时间
173 小时
 楼主| 发表于 2018-9-16 14:02:24 | 显示全部楼层
peng1554 发表于 2018-9-12 23:40
个人理解:直接定义到外部sram

请问大神,这个定义然后通过编译器自动写入数据到外部SRAM和通过fsmc写入到外部SRAM有什么不一样吗?
回复

使用道具 举报

20

主题

86

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1107
金钱
1107
注册时间
2017-10-6
在线时间
173 小时
 楼主| 发表于 2018-9-16 14:03:06 | 显示全部楼层

请问大神,这个定义然后通过编译器自动写入数据到外部SRAM和通过fsmc写入到外部SRAM有什么不一样吗?
回复

使用道具 举报

20

主题

86

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1107
金钱
1107
注册时间
2017-10-6
在线时间
173 小时
 楼主| 发表于 2018-9-16 14:18:54 | 显示全部楼层

u32 testsram[250000] __attribute__((at(0X68000000)));//测试用数组
void main()
{
for(ts=0;ts<250000;ts++)testsram[ts]=ts;//预存测试数据
}         
我在代码里面看到这个,这样前面定义数组,后面往数组里写入数据后,可以直接缓存到外部SRAM中吗?这个过程也没用看到FSMC的地址与数据线作用啊,请问这样写到外部SRAM与通过FSMC写到外部SRAM有何不同吗?
回复

使用道具 举报

20

主题

86

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1107
金钱
1107
注册时间
2017-10-6
在线时间
173 小时
 楼主| 发表于 2018-9-16 15:21:13 | 显示全部楼层
32初学者 发表于 2018-9-16 14:18
u32 testsram[250000] __attribute__((at(0X68000000)));//测试用数组
void main()
{

还有测试的数据与数组预存的数据不会起到冲突吗?
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10915
金钱
10915
注册时间
2014-6-12
在线时间
1041 小时
发表于 2018-9-16 16:11:03 | 显示全部楼层
32初学者 发表于 2018-9-16 14:18
u32 testsram[250000] __attribute__((at(0X68000000)));//测试用数组
void main()
{

这些定义与程序都是软件,最后由编译器变成硬件指令序列(机器码序列),由硬件系统执行,你没有看到FSMC的地址与数据线作用已经由编译器放在硬件指令序列(机器码序列)里了。
回复

使用道具 举报

20

主题

86

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1107
金钱
1107
注册时间
2017-10-6
在线时间
173 小时
 楼主| 发表于 2018-9-16 16:34:23 | 显示全部楼层
xuyaqi 发表于 2018-9-16 16:11
这些定义与程序都是软件,最后由编译器变成硬件指令序列(机器码序列),由硬件系统执行,你没有看到FSMC ...

噢噢,明白了,其实fsmc与编译器直接关系,是fsmc寄存器配置完成的,只不过用了库函数没有深入看到底层的调用关系
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-9-17 08:43:55 | 显示全部楼层
32初学者 发表于 2018-9-16 14:02
请问大神,这个定义然后通过编译器自动写入数据到外部SRAM和通过fsmc写入到外部SRAM有什么不一样吗?

没有不一样,编译器所编译的程序只是告诉单片机需要通过FSMC来对外部的某个地址单元进行读取或者是写入操作,编译器是标记着个区域在外部SRAM中。不是说编译器去写外部SRAM。
十六进制带我飞。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 05:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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