打印
[APM32F4]

通过编译器将部分程序影射到 RAM 区执行

[复制链接]
450|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
war360xy|  楼主 | 2022-12-22 10:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#技术资源# #申请原创# 要将程序映射到 RAM 区执行,而非 ROM 区,主要是修改程序在存储中的存放地址,最终呈现出来的效果就是被指定的程序在映射文件(如.map)中 RAM 区域而非 ROM 区。一般方法就是修改在链接文件的 RAM 区新建一个 section 然后再利用 __attribute__ ((section (".xxxx"))) 将指定函数映射到该 section。
下面演示一下在三种不同编译器里面实现部分函数在 RAM 执行的简单方法。
一、keil 1) keil 自带的是 armcc 编译器,首先需要我们修改其工程下的分散加载文件(后缀名为 .sct),在其中添加一个在 ram 中的 section:
修改前:

修改后:

我这里新增了一个 .ramfunc 的区域可供所有 .o 文件使用(即所有 .c 文件)。
2)之后再在 .c 文件中定义如下:#define __ramfunc __attribute__ ((section (".ramfunc")))
之后再将 __ramfunc 添加到需要在 RAM 中运行的函数实现前即可:

这里我除了定义 __ramfunc 利用了 #if define 可以更方便的在不同编译器之间移植。
3)之后我们观察映射文件 .map 就可以发现此函数已经被分配在 RAM 中:
修改前:

修改后:

IAR
  在 IAR 中,我们只需要将 __ramfunc 加在需要在 RAM 中执行的函数即可,IAR 的编译器就会自动将此函数分配到 RAM 中:
修改前:

修改后:

GCC
  这里我在 S32DS 中实现, S32DS 则使用的是 GCC 编译器。
1)在链接文件中添加 section:

(m_data 属于 SRAM 区域)
2)添加定义:

3)在函数前添加 __ramfunc:

4)查看最终映射文件:


使用特权

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

本版积分规则

2

主题

6

帖子

0

粉丝