打印
[ZLG-ARM]

周工例程中分散加载文件中堆栈的疑惑

[复制链接]
2277|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
smallbear|  楼主 | 2007-10-4 09:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST, ni, AC, ck, RAM
各位高人,我又来讨教了,在周工的功能器件编程实例中,VICVet_c中,使用了mem_b的加载文件,如下:
ROM_LOAD 0x80000000
{
    ROM_EXEC 0x80000000
    {
        Startup.o (vectors, +First)
        * (+RO)
    }

    IRAM 0x40000000
    {
        Startup.o (+RW,+ZI)
    }

    STACKS 0x40004000 UNINIT    //这个位置是栈的顶部
    {
        stack.o (+ZI)
    }

    ERAM 0x80040000
    {
        * (+RW,+ZI)
    }

    HEAP +0 UNINIT          //这是堆的顶部?
    {
        heap.o (+ZI)
    }
}

这里面,把堆的顶端分配到了ERAM 0x80040000,将栈的底STACKS 0x40004000处,而在周工所给的历程中,使用的是单区域模式,也即使说没有声明
#pragma import(__use_two_region_memory),这样便是堆和栈同时使用一块连续的内存地址,在使用的时候,堆向上增长,栈向下增长,于是问题产生了,在分散加载函数中,堆和栈的bottom地址被分配到了两个不同的存储器中,当然地址也就不连续,请问这样可以吗

相关帖子

沙发
smallbear|  楼主 | 2007-10-4 12:27 | 只看该作者

各位帮忙啊

自己顶一下,希望在有答案之前别沉了

使用特权

评论回复
板凳
smallbear|  楼主 | 2007-10-5 14:17 | 只看该作者

继续顶

自己顶,要保证在有答案之前别沉了

使用特权

评论回复
地板
lammy| | 2007-10-5 16:48 | 只看该作者

这个问题还不错,楼主心细,顶下

堆是程序员用来分配和释放的,栈是编译器自动分配释放的。在这个分散加载文件中,堆和栈的bottom地址被分配到了两个不同的区域,不是不同的存储器。

你说的地址不连续,是什么不连续?你如果认为这样不行,那把你的观点说出来哈。


其实这个加载文件的堆栈我是这样分析的,因为如果作为程序员在写程序时如果没有用到分配内存的函数[我个人认为要用到堆在C中只有分配内存的函数要用到],那么在程序中你就不会用到堆,只会用到栈。

使用特权

评论回复
5
smallbear|  楼主 | 2007-10-5 17:44 | 只看该作者

我说说自己的分析

在这个加载中,首先堆的bottom被设置到了地址为 0x80000000开始的存储器,也就是外部存储器,而栈的bottom被设置到了片内的内存(0x40000000开始存储器在lpc2210中为片内内存),所以我说两个不连续;
的确,我也认为在这个程序中只用到了栈,而没有用到堆。

使用特权

评论回复
6
lammy| | 2007-10-5 20:15 | 只看该作者

继续顶起

我认为周立功把堆放在外部的RAM是有一定的道理的,如果放在内部的RAM的话,那么它可能担心会有数据冲突,而且堆这个东西作为初学者很少用[我想你用的是周立功的开发板吧];你试着改下,把堆映射到内部的SRAM试试,我的Easyarm2200卖了,我没法试。我想在一块也是可以的,只要你没有数据冲突。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

20

帖子

0

粉丝