打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

先打开Keil工程配置,选择linker链接文件,取消自动生成,并编辑sct。

编辑
在这里插入图片描述
如上图,定义一个RAMFUNC区域,如果需要无初始化变量,则定义红框内容。

LR_IROM1 0x00000000 0x00017000  {    ; load region size_region
  ER_IROM1 0x00000000 0x00017000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x1FFFF000 0x00003F00  {  ; RW data
   .ANY (+RW +ZI)
   *.o (.ramfunc)
  }
  RW_IRAM2 0x20002F00 UNINIT 0x00000100  {
   .ANY (.uninit)
  }
}

  1. 示例芯片的RAM为0x4000 byte,这里拆分为两组,第一组[RW_IRAM1]复位清零,第二组[RW_IRAM1]复位保持。
  2. LR_IROM1定义Flash大小区域。如果是APP工程,则填写APP区域大小。

复位保持:仅非掉电复位有效,硬件复位还是无法保持。一般用于跳转boot传递信息,或者存储单次运行数据。

一、将函数定义到RAM运行

/******************************************************************
 * 函数名称:McuFlashDoCommand
 * 出口参数:0 指令操作失败,1 指令操作成功
 * 函数说明:启动FLASH指令 __attribute__((used, section("atcmd")))
 ******************************************************************/
uint8_t __attribute__((used, section(".ramfunc"))) McuFlashDoCommand(void) {
    uint8_t ret = 1;

    /* Clear CCIF to launch command */
    FTMRE->FSTAT = FTMRE_FSTAT_CCIF_MASK;

    while (!(FTMRE->FSTAT & FTMRE_FSTAT_CCIF_MASK));
    while ((FTMRE->FSTAT & FTMRE_FSTAT_MGBUSY_MASK));
    /* Check if an error is occurred */
    if (FTMRE->FSTAT & (FTMRE_FSTAT_FPVIOL_MASK | FTMRE_FSTAT_ACCERR_MASK))
        ret = 0;

    return ret;
}

二、定义无初始化变量(软复位,变量不清空)

注:uninit只有256byte(根据上述链接文件定义),如果定义的大小超出范围,整个uninit地址都会移动到普通RAM区域

boot_info_t g_boot_info __attribute__((used, section(".uninit")));

在这里插入图片描述

总结

在ROM区执行和RAM区执行的区别在于,前者是只有当代码需要的时候,Cache才会从flash中搬出来运行,而后者是在上电初始化的时候就已经全部搬过去了,所以在运行的时候函数已经在RAM中了,并且这段代码会一直占用这个RAM不会被释放,类似于一个全局变量。前者如果超出了Cache的大小,可能会被释放掉,等下次执行的时候需要重新搬。

posted on 2023-01-29 08:40  xuejianqiang  阅读(665)  评论(0编辑  收藏  举报  来源
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033