platform_reset参数

8个帖子/ 0个新
最后发表
NScherdin
离线
最后看到:1年5个月前
加入:2015-08-15福音》第19章34节
platform_reset参数

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

设备:
MT_dialog
离线
最后看到:两个月三个星期前
工作人员
加入:2015-06-08 34
嗨nscherdin,

嗨nscherdin,

没有标准的方法来做到这一点,也没有专用的机制来应用,你可以尝试的是应用一个方案,在保留记忆区域保存一个变量(取决于syram是否在睡觉时关闭),在HW_reset代码中初始化它,并通过改变代码传递的处理程序中的变量中的状态代码来根据重置来更改状态。Hardfault, platform_reset, NMI_Handler等。如果你使用保留内存区域,你应该记住,它被设置为零每次重新启动系统通过SystemInit()函数,您将不得不调整函数为了不初始化复位的原因你商店之前重置时发生。

由于MT_dialog

NScherdin
离线
最后看到:1年5个月前
加入:2015-08-15福音》第19章34节
你能解释一下如何

你能解释一下platform_reset参数是如何使用的吗?它似乎是用ROM重置后决定如何加载用户程序。

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

/// FW可能检测到的错误
#定义RESET_NO_ERROR 0 x00000000
#定义xf2f2f2f2 RESET_MEM_ALLOC_FAIL 0

///重置平台并留在ROM中
#定义xa5a5a5a5 RESET_TO_ROM 0
///重置平台,重新加载FW
#定义xc3c3c3c3 RESET_AND_LOAD_FW 0

#定义x11111111 RESET_AFTER_SPOTA_UPDATE 0

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

我这样做的原因是为了节省代码空间。目前,我有一个ota引导加载程序,工作得很好,但我保持一个修剪下来的版本在OTP,如果flash固件是腐败的(而不是保持两个不同的固件副本在flash中,这两个可能会损坏技术)。它工作得很好,但它要求我在主用户程序中保留一份ota代码的副本,这浪费了4到5k的代码空间。如果我可以简单地重置并传递一个错误,告诉我的otp引导加载程序运行包含在otp内存中的ota引导加载程序,那么我可以完全从我的flash用户程序中删除那块代码,只使用一个platform_reset与我的自定义错误值。

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

MT_dialog
离线
最后看到:两个月三个星期前
工作人员
加入:2015-06-08 34
嗨nscherdin,

嗨nscherdin,

在SDK BLE_HOST_PRESENT定义,rwip_init()是在ROM代码实现,在platform_reset_func()调用(这是platform_reset())是由ROM代码实现一个函数,但它不检查任何值为了实现预定义操作。它不将之前的重置原因存储到任何特定变量中,也没有从何处加载用户代码的实现,它只是将SYS_CTRL_REG中的SW_RESET位设置为1,并随着引导过程重新启动。

由于MT_dialog

NScherdin
离线
最后看到:1年5个月前
加入:2015-08-15福音》第19章34节
你能解释一下吗?

那么你能解释一下system_init中调用rwip_init时error的值吗?似乎rwip_init要求error要么是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
离线
最后看到:两个月三个星期前
工作人员
加入:2015-06-08 34
嗨nscherdin,

嗨nscherdin,

system_init()函数中的rwip_init()函数不是系统启动时实际调用的函数,上面的#define函数实现总是1,调用的rwip_init()来自ROM代码,而不是在SDK中实现的。然而,这些函数非常相似,在#elif中调用的rwble_hl_send_message(错误)只是ROM代码中的一个空函数。我认为该实现是riviera_waves用于调试或测试目的的剩余部分,没有你想要的功能实现机制,并且正如我已经提到的,platform_reset_func不存储或检查任何变量,它只是重置设备。

由于MT_dialog

NScherdin
离线
最后看到:1年5个月前
加入:2015-08-15福音》第19章34节
好的。这解释了这一点。

好的。这解释了这一点。

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

MT_dialog
离线
最后看到:两个月三个星期前
工作人员
加入:2015-06-08 34
嗨nscherdin,

嗨nscherdin,

ROM代码跟踪这种分配失败,并以RESET_MEM_ALLOC_FAIL作为参数强制平台重置,如果在您的自定义代码中有重置,那么内存耗尽是其原因。

由于MT_dialog