持续跨重启的错误数据

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
4个帖子/ 0新
最后发表
Pvmellor.
离线
最后一次露面:一年九个月前
加入:2017-04-27 20:30
持续跨重启的错误数据

如果触发看门狗并调用NMI处理程序,则在平台代码中收集一系列错误参数。但是,此时我们还不能在现场部署的产品中附加调试器,因此无法获得错误信息。亚博电竞菠菜

我们想拍摄错误信息并将其存储在某个地方;然后重启;然后再次访问错误数据,以便可以在消息中发送到我们的主机(我们不觉得我们仍然可以在NMI处理程序本身可靠地发送消息)。

是否有办法在重新启动时保存错误数据,以便稍后在消息中使用?电源将被保留,但RST引脚将被切换,系统将通过SPI重新启动。

谢谢。

设备:
PM_DIALOG.
离线
最后一次露面:2天9小时前
工作人员
加入:2018-02-08 11:03
嗨pvmellor,

嗨pvmellor,

坦率地说,我无法理解如何从应用程序中收集错误信息,但您可以将它们存储在SPI Flash中。所以,在设备重新启动后,你可以再读一遍。另一种可能的解决方案是将错误信息存储在保留ram中,因为功率将被保留。一般情况下,设备复位后,保留RAM中存储的数据会丢失。请检查SystemInit()函数,你会发现SetBits16(PMU_CTRL_REG, RETENTION_MODE, 0xF);,因此所有的位保留内存将所以的零位调整保留内存区域是应该在设备启动时自保留区域在深度睡眠,除了用户数据,额外的祝福信息(BLE堆、栈等)。重置后,归零功能将再次运行,并将清除任何数据,你在保留记忆区域。为了避免这种情况,你可以做的是知道你的“数据”驻留在保留内存区域的什么地方,并且在初始化期间你应该避免将它们归零。你可以按照下面的步骤来做:

在SIMPTIONFILE中定义为深度睡眠的保留存储区域分配一个容纳应不初始化的空间。

  • 部分的RETRAM_LEN将在你的新section中使用,所以从#define RETRAM_LEN中删除你将使用的字节数,并添加新section的大小(new 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 = (Unsigned int *)0x80000;

for (i = 0xBFF;我> = 0;我——)

{

if((p_retmem>(未签名int *)0x80768)&&(p_retmem <(unsigned int *)(0x80768 + 80)))

*(valatile unsigned *)p_retmem ++;

别的

*(volatile unsigned *)p_retmem++ = 0;

}

这是一个可能的解决方案,但您也可以将数据存储到SPI Flash中,就像前面提到的那样。如果我误解了你的意思和你想要完成的事情,请让我知道!

谢谢,PM_DIALOG.

Pvmellor.
离线
最后一次露面:一年九个月前
加入:2017-04-27 20:30
PM_DIALOG,

PM_DIALOG,

首先,非常感谢您详细而有帮助的回复!

只是为了更好地解释我自己,我们有一个PAN1740单位包含DA14580在我们的定制板。该板也有一个ARM M4 MCU,这将通过SPI与DA14580交换消息。MCU还通过SPI连接引导DA14580。我们使用SDK 5.0.4。我们没有DA14580可以访问的外部SPI flash。

文件nmi_handler.c定义了一个函数NMI_HandlerC(),当看门狗触发时调用该函数。这个功能用来保存调试数据(CPU寄存器R0/R1/R2/R3/R12/LR/PC/PSR)。它目前似乎将它们保存到0x81850,这已经在保留ram区域。

所以我已经按照你的建议修改了归零程序,以避免这个数据归零。当芯片启动并再次正常工作后,我们读取数据并通过GTL消息传输发送到MCU。作品完美!

非常感谢,

保罗。

PM_DIALOG.
离线
最后一次露面:2天9小时前
工作人员
加入:2018-02-08 11:03
嗨pvmellor,

嗨pvmellor,

很高兴你解决了你的问题,谢谢你接受我的回答。仅供您参考,在DA14585/6产品系列和我们的新SDK6中,您可以比DA14580和SDK5更容易地将未初始化的数据存储在System-RAM中。只需要使用retention_mem_area_uninit属性。

Uint8_t data __attribute__((section("retention_mem_area_uninit"), zero_init));/ / @RETENTION记忆

谢谢,PM_DIALOG.