野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19744|回复: 1

STM32如何把一个变量定义在外部SRAM中

[复制链接]
发表于 2014-6-8 14:55:26 | 显示全部楼层 |阅读模式
以前学C51的时候,可以使用xdata关键字将一个变量定义在扩展的内存中(如STC外扩的1024字节的SRAM)中,这样很方便,之前学外部SRAM那一块,都是用指针来读写外部扩展的SRAM,能不能也像C51一样使用什么关键字可以把变量定义在外部的SRAM中呢?
回复

使用道具 举报

发表于 2014-6-8 15:19:39 | 显示全部楼层

看看这个博文
http://blog.csdn.net/zyboy2000/article/details/6752170

定位变量到指定的位置

使用定义在头文件 absacc.h中的 __at宏,可以将变量以如下方式定位到绝对地址处:
C 例子: #include <absacc.h>  

const char MyText[] __at (0x1F00) = "TEXT AT ADDRESS 0x1F00";

int x __at (0x40003000);                         // variable at address 0x40003000

unsigned char xArray[128] __at (0x68000000);     // Array start at address 0x68000000
汇编例子:  
在汇编文件中可以使用段名,由|.ARM.__AT_<addr>|组成来定义位置。下面的例子是将一个段定义到地址0xFFE0处:
     AREA |.ARM.__AT_0xFFE0|, CODE, READONLY


u8 a[10] __attribute__ ((at(0x2000002c)));
编译说
..\List\ALL.axf: Error: L6971E: Section .data from object usart.o with type RW incompatible with
Section .ARM.__AT_0x2000002C from object hal.o with type ZI in er RW_IRAM1.

似乎是定位了这个绝对地址后,其他变量不会为它让位~


NONO,这个方法不行的,因为编译器并没有真正开辟一个变量,你仅仅是强行操作某个地址而已,但这个地址是否被其他数据利用了,你管不到也不知道~(0字)电子白菜[8次]2009-9-5 2:08:47


编译器里面应该有设置,比如系统总共有多少内存,你可以故意设置的少一些,这样在编译的时候他就会避开你没有指定的了

回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 06:46 , Processed in 0.027769 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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