#技术资源# #申请原创# 要将程序映射到 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)查看最终映射文件:
|