Memory management 如何以堆的形式访问外部内存

Memory management 如何以堆的形式访问外部内存,memory-management,embedded,microcontroller,keil,Memory Management,Embedded,Microcontroller,Keil,我正在使用Keil MDK-ARM编译器进行嵌入式项目。我尝试以堆的形式访问外部内存,但当我在micro(micro是一个lpc1788)中下载程序时,下载完成后,它在startup.c文件中崩溃(没有启动主函数),尽管我可以访问外部内存(在增加堆部分之前) 现在,有谁能提供一个小样本项目,如何配置uVision,使用外部RAM作为堆?我想使用堆栈和堆的内部和外部RAM在内部闪存中为程序执行配置uVision。首先在“项目目标设置”对话框中指定RAM1(例如)的外部RAM范围,并确保所有其他设置

我正在使用Keil MDK-ARM编译器进行嵌入式项目。我尝试以堆的形式访问外部内存,但当我在micro(micro是一个
lpc1788
)中下载程序时,下载完成后,它在startup.c文件中崩溃(没有启动主函数),尽管我可以访问外部内存(在增加堆部分之前)


现在,有谁能提供一个小样本项目,如何配置uVision,使用外部RAM作为堆?我想使用堆栈和堆的内部和外部RAM在内部闪存中为程序执行配置uVision。

首先在“项目目标设置”对话框中指定RAM1(例如)的外部RAM范围,并确保所有其他设置适合您的项目

然后在链接器设置选项卡中,取消选中“从目标对话框使用内存布局”选项。这将允许您手动编辑散布文件,该文件最初将反映在目标设置中定义的布局

编辑散布文件以在外部ram中创建一个部分,例如:

您的实际地址可能会有所不同。如果要将所有外部RAM用于足够的堆,如果要允许链接器在此空间中放置其他数据,则:

  RW_RAM1 0x60000000 UNINIT 0x00040000  {  ; RW data
    *(HEAP)  ; external SRAM
    .ANY (+RW +ZI)
  }
检查堆部分的映射文件,以验证空间是否按要求分配

如果需要,也可以类似地重新定位堆栈。但是请注意,外部内存访问可能比内部内存访问慢,因此这样做可能会影响性能


所有这些当然都假设您已正确初始化外部RAM控制器以匹配外部RAM设备-这应该在system_lpc1788.c(或启动代码的类似命名文件-我的经验是使用STM32,所以我不知道,可能是system_lpc17xx.c)中完成。

@aria nikan:我简化了我的解决方案。您不再需要修改启动文件。
  RW_RAM1 0x60000000 UNINIT 0x00040000  {  ; RW data
    *(HEAP)  ; external SRAM
    .ANY (+RW +ZI)
  }