[讨论] 如何把数组定义在特定的RAM位置

辛昕   2011-10-22 09:27 楼主
手上做一个东西,涉及到需要掉电保护,片上能用后备电池掉电保护的区域在最开始的4K里。

由于一些数据是随时会更新的,我没有用 定时把数据往里头复制的方法,而是直接把变量存储在这个区域里。

小帅和技术支持教的方法都是 指针
int *p = (int *)0x001

为了配合我原先写好的程序,我又多加了一条定义宏
#define p (*p)

这样一来,单个变量的问题是解决了。

但是,当我要定义数组的时候,我就不知道该怎么弄了。
网上查了查,首先 定义数组的指针 应该是这样子的

int (*p)[13] = (int *)0x040
这是定义一个 含有13个int类型数组的指针——正符合我的要求,可接下来,该怎么把它和一个数组联系起来呢?
我就不知道怎么弄了。

希望各位知道的大侠说说。这个东西还挺急的,谢谢了!
强者为尊,弱者,死无葬身之地

回复评论 (5)

已经解决

有个人因为看过STM32的固件库,他提出了一个写法:
typedef struct
{
int g[4];
}xxx

然后再定义这个结构指针,再对其引用赋值,我试了,发现是可以的。

说起来,他想到这个,是因为他觉得指定RAM地址,就跟定义寄存器有点像,我想了想,其实我做过STM32,也见过类似的东西,但是没想起来,只是他提到的时候,我脑里有一点点闪过以前见过gpio->这样的东西。

后来我觉着这样不爽,因为结构体浪费空间。
我又怎么都不理解为什么我那样定义数组不行,后来我发现我问题出在我引用出了错。
先前我是这么理解的,定义了这个数组指针后,我引用它的时候,因为本来就是一个地址,我当然不需要用*,,其实是要的。
于是我就改写成
int (*pcan)[12] = (int (*)[12])0x050;
#define canteen(x) (*pcan[x])

就好了。

很可惜的是,当我想 得寸进尺,用 数组的中括号代替小括号时,发现不行。
于是也就只好这样咯。
至此,这个问题解决了~~
强者为尊,弱者,死无葬身之地
点赞  2011-10-22 14:27
让我结了它。

其实很简单。

鉴于C语言的结构体内部成员在内存里是按照顺序排列的。
故而,最好的方法是,把所有内容都定义在结构体里,最后把这些结构体做为一个总的结构体的子结构体成员 组合在一起,再把这个总的结构体定义在 地址为特定起始位置的地方,就可以直接实现,所有数据变量按顺序排列。
至于数组,在结构体里定义一个数组,再通过成员引用即可,非常容易。
强者为尊,弱者,死无葬身之地
点赞  2012-10-5 00:58
定位变量到指定的位置
使用定义在头文件 absacc.h中的 __at 宏,可以将变量以如下方式定位到绝对地址处:

C 例子:
#include   

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_|组成来定义位置。下面的例子是将一个段定义到地址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.
点赞  2012-10-7 10:26
学习啦!
点赞  2014-3-19 17:25
在C文件中定义数据结构,然后在分散加载脚本中指定数据的地址就行了么。
或者在汇编启动文件中定义个特别的段,然后分散加载脚本给出特定地址也行。
点赞  2014-4-9 10:32
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复