单片机
返回首页

Keil MDK设置部分程序在RAM执行的方法:ramfunc

2025-03-10 来源:jianshu

前言

  • 嵌入式软件,如bootloader,空间受限,但有操作(编程)内部flash的需求,遇到的主要问题就是:

    • 内部的RAM不够大,flash 编程需要多次执行

    • bootloader需要更新自己,但程序执行的位置需要擦除重新编程

    • 部分MCU,程序在flash中执行,不支持边执行边擦写

  • 这就需要引入程序在RAM中执行的话题

ramfunc

  • 让程序加载到RAM中并在RAM中执行,即上电后程序(或一些函数),代码的执行位置位于RAM中。

  • 本质上,RAM掉电,数据会丢失。这个程序代码(Code)本身依旧是存放在Flash中,这样掉电保存,开机后自动加载(load)到RAM里,这样这个函数的【执行体】在RAM里,调用时,就在RAM中执行了

  • 如上面提到的bootloader自身的更新,升级代码在RAM中执行,可以实现自己更新自己,也就是通过Flash编程,允许擦除并更新程序存放Code的Flash区域。

设置方法

  • 这里使用Keil MDK,如果使用gcc,可能需要调整一下

  • 首先需要修改链接(link)的脚本:一般为  xxx.sct

  • 启用:Scatter file


    2022-03-27_101930.png

  • 选项:Linker

2022-03-27_102032.png

  • 默认的 链接脚本

2022-03-27_102101.png

  • 在RAM的段:注意开地址,如RAM的地址为:0x20000000开始,增加:
    *.o (.ramfunc),如下:

  RW_IRAM1 0x20000000 0x00018000  {  ; RW data
   .ANY (+RW +ZI)
   *.o (.ramfunc)
  }
  • 这样等于在RAM中有了一个内存段,段名为:.ramfunc,也就是为某些函数可以放在这个段下

2022-03-27_102140.png

  • 定义好了RAM段,没有使用

2022-03-27_102356.png

  • 这个内存段定义好,还需要把想要放在RAM中执行的函数,定义为:ramfunc,如下


#define RAMFUNC __attribute__ ((section ('.ramfunc')))

这样,RAMFUNC 前缀定义的函数,就会放在RAM中了

2022-03-27_102510.png

  • 默认在Flash中

2022-03-27_102834.png

  • 函数使用:ramfunc

2022-03-27_102958.png

  • 增加 RAMFUNC的声明

2022-03-27_103014.png

  • 函数在RAM中了


    2022-03-27_103131.png

小结

  • RAM有个初始化的过程,定义了:*.o (.ramfunc),上电初始化后,会加载这部分的代码到RAM中

  • 函数的执行体放在RAM中(RAM地址空间),执行就是在RAM中执行了

  • 像STM32这种芯片,程序可以直接在Flash中执行,也可以在RAM中执行


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 便携式混音器

  • 18W乙类音频放大器

  • 6晶体管H桥

  • USB LED调光器

  • USB自供电声卡

  • AVR LCD温度计—LM35

    相关电子头条文章