如何以堆的形式访问外部存储器

时间:2014-03-26 13:10:38

标签: memory-management embedded microcontroller keil

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

现在任何人都可以提供一个小样本项目如何配置uVision,使用外部RAM作为堆?我想使用内部和外部RAM为STACK和HEAP配置uVision以在内部FLASH中执行程序。

1 个答案:

答案 0 :(得分:3)

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

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

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

  RW_RAM1 0x60000000 UNINIT 0x00040000  {  ; RW data
    *(HEAP)  ; external SRAM
  }

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

  RW_RAM1 0x60000000 UNINIT 0x00040000  {  ; RW data
    *(HEAP)  ; external SRAM
    .ANY (+RW +ZI)
  }

检查地图文件中的 HEAP 部分,以验证是否已按要求分配空间。

如有必要,您可以类似地重新定位堆栈。但请注意,外部存储器访问速度可能比内部速度慢,因此这样做可能会影响性能。

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