如何在keil scatter文件中添加noinit部分?

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
5个帖子/ 0新
最后一篇
CGHA.
离线
最后一次露面:4个月3周前
加入:2016-03-23 13:05
如何在keil scatter文件中添加noinit部分?

我想在NoInit部分中存储键信息,以便在深度睡眠中重置时,我的债券信息不会丢失。

设备:
PM_DIALOG.
离线
最后一次露面:1天6小时前
职员
加入: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.
离线
最后一次露面:4个月3周前
加入:2016-03-23 13:05
你能告诉我改变我吗?

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

我在正常模式下使用延迟睡眠,当睡眠命令在ble上收到时,DA14580将陷入深沉的睡眠状态,另一个MCU将为DA14580提供RESET信号,在重启后,我需要保留键信息以重新连接到粘合的iOS设备。

CGHA.
离线
最后一次露面:4个月3周前
加入:2016-03-23 13:05
我注意到了我的数据

我注意到我要存储的数据位于在分散文件中标记为uninit的区域,例如,地图文件显示我的数据开始地址为0x00082448,数据长度为476字节,并分散文件列出此区域作为uninit“zi_ret20 0x00080768 uninit 0x22b8”,但似乎我的数据仍然丢失,即使当我设置DA14580以在重置之前延长睡眠时,也仍然丢失(因为我注意到该区域在Sysram区域中)。

PM_DIALOG.
离线
最后一次露面:1天6小时前
职员
加入:2018-02-08 11:03
嗨cgha,

嗨cgha,

请检查SystemInit()函数,并找到setBits16(PMU_CTRL_REG,RETENT_MODE,0xF);因此,由于您已经看到了归零器,因此已经看到了归零器的归零器,因此在沉睡的沉睡中升起时应该完成的东西,所以归零ram的归零器是应该完成的。除了用户数据,额外的BLE信息(BLE堆,堆栈等)。

重置后,归零功能将再次运行,并将消除保留存储区域中的任何数据。为了避免您可以做的是要知道您的“数据”驻留在保留存储区域和初始化期间,您应该避免将它们归零。没有参考设计或示例,演示了,我所做的是以下内容:

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

将从新的部分中使用的部分回序,从而从#define retram_len中删除您将使用的字节量并添加新部分的大小(新的Retram_len = Retram_len - sz_aft_rst_data):

§LR_Retention_ram00x00080768(Retram_len + Exchange_memory_size + sz_aft_rst_data){

在从0x00080768开始的lr_retention_ram0中声明一个执行区域。新的执行区域将从0x00080768开始,并且将具有您要求的范围(例如,例如,您想要的范围是SZ_AFT_RST_DATA 80字节)。所以散射文件会改变为:

§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 =(无符号int *)0x80000;for(i = 0xbff; i> = 0; i--){if((p_retmem>(unsigned int *)0x80768)&&(p_retmem <(unsigned int *)(0x80768 + 80)))*(易于unsigned *)p_retmem ++;else *(volatile unsigned *)p_retmem ++ = 0;}

谢谢,PM_DIALOG.