转自 | 瑞萨嵌入式小百科

做低功耗产品要考虑对功耗有影响的各种因素,RAM保持待机前状态就是其中一项。

在嵌入式低功耗设计中,Standby RAM(待机保持内存)是芯片在深度休眠模式下仍能保持数据的关键硬件资源。但许多开发者苦于不同开发环境的配置差异,难以高效利用这一特性。


本文将以e2studio(瑞萨)、KEIL MDK(ARM)和IAR EW(IAR Embedded Workbench)三大主流开发环境为例,手把手教你在瑞萨RA6M4平台上实现“将变量精准分配至Standby RAM”的终极目标。对于其他内置Standby RAM的瑞萨RA系列MCU产品,均可参考本文的配置过程,并参考硬件手册做适当修改。本例中,Standby RAM的起始地址为0x28000000,大小为0x400。




01

e2studio工程中

(1)在fsp.ld文件中添加以下内容,定义Standby RAM这部分区域:




(2)hal_entry.c中在R_BSP_WarmStart中添加以下内容,允许使用Standby RAM并进行初始化。




(3)代码编辑、编译&调试,并打开Memory窗口进行验证。


需要放置到Standby RAM区域的数据需要做特定的声明。例如:


uint8_t g_standby_ram_variable[512] BSP_PLACE_IN_SECTION(“.standby_ram”) = {0,1,2,3,4,5,6,7,8,9,10};


从下图中可以看到数组g_standby_ram_variable[512]的数据已经放在Standby RAM区域中。







02

KEIL MDK工程中

(1)打开KEIL MDK工程,点击Option for Target





Target标签页➡Read/Write Memory Areas,定义一块区域




点击Linker标签页,取消链接勾选,自定义链接脚本,点击2处编辑




定义一片区域




(2)定义变量


uint8_t var00[10] __attribute__((section("SAMPLE_NAME_A")));


(3)代码中添加对这个变量的写入




(4)编译&调试,进行验证


从Memory窗口,可以看到放置在Standby RAM区域的变量被正常写入




03

IAR EW工程中

(1)修改链接器配置文件(.icf)


在项目的链接器配置文件中定义Standby RAM区域和段:


define region STANDBY_RAM = mem:[from 0x28000000 to 0x280003FF];

define block STANDBY_BLOCK { section .standby_ram };

place in STANDBY_RAM { block STANDBY_BLOCK };

do not initialize { section .standby_ram};


(2)在代码中声明变量


使用__no_init关键字和#pragma location指令将变量分配到指定段:


#pragma location = ".standby_ram"

__no_init uint8_t g_standby_ram_variable[512];


(3)在用户代码中手动初始化,并赋值



(4)编译&调试,进行验证


从Memory窗口,确认变量地址和数值。


通过上述步骤,我们实现了三大开发环境下的Standby RAM变量配置。无论你使用e2studio、KEIL MDK还是IAR EW,核心逻辑始终一致:

  • 编译器层:通过链接脚本隔离内存区域

  • 代码层:结合复位类型检测实现按需初始化


------------ END ------------


RTOS任务调度器的三种调度算法和应用



图片

嵌入式项目如何组建开发小组?


图片

嵌入式功能安全之开发工具、认证和安全技术