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

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

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

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

你好,cgha,

由于您使用的是DA14580,并且我假设是SDK5.04,所以应该对SDK进行一些更改,以便在重置期间保留初始化的数据。DA14585/6和我们最新的SDK6(最新版本6.0.10),具有存储初始化数据的能力。你有没有想过搬进DA14585/6?有一个软件示例演示了此功能。

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

谢谢,下午好

cgha公司
离线
最后一次见到:5个月3周前
已加入:2016-03-23 13:05
你能告诉我我做了什么改变吗

你能告诉我应该对sdk5.0.4做些什么更改来存储和获取重置后的值吗。在我的想法中,我应该对散点文件进行更改,在sdk5.0.4中,为了在重置后保留值,我应该修改其他地方吗?

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

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

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

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

你好,cgha,

请检查SystemInit()函数,您会发现SetBits16(PMU\u CTRL\u REG,RETENTION\u MODE,0xF),因此,保留ram的所有位都被设置为零,正如您已经看到的一样,当设备启动时,应该对保留内存区域进行清零,因为在深度睡眠时,保留区域除了保存用户数据外,还保存其他BLE信息(BLE堆、堆栈等)。

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

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

部分RETRAM_LEN将从新节中使用,因此请从#define RETRAM_LEN中删除要使用的字节数,并添加新节的大小(新RETRAM_LEN=RETRAM_LEN–SZ_AFT_RST_DATA):

§ LR\u RETENTION\u RAM0 0x00080768(重传长度+交换内存大小+SZ\u AFT\u RST\u数据){

在LR\u RETENTION\u RAM0中声明一个从0x00080768开始的执行区域。新的执行区域将从区域0x00080768开始,并且将具有您需求的范围(例如,假设您想要的范围是SZ\u AFT\u RST\u DATA 80字节)。因此散点文件将更改为:

§ RET\u RESET01 0x00080768 uniit SZ\u AFT\u RST\u DATA{.ANY(unitialized\u DATA\u test)}<-标记新区域。

执行此操作后,ZI\u RET00将从地址0x00080768+SZ\u AFT\u RST\u DATA开始,而不是从0x00080768开始。

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

//在0x80000-0x83000中填充零unsigned int*p_retmem=(unsigned int*)0x80000;对于(i=0xBFF;i>=0;i--){如果((p_retmem>(unsigned int*)0x80768)&((p_retmem<(unsigned int*)(0x80768+80)))*(volatile unsigned*)p_retmem++;else*(volatile unsigned*)p_retmem++=0;}

谢谢,下午好