platform_reset论点

8个帖子/ 0新
最后一篇
nscherdin
离线
最后一次露面:1年5个月前
加入:2015-08-15 19:34
platform_reset论点

How do I get the reset reason after the DA14580 resets, loads the otp to SysRam and starts to run? I have the application flags set and otp code is loaded and executed immediately. I want to know if it is a hard reset or soft reset and if possible, I'd like to pass a custom value for the reason for the reset.

设备:
mt_dialog.
离线
最后一次露面:2个月3周前
职员
加入:2015-06-08 11:34
Hi NScherdin,

Hi NScherdin,

没有标准的方法来解决或应用专用机制,您可以尝试的是应用一个方案,您可以在保留内存区域中保留变量(取决于Sysram在睡眠时关闭),初始化它一个HW_RESET代码并根据您的代码通过的处理程序中的变量中的状态代码更改状态,然后更改状态。硬盘,platform_reset,nmi_handler等。如果您使用保留内存区域,每次通过SystemInit()函数重新启动系统时,您应该记住它,您将不得不按照重新启动该功能- 在发生重置时,初始化您之前已经存储的重置原因。

谢谢mt_dialog.

nscherdin
离线
最后一次露面:1年5个月前
加入:2015-08-15 19:34
Can you explain how the

你能解释一下platform_reset参数是否如何?ROM似乎在重置后使用,以确定如何加载用户程序。

After some digging it appears the error value sent to platform reset is provided in system.init(). It is used by rwip_init(error). This would indicate there is already a mechanism that is passing this error state from the previous running instance to the new instance. What I need to know is can I send my own value instead of one of the predefined ones:

///由fw检测到的可能错误
#define reset_no_error 0x00000000
#define reset_mem_alloc_fail 0xf2f2f2f2

/// Reset platform and stay in ROM
#define reset_to_rom 0xa5a5a5a5.
///重置平台并重新加载FW
#define reset_and_load_fw 0xc3c3c3c3.

#define reset_after_spota_update 0x11111111.

我可以修改system_init以检查错误值,如果是我的值将错误代码设置回reset_no_error,然后设置我自己的变量以告诉我的主程序如何程序。

我这样做的原因是为了节省代码空间。目前我有一个OTA引导加载程序,它非常好,但是如果闪存固件已损坏,我会在加载的OTP中保持修剪的下载版本(而不是在技术上可以损坏的闪存中的闪存中的两个不同的固件副本)。它运行良好,但它要求我在主用户​​程序中保留OTA代码的副本,该副本浪费4到5K的代码空间。如果我可以简单地重置并传递给我的OTP引导加载程序运行OTP内存中包含的OTA引导加载程序的错误,那么我可以完全从我的闪存用户程序中删除该代码块,只需使用带有自定义错误值的平台_RESET。

如果是不可能的话,是的,我将使用内存标志,但似乎这已经是您当前的系统中固有的,我想保存我可以的每个代码空间的每个字节。

mt_dialog.
离线
最后一次露面:2个月3周前
职员
加入:2015-06-08 11:34
Hi NScherdin,

Hi NScherdin,

在使用BLE_HOST_PRESENT定义的SDK中,RWIP_INIT()在ROM代码中实现,platform_reset_func()(从platforp_reset()调用)是由ROM代码实现的函数,但它没有检查任何值才能进行预定义操作。它不会将以前的重置原因删除到任何特定变量或从中加载用户代码的任何实现,它只需在sys_ctrl_reg中设置为1 sw_reset位,并使用引导过程重新启动。

谢谢mt_dialog.

nscherdin
离线
最后一次露面:1年5个月前
加入:2015-08-15 19:34
Can you then explain the

如果在system_init中调用RWIP_INIT时,您能解释错误的值吗?似乎RWIP_INIT需要错误是reset_no_error。如果始终reset_no_error,则RWIP_INIT中的以下代码无意义。如果错误值可以是reset_no_error的,那么从它被设置为的值是什么,其中值是:

如果(错误! = RESET_NO_ERROR)
{

#if(ble_emb_present && hcic_itf)
rwble_send_message(错误);
#elif(ble_host_present && gtl_itf)
rwble_hl_send_message(错误);
#endif // ble_emb_present.
}

mt_dialog.
离线
最后一次露面:2个月3周前
职员
加入:2015-06-08 11:34
Hi NScherdin,

Hi NScherdin,

system_init()函数中的rwip_init()函数不是在系统启动时实际调用的函数,上面的#define函数实现是全部1的,而调用的RWIP_INIT()来自ROM代码不是在SDK中实施的那个。然而,函数非常相似,您提到的#elif中调用的rwble_hl_send_message(错误)只是ROM代码中的一个空函数。我想实现的是reviera_waves redover用于调试或测试目的,没有对所需的函数实用性的实现机制,并且由于我已经提到了platform_reset_func不存储或检查它只能重置设备的任何变量。

谢谢mt_dialog.

nscherdin
离线
最后一次露面:1年5个月前
加入:2015-08-15 19:34
Ok. That explains that.

Ok. That explains that.

One last related questions. How do I find out the reason for a reset/crash? I see a couple people mention RESET_MEM_ALLOC_FAIL as the reason for their reset. I have a potential memory allocation failure causing a reset and I want to confirm that is the case.

mt_dialog.
离线
最后一次露面:2个月3周前
职员
加入:2015-06-08 11:34
Hi NScherdin,

Hi NScherdin,

ROM代码跟踪这种分配失败,并强制使用reset_mem_alloc_fail重置平台作为参数,如果您的自定义代码中有重置,那么RAM耗尽是它的原因。

谢谢mt_dialog.