[APM32F4]

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

[复制链接]
303|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:
修改前:
cf6e5d2151039cd75a09857eaea7d635
修改后:
710239131b2086594150311f10874a3b
我这里新增了一个 .ramfunc 的区域可供所有 .o 文件使用(即所有 .c 文件)。
2)之后再在 .c 文件中定义如下:#define __ramfunc __attribute__ ((section (".ramfunc")))
之后再将 __ramfunc 添加到需要在 RAM 中运行的函数实现前即可:
c1d82155f2c5eb8ba6990ae89198c078
这里我除了定义 __ramfunc 利用了 #if define 可以更方便的在不同编译器之间移植。
3)之后我们观察映射文件 .map 就可以发现此函数已经被分配在 RAM 中:
修改前:
9517f6b7786bcff5e0ad2cd3b66f15fc
修改后:
caa847330ef00eaf0a35cd3158676764
IAR
  在 IAR 中,我们只需要将 __ramfunc 加在需要在 RAM 中执行的函数即可,IAR 的编译器就会自动将此函数分配到 RAM 中:
修改前:
a66aa5d568c82b72f4c1c43d3032f912
修改后:
2ea891871e222d4a5c59449a457214d2
GCC
  这里我在 S32DS 中实现, S32DS 则使用的是 GCC 编译器。
1)在链接文件中添加 section:
e7529422fb176af370e19a9937985b22
(m_data 属于 SRAM 区域)
2)添加定义:
183c25fdc3f76b20a5b06993516094a7
3)在函数前添加 __ramfunc:
20950574bf0df16c5681f5bda39a31b0
4)查看最终映射文件:
9263102acda1f7aaae86393f1e3c95e3

使用特权

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

本版积分规则

2

主题

6

帖子

0

粉丝