如何在keil散射文件中添加NOINIT部分?

⚠️
你好。。谢谢你来参加论坛。令人兴奋的消息!我们现在正在移动到我们的新论坛平台,将提供更好的功能,并包含在主对话网站的过程。所有帖子和账号都已迁移。我们现在只接受新论坛上的流量-请在//www.wsdof.com/support. 我们将在未来几天内修复bug/优化搜索和标记。
5个职位/0个新职位
最后一篇文章
cgha
离线
最后一次见到:2周前5个月
已加入:2016-03-23 13:05
如何在keil散射文件中添加NOINIT部分?

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

设备:
PM\U对话框
离线
最后一次见到:1天15小时前
工作人员
已加入:2018-02-08 11:03
嗨,cgha,

嗨,cgha,

因为你是使用DA14580和假设SDK5.04,couple of SDK changes should be don win order to retain initialized data during reset. DA14585/6 and our newest SDK6 (latest version 6.0.10), has the capability if storing initialized data. Do you have any thought for moving into DA14585/6? There is a software example demonstrating this functionality.

软件示例:DA14585/586检测复位源

谢谢,下午好

cgha
离线
最后一次见到:2周前5个月
已加入:2016-03-23 13:05
你能告诉我我的变化吗

您能告诉我,我应该对sdk 5.0.4进行的更改,以便在重置后存储和获取值。在我的想法中,我应该对分散文件进行更改,在sdk 5.0.4中,为了在重置后保留值,我应该在sdk 5.0.4中修改其他任何地方?

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

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

我注意到要存储的数据位于散布文件中标记为Unnit的区域,例如,地图文件显示我的数据起始地址为0x00082448,数据长度为476字节,散布文件将此区域列为Unnit“ZI RET20 0x00080768 unnit 0x22b8”,但是,即使在重置前设置da14580以延长睡眠时间,重置后,我的数据似乎仍然丢失(因为我注意到这个区域在SysRAM区域)。

PM\U对话框
离线
最后一次见到:1天15小时前
工作人员
已加入:2018-02-08 11:03
嗨,cgha,

嗨,cgha,

请检查SystemInit()函数,您将发现挫折16(PMU CTRL\u REG,RETENTION_umode,0xF),因此,保留ram的所有位都设置为零,因为您已经看到保留内存区域的归零是在设备自保留区启动时所做的,而在深度睡眠中保持时,除了用户数据、额外的可布尔信息(BLE堆、堆栈等)。

重置后,调零功能将再次运行,并将擦除您在保留内存区域中的任何数据。为了避免这样做,您可以知道“数据”位于保留内存区域中的位置,并且在初始化期间,您应该避免将它们归零。没有参考设计或示例表明,我将要做的是:

In the scatterfile where the retention memory area is defined for deep sleep allocate a space that will hold your data that should be not initialized.

部分重传将从新的部分使用,因此从定义重传中删除您将使用的字节数并添加新节的大小(新的重传长度=重传长度–SZ\u AFT\u RST\u数据):

§ LR U保留\u RAM0 0x00080768(重传LEN+EXCHANGE\u内存\u大小+SZ\u AFT\u RST\u数据){

在LR炣RETENTIONRAM0中声明一个从0x00080768开始的执行区域。新的执行区域将从区域0x00080768开始,并具有您的需求范围(例如,您希望的范围为SZ\u AFT\u RST\u DATA 80 bytes)。因此,散射文件将更改为:

§ RET复位01 0x00080768 unnit SZ\u AFT\u RST\u DATA{.ANY(unitialized\u DATA\u test)}标记新区域。

完成此操作后,ZI炣RET00将从地址0x00080768+SZ_uaft\u RST_u数据开始,而不是从0x00080768开始。

因此现在您知道,将使用统一化的\u数据_u测试标记的数据将从地址0x00080768驻留到地址0x00080768+SZ\u AFT\u RST\u data。因为您知道可以转到SystemInit()函数,并指示函数不要将0x00080768和0x00080768+SZ\u AFT\u RST\u数据之间的内存归零。

//用零无符号int*p_uretmem=(无符号int*)0x80000填充0x80000-0x83000;对于(i=0xBFF;i>=0;i--){if((p_retmem>(无符号int*)0x80768)&(p\u retmem<(无符号int*)(0x80768+80))*(易失性无符号*)p\u retmem++;else*(volatile unsigned*)p\u retmem++=0;}

谢谢,下午好