【问题标题】:How can I access to external memory as heap如何以堆的形式访问外部内存
【发布时间】:2014-05-04 22:05:23
【问题描述】:

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

现在谁能提供一个小示例项目如何配置 uVision,使用外部 RAM 作为堆?我想将 uVision 配置为在内部 FLASH 中执行程序,使用内部和外部 RAM 用于 STACK 和 HEAP。

【问题讨论】:

    标签: memory-management embedded microcontroller keil


    【解决方案1】:

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

    然后在 Linker 设置选项卡中,取消选中“Use Memory Layout from Target Dialog”选项。这将允许您手动编辑分散文件,该文件最初将反映 Target 设置中定义的布局。

    编辑分散文件以在外部内存中创建一个部分,因此(例如):

      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)

    【讨论】:

    • @aria nikan :我已经简化了我的解决方案。您不再需要修改启动文件。
    猜你喜欢
    • 2019-03-29
    • 1970-01-01
    • 2022-01-07
    • 2022-08-04
    • 1970-01-01
    • 2011-01-02
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多