Ping
机器复位重启后,需要记录部分数据在开机后进行恢复,或者保存部分日志信息用于分析异常复位原因,对于该需求有两种方式可以实现:
1. 复位前把相关数据写入Flash保存,例如NVDS区域;
2. 复位前把数据保存在特定的RAM区域,该部分RAM区域数据不受复位影响;
PS: GR551X不支持通过寄存器查询复位原因。
配置复位不清零RAM区域方法如下(基于1.6.10版本SDK):
1. 在custom_config.h中增加以下宏定义代码
2. 在toolchain\gr551x\source\arm\flash_scatter_common.sct文件中定义复位不清零区域RAM空间
UNUSED_RAM_SECTION AlignExpr(+0, 32) EMPTY UNUSED_SECTION_SIZE {
修改为:
UNUSED_RAM_SECTION AlignExpr(RST_KEEP_RAM_START_ADDR, ALIGN_WORD) EMPTY RST_KEEP_RAM_SIZE {
.ANY(NO_INIT)
3. 代码使用示例如下:
static uint32_t ram_test_data __attribute__( (
section( "NoInit"),zero_init));
void ram_test(void)
{
ram_test_data ++;
APP_LOG_INFO("ram_test_data:%x",ram_test_data);
if(!(ram_test_data%3))
{
sys_delay_ms(800);
hal_nvic_system_reset();
}
}
备注:1.6.12之后的版本,SDK已默认支持复位不清零的RAM空间分配及使用:
1. flash_scatter_config.h定义RAM空间大小
#define RAM_RESERVE_SECTION_SIZE 0x64
2. flash_scatter_common.sct文件定义名称修改如下:
RAM_RESERVE AlignExpr(+0, 32) UNINIT RAM_RESERVE_SECTION_SIZE {
.ANY(RAM_RESERVE)
}
2. gr55xx.h文件定义如下:
#ifndef RESERVE_RAM_SECTION#if defined ( __CC_ARM )#define RESERVE_RAM_SECTION __attribute__((section("RAM_RESERVE"),zero_init)) /**< To prevent doxygen from misidentifying the function name */#endif#endif
Ping
打开微信,使用“扫一扫”即可关注