如果调用WatchDog触发和NMI处理程序,则在平台代码中将一系列错误参数集合在一起。但是,我们无法在我们的现场部署产品中附加调试器,因此我们无法获取错误信息。雷电竞官网登录
我们想拍摄错误信息并将其存储在某个地方;然后重启;然后再次访问错误数据,以便可以在消息中发送到我们的主机(我们不觉得我们仍然可以在NMI处理程序本身可靠地发送消息)。
是否有任何方法可以持有跨重启的错误数据,因此可以在稍后在消息中使用?将保留电源,但RST引脚将被切换,系统将重新启动SPI。
谢谢。
设备:
嗨pvmellor,
要诚实,我无法理解如何从应用程序中收集错误信息,但您可以将它们存储在SPI闪存中。因此,在设备重新启动之后,您可以再次读取它们。您的案例的另一种可能的解决方案是在保留电源的情况下将错误信息存储在保留RAM中。通常,在设备重置之后,保留RAM中的存储数据将丢失。请检查SystemInit()函数,并找到setBits16(PMU_CTRL_REG,RETENT_MODE,0xF);因此,保留RAM的所有位被设置为所以,除了在深度睡眠中的保留区域以来的情况下,保留存储区域的归零是应该完成的,除了用户数据之外,额外的BLE信息(BLE堆,堆栈等)。重置后,归零功能将再次运行,并将消除保留存储区域中的任何数据。为了避免您可以做的是要知道您的“数据”驻留在保留存储区域和初始化期间,您应该避免将它们归零。您可以按照以下步骤进行操作以便执行此操作:
在scatterfile中,保留区是为深度睡眠定义的,分配一个空间将保存不应该初始化的数据。
§LR_RETENTION_RAM0 0x00080768 (RETRAM_LEN + EXCHANGE_MEMORY_SIZE + SZ_AFT_RST_DATA) {
§RET_RESET01 0x00080768 UNINIT SZ_AFT_RST_DATA {. any (unitialized_data_test)} <-标记新区域。
所以现在您知道将使用Unitialized_Data_Test标记的数据将从地址0x00080768驻留到地址0x00080768 + sz_aft_rst_data。由于您知道您可以转到SystemInit()函数并指示功能不归零0x00080768和0x00080768 + sz_aft_rst_data之间的内存。
//用0填充0x80000 - 0x83000
unsigned int * p_retmem =(无符号int *)0x80000;
for(i = 0xbff; i> = 0; I--)
{
if((p_retmem>(未签名int *)0x80768)&&(p_retmem <(unsigned int *)(0x80768 + 80)))
*(不稳定的无符号*)p_retmem + +;
其他的
*(valaTile unsigned *)p_retmem ++ = 0;
}
这是一个可能的解决方案,但您还可以将数据存储到SPI闪存中,因为它已提到。如果我误解了你的意思和你想完成的事情,请告诉我!
谢谢,PM_Dialog
PM_Dialog,
首先,非常感谢您的详细和乐于助人的回复!
只是为了解释自己更好,我们有一个Pan1740单元,包含我们的定制板上的DA14580。该板也有一个ARM M4 MCU,这将通过DA14580交换SPI的消息。MCU还在SPI连接上启动DA14580。我们使用SDK 5.0.4。我们没有外部SPI闪光灯,DA14580可以访问。
文件nmi_handler.c,定义了如果看门狗触发的函数nmi_handlerc()。这是节省调试数据的这种功能(CPU寄存器R0 / R1 / R2 / R3 / R12 / LR / PC / PSR)。它目前似乎将它们保存到0x81850,它已经在保留RAM区域。
因此,我根据您的建议修改了归零程序,以避免归零此数据。芯片启动并再次正常工作后,我们读取数据并通过GTL消息传输将其发送到MCU。效果完美!
非常感谢,
保罗。
嗨pvmellor,
很高兴你识上你的问题,谢谢你接受我的答案。只需您的信息,在DA14585 / 6产品系列和我们的新SDK6中,您可以比DA14580和SDK5更轻松地将未初始化的数据存储在系统内存中。只需使用Retention_mem_area_uninit属性。
UINT8_T数据_TTRIBUTE __((部分(“保留_mem_area_uninit”),ZERO_INIT));// @保留记忆
谢谢,PM_Dialog