如何添加在keil分散文件的NOINIT节?

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
5个职位/ 0个新
最后发表
cgha
离线
最后看到:5个月2周之前
加入:2016-03-23 13:05
如何添加在keil分散文件的NOINIT节?

我想把债券信息存储在NOINIT部分,这样当被深度睡眠重置时,我的债券信息不会丢失。

设备:
PM_Dialog
离线
最后看到:21小时1分钟前
工作人员
加入:2018-02-08 11:03
嗨cgha,

嗨cgha,

因为你使用的是DA14580,我假设是SDK5.04, SDK的一些变化应该是不赢的,以便在重置期间保留初始化数据。DA14585/6和我们最新的SDK6(最新版本6.0.10),有存储初始化数据的能力。你有没有想过搬进DA14585/6?有一个软件示例演示了这种功能。

SW举例:DA14585/586检测复位源

谢谢,PM_Dialog

cgha
离线
最后看到:5个月2周之前
加入:2016-03-23 13:05
你能告诉我更改的地方吗

你能告诉我重置后,我应该对sdk 5.0.4进行哪些更改来存储和获取值吗?在我的想法中,我应该改变散点文件,任何其他地方我应该修改sdk 5.0.4,以保留重置后的值?

我在正常模式下使用延长睡眠,当ble上接收到sleep命令时,da14580就会进入深度睡眠,另一个mcu在需要重启时给da14580一个复位信号,重启后,我需要保留绑定信息以连接回绑定ios设备。

cgha
离线
最后看到:5个月2周之前
加入:2016-03-23 13:05
我注意到我的数据是

我注意到我的数据存储位于区域被标记为uninit分散的文件,例如,映射文件显示我的数据起始地址是0 x00082448,和数据长度是476字节,和散射文件列表这个区域uninit“ZI_RET20 0 x00080768 uninit 0 x22b8”,但似乎我的数据仍然丢失重置后,即使当我设置da14580延长睡眠前重置(因为我注意到这个区域是在SysRAM区域)。

PM_Dialog
离线
最后看到:21小时1分钟前
工作人员
加入:2018-02-08 11:03
嗨cgha,

嗨cgha,

请检查SystemInit()函数,你会发现SetBits16(PMU_CTRL_REG, RETENTION_MODE, 0xF);,因此所有保留内存的位设置为0,您已经看到了归零的保留内存区域是应该在设备启动时自保留区域在深度睡眠,除了用户数据,额外的祝福信息(BLE堆、栈等)。

重置后,将再次运行归零功能,并将清除保留内存区域中的任何数据。为了避免这种情况,你可以做的就是知道你的“数据”在存储区中的位置,在初始化期间,你应该避免将它们归零。没有任何参考设计或例子可以证明这一点,我想做的是:

在scatterfile中,为深度睡眠定义了保留内存区域,分配一个空间来保存不应该初始化的数据。

部分RETRAM_LEN将从你的新区段中使用,所以从#define RETRAM_LEN中删除你将使用的字节数,并添加新区段的大小(new RETRAM_LEN = RETRAM_LEN - SZ_AFT_RST_DATA):

§LR_RETENTION_RAM0 0x00080768 (RETRAM_LEN + EXCHANGE_MEMORY_SIZE + SZ_AFT_RST_DATA) {

在LR_RETENTION_RAM0中声明一个从0x00080768开始的执行区域。新的执行区域将从区域0x00080768开始,并具有您的需求范围(例如,您希望的范围将是SZ_AFT_RST_DATA 80字节)。所以scatterfile会变成:

§RET_RESET01 0x00080768 UNINIT SZ_AFT_RST_DATA {. any (unitialized_data_test)} <-标记新区域。

在此之后,ZI_RET00将从地址0x00080768 + SZ_AFT_RST_DATA开始,而不是从0x00080768开始。

因此,现在您知道,将使用unitialized_data_test标记的数据将驻留在地址0x00080768到地址0x00080768 + SZ_AFT_RST_DATA之间。因为您知道,您可以转到SystemInit()函数,并指示该函数不要将0x00080768和0x00080768+SZ_AFT_RST_DATA之间的内存归零。

//用零填充0x80000 - 0x83000 unsigned int *p_retmem = (unsigned int *)0x80000;for (i = 0xBFF;我> = 0;I——){if((p_retmem > (unsigned int *)0x80768) && (p_retmem < (unsigned int *)(0x80768 + 80)) *(volatile unsigned *)p_retmem++;Else (volatile unsigned *)p_retmem++ = 0;}

谢谢,PM_Dialog