platform_reset参数

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

DA14580重置后如何获得重置原因,将OTP加载到Sysram并开始运行?我有应用程序标志SET和OTP代码立即加载和执行。我想知道它是否是一个硬重置或软复位,如果可能的话,我想通过自定义价值以获得重置的原因。

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

嗨nscherdin,

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

谢谢mt_dialog.

nscherdin
离线
最后一次露面:1年5个月前
加入:2015-08-15 19:34
你能解释一下如何

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

在一些挖掘之后,它看起来会在system.init()中提供发送到平台重置的错误值。它由rwip_init(错误)使用。这将指示已经存在从前一个运行实例到新实例的错误状态。我需要知道的是我可以发送自己的价值而不是其中一个预定义的值:

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

///重置平台并留在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个月2周前
职员
加入:2015-06-08 11:34
嗨nscherdin,

嗨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
你能解释一下吗?

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

if(错误!= 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个月2周前
职员
加入:2015-06-08 11:34
嗨nscherdin,

嗨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
好的。这解释了这一点。

好的。这解释了这一点。

最后一个相关的问题。如何找到重置/崩溃的原因?我看到几个人提到reset_mem_alloc_fail作为重置的原因。我有一个潜在的内存分配失败,导致重置,我想确认就是这种情况。

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

嗨nscherdin,

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

谢谢mt_dialog.