如果监管机构火灾和敝中断处理程序被调用时,一系列的错误参数收集在一起,平台代码。但是,我们不能将调试器附加在我们现场部署的产品,所以我们不能得到错误的信息。亚博电竞菠菜
我们想把错误信息并存储在某个地方;然后重新启动;然后再次访问错误数据,因此它可以送到我们的主机信息(我们不觉得我们仍然可以可靠地发送消息在敝中断处理程序本身)。
有什么办法可以在启动过程中持续的错误数据,所以它可以用在个口信吗?权力将被保留,但RST销将切换和系统重启/ SPI。
谢谢。
设备:
嗨pvmellor,
老实说,我不能够理解如何收集错误信息从您的应用程序,但你可以在SPI Flash存储它们。所以,设备重启后,你可以再次阅读。你的案子的另一个可能的解决方案是在保留内存存储错误信息自电力将被保留。一般来说,设备重置后,保留内存中存储的数据将丢失。请检查SystemInit()函数,并且你会发现SetBits16 (PMU_CTRL_REG RETENTION_MODE 0 xf);,因此所有的位保留内存将所以的零位调整保留内存区域是应该在设备启动时自保留区域在深度睡眠,除了用户数据,额外的祝福信息(BLE堆、栈等)。函数将重置零位调整后再次运行并将消灭任何数据,你有保留的内存区域。为了避免你所能做的就是了解自己的“数据”居住在保留内存区域,在初始化期间你应该避免归零。你可以按照下面的步骤来做:
scatterfile中保留内存区被定义为深度睡眠分配一个空间,将你的数据应该没有初始化。
§LR_RETENTION_RAM0 0 x00080768 (RETRAM_LEN + EXCHANGE_MEMORY_SIZE + SZ_AFT_RST_DATA) {
§RET_RESET01 0 x00080768 UNINIT SZ_AFT_RST_DATA {.ANY (unitialized_data_test)} < -标记的新区域。
现在你知道unitialized_data_test将标记的数据将从地址0 x00080768居住地址0 x00080768 + SZ_AFT_RST_DATA。既然你都知道,你可以去SystemInit()函数和指示功能不为0 0 x00080768和0之间的内存x00080768 + SZ_AFT_RST_DATA。
/ / 0 x80000 - 0 x83000填充为零
unsigned int * p_retmem = (unsigned int *) 0 x80000;
(i = 0 xbff;我> = 0;我——)
{
如果((p_retmem > (unsigned int *) 0 x80768) & & (p_retmem < (unsigned int *) (0 x80768 + 80)))
*(不稳定的无符号*)p_retmem + +;
其他的
*(不稳定的无符号*)p_retmem + + = 0;
}
这是一个可能的解决方案,但是你也可以将数据存储到SPI Flash已经提到。如果我误解了你的意思,你想要实现什么,请让我知道!
谢谢,PM_Dialog
PM_Dialog,
首先,非常感谢你的详细的和有用的回复!
仅仅是想解释自己好一点,我们有一个包含DA14580 PAN1740单位对我们的自定义。董事会有一个手臂M4单片机,这将在SPI与DA14580交换消息。单片机也靴子DA14580 SPI连接。我们使用SDK 5.0.4。我们没有外部SPI flash DA14580可以访问。
文件nmi_handler。c语言定义了一个函数NMI_HandlerC(),如果监管机构火灾。这个函数可以节省调试数据(CPU寄存器R0 / R1 / R2和R3 / R12 / LR / PC / PSR)。目前似乎拯救他们0 x81850已保留的内存区域。
所以我按照你的建议修改了归零程序以避免零位调整这些数据。芯片已经启动和正常工作后,我们读取数据并将其发送到单片机GTL消息传输。作品完美!
非常感谢,
保罗。
嗨pvmellor,
高兴你解决你的问题,谢谢你接受我的答案。只是为了你的信息,在DA14585/6产品的家人和我们的新SDK6,您可以存储在系统内存中未初始化的数据更容易比DA14580和SDK5。只需要使用retention_mem_area_uninit属性。
uint8_t数据使用__attribute__ (((“retention_mem_area_uninit”)部分,zero_init));/ / @RETENTION记忆
谢谢,PM_Dialog