ajdd 发表于 2009-8-18 15:16:39

在WinAVR中,如何将数组变量指定在某个内存地址上?

我需要将一个很大的数组指定在RAM最后部分。当系统初始化时,初始栈位于此。当系统初始完成后,初始栈就不再使用了。
系统初始栈没有显式分配内存,也就是说这块内存是无主内存。如果我用一块数组占领它也是可能的。当然数组不能有初值。

我知道如何将flash变量或者子程序完全地定位于某一个flash地址,但我不知道如何将ram型变量定位于RAM中?

请问如何解决这个问题?

void_c 发表于 2009-8-18 15:24:27

如何将数组变量指定在某个内存地址上?
------------------------------------

用IAR,这个问题就不是问题。
GCC应该也行,没试过。

weuser 发表于 2009-8-18 16:26:36

#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
象操作端口一样,直接操作该RAM地址 存取数据。

ajdd 发表于 2009-8-18 16:43:34

#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
象操作端口一样,直接操作该RAM地址 存取数据。

这位兄弟没有明白我的意思。要操作内存很简单,直接给出一个unsigned int变量,强制类型转化成指针就可以用*来存取了。这个没有问题的。

我要解决的问题是这样子的:
系统里我有个自己管理的堆空间Heap(不是编译器提供的heap),这个heap我希望它的内存地址分配到RAM的最高地址部份。一般来说,main()函数的初始化栈是在RAM的最高地址处。初始化时,系统占用堆的高地址部分(这部分地址我在初始化时是用不到的)。当系统完成初始化后,初始化栈就不再使用,于是Heap成为完整的heap。为什么我要定位到最后部分呢,还有一个原因是,有些全局变量(特别当该全局变量有初值时)老是被分配到RAM高地址部分,与初始栈距离很近很危险。这样做呢,我的好处是:我不用考虑初始栈的大小,也不担心全局变量被初始栈覆盖。

ajdd 发表于 2009-8-18 16:46:20

我内存实在不够用,有操作系统FreeRTOS

ajdd 发表于 2009-8-18 16:48:20

static struct xRTOS_HEAP
{
        unsigned portLONG ulDummy;
        unsigned portCHAR ucHeap[ configTOTAL_HEAP_SIZE ];
} xHeap __attribute__((section("BUF")));

编译时,老是报overlap,不知道怎么回事?

ajdd 发表于 2009-8-18 16:49:37

要是能xHeap定位到芯片RAM的最高地址部分,我的问题就解决了

各位好人给我出出主意

wiav 发表于 2009-8-18 17:10:55

计算你的Heap的大小,修改gcc的链接脚本,将节BUF定位到高端内存。

ajdd 发表于 2009-8-19 12:56:55

我需要实质性的方法/技巧

huangshuyi 发表于 2013-5-9 16:46:05

请问如何在应用区中将256字节放在RAM中,在BOOT区中使用该256字节?
页: [1]
查看完整版本: 在WinAVR中,如何将数组变量指定在某个内存地址上?