如何知道复位是否由于看门狗定时器?

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
6个员额/ 0个新员额
最后发表
前腿帕特尔
离线
最后看到:2年6个月前
加入:2017-03-29专机
如何知道复位是否由于看门狗定时器?

亲爱的Dialog_Support,

我已经存储了一个变量的值到flash中,我想在重置发生看门狗定时器后检索那个值。但我不能认识到复位发生由于看门狗或任何其他原因。我读过这篇文章
https://support.dialog-semiconductor.com/how-could-i-know-whether-reset-..。
我知道,如果我们在保留RAM中声明变量,那么我们就可以在watchdog之后检索它。另一个解决方案是使用外部存储器。由于我的应用程序没有任何外部内存,我必须声明变量到保留RAM。我已经尝试这样做,但我不能检索它的价值后watchdog重置。你能不能给我举个例子,把值存储到保留RAM中,然后在设备重置后取回。
提前谢谢你

与问候,
前腿帕特尔

设备:
PM_Dialog
离线
最后看到:4天18小时前
工作人员
加入:2018-02-08 11:03
嗨,前腿帕特尔

嗨,前腿帕特尔

你可以将你的数据存储到保留RAM中,就像你在过去发布的线程中描述的那样。请注意,在设备重置后,您存储的数据将会丢失。请检查SystemInit()函数,你会发现SetBits16(PMU_CTRL_REG, RETENTION_MODE, 0xF);,因此所有保留内存的位设置为0,您已经看到了归零的保留内存区域是应该在设备启动时自保留区域在深度睡眠,除了用户数据,额外的祝福信息(BLE堆、栈等)。

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

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

  • 部分的RETRAM_LEN将在你的新section中使用,所以从#define RETRAM_LEN中删除你将使用的字节数,并添加新section的大小(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之间的内存归零。

//用0填充0x80000 - 0x83000

Unsigned int *p_retmem = (Unsigned int *)0x80000;

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

If ((p_retmem > (unsigned int *)0x80768) && (p_retmem < (unsigned int *)(0x80768 + 80)))

*(不稳定的无符号*)p_retmem + +;

其他的

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

谢谢,PM_Dialog

jarirenejensen
离线
最后看到:1年2个月前
加入:2017-02-05 14:44
我也需要这个功能,在

我也需要这个功能,以便在看门狗咬人的情况下进行无声重置。

我使用的是SDK5,这与这个解释并不完全一致。
你能把这个指南重新应用到SDK5吗?

jarirenejensen
离线
最后看到:1年2个月前
加入:2017-02-05 14:44
我调查了一下

我做了进一步的调查

如果我使用uint8_t silent_reset __attribute__((section("retention_mem_area_uninit"));(省略zero_init属性)我的变量" silent_reset "结束于" Execution Region RET_DATA "的开头,并且类型为Data而不是Zero -像这样:
0x07fd4804 0x00000001数据RW
不过,它被看门狗咬了一口也活不了。

如果我使用__attribute__((section("retention_mem_area_uninit"));一个人应该认为它结束在执行区域RET_DATA_UNINIT,但它结束在LR_IROM3 -为什么?

PM_Dialog
离线
最后看到:4天18小时前
工作人员
加入:2018-02-08 11:03
嗨jarirenejensen,

嗨jarirenejensen,

凯尔的部门是32个字节对齐,所以最大保留未初始化的数据,需要由应用程序(CFG_RET_DATA_UNINIT_SIZE da1458x_stack_config.h头文件中定义)必须是4的倍数(4 x 8 = 32字节)大于或等于总的数据的总和。如果CFG_RET_DATA_UNINIT_SIZE不是4的倍数,Keil会将其截断为4的最小倍数,否则如果数据不能匹配,则会删除hole部分。请确保CFG_RET_DATA_UNINIT_SIZE是4的倍数。

谢谢,PM_Dialog

jarirenejensen
离线
最后看到:1年2个月前
加入:2017-02-05 14:44
谢谢-这就是我要说的

谢谢-这是我错过的部分。