DA14580重置后如何获得重置原因,将OTP加载到Sysram并开始运行?我有应用程序标志SET和OTP代码立即加载和执行。我想知道它是否是一个硬重置或软复位,如果可能的话,我想通过自定义价值以获得重置的原因。
嗨nscherdin,
没有标准的方法可以做到这一点,也没有专门的机制可以应用,您可以尝试应用一种方案,在保留内存区域中保留一个变量(取决于系统RAM是否在睡眠时关闭),在一个HW\u reset代码中初始化它,并通过更改代码传递的处理程序中变量的状态代码来根据您的重置更改状态。Hardfault、platform\u reset、NMI\u Handler等。如果您使用保留内存区域,您应该记住,每次通过SystemInit()函数重新启动系统时,它都被设置为零,您必须调整该函数,以便在发生重置时不重新初始化以前存储的重置原因。
谢谢你的对话
你能解释一下platform\u reset参数是如何使用的吗?它似乎是由ROM在复位后用来确定如何加载用户程序。
在一些挖掘之后,它看起来会在system.init()中提供发送到平台重置的错误值。它由rwip_init(错误)使用。这将指示已经存在从前一个运行实例到新实例的错误状态。我需要知道的是我可以发送自己的价值而不是其中一个预定义的值:
///FW检测到的可能错误#定义重置无错误0x00000000#定义重置内存分配失败0xf2f2
///重置平台并留在ROM中#定义复位到ROM 0xA5A5A5///重置平台并重新加载FW#定义重置和加载0xc3c3
#在更新0x11111111后定义重置
我可以修改系统初始化来检查错误值,如果它是我的值,则将错误代码设置回RESET\u NO\u error,然后设置我自己的变量来告诉我的主程序如何处理。
我这样做的原因是为了节省代码空间。目前,我有一个ota引导加载程序,工作得很好,但我保留了一个精简版的OTP加载,如果闪存固件损坏(而不是保留两个不同的固件副本在闪存技术上都可能会损坏)。它工作得很好,但它需要我在主用户程序中保留一个ota代码的副本,这会浪费4到5k的代码空间。如果我可以简单地重置并传递一个错误,告诉我的otp引导加载程序运行otp内存中包含的ota引导加载程序,那么我就可以从flash用户程序中完全删除该代码块,并使用带有自定义错误值的platform\u重置。
如果这是不可能的,是的,我会使用内存标志,但似乎这已经是固有的,以您当前的系统,我想保存每一个字节的代码空间,我可以。
在定义了BLE_HOST_PRESENT的SDK中,rwip_init()在ROM代码中实现,platform_reset_func()(从platform_reset()调用)也是由ROM代码实现的函数,但它不检查任何值以执行预定义的操作。它不将先前的重置原因存储到任何特定变量,也没有从何处加载用户代码的任何实现,它只是将SYS\u CTRL\u REG中的SW\u reset位设置为1,并重新启动引导过程。
然后你能解释一下在系统初始化中调用rwip初始化时的错误值吗?似乎rwip\u init要求error为RESET\u NO\u error或not。如果总是RESET\u NO\u ERROR,那么rwip\u init中的以下代码就没有意义了。如果错误值可以不是RESET\u NO\u error,那么有什么可能性?设置的值来自哪里
if(错误!= reset_no_error){
#如果(目前和未来)rBle_发送消息(错误);#elif(BLE\ U HOST\ U PRESENT和GTL\ U ITF)rBle\u hl\u发送消息(错误);#endif//BLE\ EMB\存在}
system_init()函数中的rwip_init()函数不是系统启动时实际调用的函数,函数实现上面的#define始终是1,调用的rwip_init()来自ROM代码,而不是SDK中实现的。尽管如此,函数还是非常相似的,如果您提到的话,在#elif中调用的rbleŠhlŠu sendŠmessage(error)只是ROM代码中的一个空函数。我假设实现是一个用于调试或测试目的的riviera\u waves,没有实现您想要的功能的机制,正如我allready提到的,平台\u reset\u func不存储或检查任何变量,它只是重置设备。
好的。这解释了这一点。
最后一个相关的问题。如何找到重置/崩溃的原因?我看到几个人提到reset_mem_alloc_fail作为重置的原因。我有一个潜在的内存分配失败,导致重置,我想确认就是这种情况。
ROM代码跟踪这种分配失败,并以reset\u MEM\u ALLOC\u FAIL作为参数强制平台重置,如果自定义代码中存在重置,则ram不足是原因。
嗨nscherdin,
没有标准的方法可以做到这一点,也没有专门的机制可以应用,您可以尝试应用一种方案,在保留内存区域中保留一个变量(取决于系统RAM是否在睡眠时关闭),在一个HW\u reset代码中初始化它,并通过更改代码传递的处理程序中变量的状态代码来根据您的重置更改状态。Hardfault、platform\u reset、NMI\u Handler等。如果您使用保留内存区域,您应该记住,每次通过SystemInit()函数重新启动系统时,它都被设置为零,您必须调整该函数,以便在发生重置时不重新初始化以前存储的重置原因。
谢谢你的对话
你能解释一下platform\u reset参数是如何使用的吗?它似乎是由ROM在复位后用来确定如何加载用户程序。
在一些挖掘之后,它看起来会在system.init()中提供发送到平台重置的错误值。它由rwip_init(错误)使用。这将指示已经存在从前一个运行实例到新实例的错误状态。我需要知道的是我可以发送自己的价值而不是其中一个预定义的值:
///FW检测到的可能错误
#定义重置无错误0x00000000
#定义重置内存分配失败0xf2f2
///重置平台并留在ROM中
#定义复位到ROM 0xA5A5A5
///重置平台并重新加载FW
#定义重置和加载0xc3c3
#在更新0x11111111后定义重置
我可以修改系统初始化来检查错误值,如果它是我的值,则将错误代码设置回RESET\u NO\u error,然后设置我自己的变量来告诉我的主程序如何处理。
我这样做的原因是为了节省代码空间。目前,我有一个ota引导加载程序,工作得很好,但我保留了一个精简版的OTP加载,如果闪存固件损坏(而不是保留两个不同的固件副本在闪存技术上都可能会损坏)。它工作得很好,但它需要我在主用户程序中保留一个ota代码的副本,这会浪费4到5k的代码空间。如果我可以简单地重置并传递一个错误,告诉我的otp引导加载程序运行otp内存中包含的ota引导加载程序,那么我就可以从flash用户程序中完全删除该代码块,并使用带有自定义错误值的platform\u重置。
如果这是不可能的,是的,我会使用内存标志,但似乎这已经是固有的,以您当前的系统,我想保存每一个字节的代码空间,我可以。
嗨nscherdin,
在定义了BLE_HOST_PRESENT的SDK中,rwip_init()在ROM代码中实现,platform_reset_func()(从platform_reset()调用)也是由ROM代码实现的函数,但它不检查任何值以执行预定义的操作。它不将先前的重置原因存储到任何特定变量,也没有从何处加载用户代码的任何实现,它只是将SYS\u CTRL\u REG中的SW\u reset位设置为1,并重新启动引导过程。
谢谢你的对话
然后你能解释一下在系统初始化中调用rwip初始化时的错误值吗?似乎rwip\u init要求error为RESET\u NO\u error或not。如果总是RESET\u NO\u ERROR,那么rwip\u init中的以下代码就没有意义了。如果错误值可以不是RESET\u NO\u error,那么有什么可能性?设置的值来自哪里
if(错误!= reset_no_error)
{
#如果(目前和未来)
rBle_发送消息(错误);
#elif(BLE\ U HOST\ U PRESENT和GTL\ U ITF)
rBle\u hl\u发送消息(错误);
#endif//BLE\ EMB\存在
}
嗨nscherdin,
system_init()函数中的rwip_init()函数不是系统启动时实际调用的函数,函数实现上面的#define始终是1,调用的rwip_init()来自ROM代码,而不是SDK中实现的。尽管如此,函数还是非常相似的,如果您提到的话,在#elif中调用的rbleŠhlŠu sendŠmessage(error)只是ROM代码中的一个空函数。我假设实现是一个用于调试或测试目的的riviera\u waves,没有实现您想要的功能的机制,正如我allready提到的,平台\u reset\u func不存储或检查任何变量,它只是重置设备。
谢谢你的对话
好的。这解释了这一点。
最后一个相关的问题。如何找到重置/崩溃的原因?我看到几个人提到reset_mem_alloc_fail作为重置的原因。我有一个潜在的内存分配失败,导致重置,我想确认就是这种情况。
嗨nscherdin,
ROM代码跟踪这种分配失败,并以reset\u MEM\u ALLOC\u FAIL作为参数强制平台重置,如果自定义代码中存在重置,则ram不足是原因。
谢谢你的对话