This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RM46L852:sys_startup.c 生成的代码阻止我们知道系统复位。

Guru**** 2524550 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1214054/rm46l852-generated-code-in-sys_startup-c-prevents-us-to-know-system-reset

器件型号:RM46L852

您好!

我希望我的应用知道上次复位的原因。
例如、为了检测上电复位、我想使用 systemREG1->SYSESR 寄存器中的 PORST 位。

问题在于、出于某种原因、PORST 由 sys_startup.c 中的初始化代码复位

    /* check for power-on reset condition */
    /*SAFETYMCUSW 139 S MR:13.7 <APPROVED> "Hardware status bit read check" */
    if ((SYS_EXCEPTION & POWERON_RESET) != 0U)
    {		
/* USER CODE BEGIN (12) */
/* USER CODE END */
        /* Add condition to check whether PLL can be started successfully */
        if (_errata_SSWF021_45_both_plls(PLL_RETRIES) != 0U)
        {
            /* Put system in a safe state */
			handlePLLLockFail();
        }
        /* clear all reset status flags */
        SYS_EXCEPTION = 0xFFFFU;

/* USER CODE BEGIN (13) */
/* USER CODE END */
/* USER CODE BEGIN (14) */
/* USER CODE END */
/* USER CODE BEGIN (15) */
/* USER CODE END */
      /* continue with normal start-up sequence */
    }

在将 SYS_EXCEPTION = 0xFFFFU 注释到该行时、我突然访问 SYSESR 寄存器上的 POR 位。

我的问题:
-为什么  在 sys_startup 中清除 SYS_exception ?
-删除  sys_startup 中重置 SYS_exception 的行是否安全?
-有没有更好的方法来获得复位原因?

此致、
加布里埃尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Gabriel:

    -为什么  在 sys_startup 中清除 SYS_exception?

    如果发生新的复位、SYSESR 寄存器之前的复位源状态位不会自动清零。 读取该寄存器后、软件应清除所有被置位的标志、以便确定未来复位的来源。  

    -删除  sys_startup 中重置 SYS_exception 的行是否安全?

    将其删除是不安全的。

    -是否有更好的方法来获取复位原因?

    对 Bank7使用费用来存储复位原因。

    (9) TMS570LS3137:TMS570LS3137:启动后使用 SYSESR 和 RTIWDSTATUS -基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    (9) TMS570LS3137:在调试模式下观察复位源时 SYSESR 寄存器无法按预期工作-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    --

    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jagadish、您好!

    感谢您的回答。

    对 Bank7使用费用来存储复位原因。

    [/报价]

    即使在阅读完链接的线程后、我也不知道如何继续。

    如果我理解正确:由于 MEMORY INIT 将清除包含复位信息的寄存器、我们需要使用 FEE 将这些寄存器保存在 MCU 非易失性存储器中。

    如果回答正确、

    - 您建议在代码的哪一部分插入该代码? 在 _coreEnableEventBusExport_()之后?
    - 我应该只保存  SYSESR? 在第一个线程中提到了"检查安全装置违反"。
    -我们需要在读取后清除注册吗?
    什么是 Flash Wear?  

    此致、
    加布里埃尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Gabriel:

    实际上、我曾尝试写入 FEE 内存、但这种方法也不起作用。

    分析代码后、我发现下面的工作方法可以保留复位源  

    首先、我在 main.c 中声明了一个名为"App_Rst_src"的变量、该变量将为应用程序提供复位源值、

    2.将此变量导入到 startup.c 中  

    3、现在我在 _c_int00函数中声明了另一个寄存器类型变量、需要使用此寄存器类型变量、因为常规全局变量将在存储器初始化函数中进行初始化、但如果我们将其声明为寄存器、则会存储在寄存器中的变量值、因此值不会丢失。

    4.实际上、我要做的是、我只是想 首先将 SYS_EXCETION 值复制到这个寄存器变量中、再说一次、我想在我退出 main 函数之前将这个寄存器值复制到"App_Rst_src"中。

    但我在执行该 过程中遇到了一个问题、那就是为 rstSrc 变量分配的寄存器再次在某些汇编程序中使用、因此上述方法再次失败。 所以、我对上述方法做了很少的修改、即、在复制到寄存器变量之后、我只想将其复制到后续程序不使用的另一个寄存器中、 以便我的值得到保留、然后我要将其移动到名为  App_Rst_src 的最终应用程序变量中。

    5.我将 SYS_exception 复制 到名为 rstSrc 的寄存器变量中、而 rstSrc 正在使用这里的 R12寄存器、但正如我所说、该寄存器将使用后来的汇编程序、因此我再次将该 R12值复制到 R9中、而 R9不是在汇编程序中使用。

    6.在调用主函数之前、我要将 R9寄存器值复制到 R12、即 rstSrc 变量、并从该变量复制到 名为 App_Rst_src 的主应用程序变量  

    7.在主函数中,我打印此变量值

    我在此附上我的示例项目、请仔细查看

    修复了启动代码、因此该 R9寄存器将来不会影响。此外、我还尝试了不同的优化级别、但静态代码正常工作。 我希望这个项目对您有所帮助。

    --

    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复  Jagadish。
    非常感谢 您的努力。

    将值存储在未使用的寄存器中的想法非常有趣。
    我没有想到这一点。
    这有点脆弱、但正如您提到的、如果启动代码不更改、就不会有问题。

    我将在今天结束时测试该解决方案。


    实际上、我曾尝试写入 FEE 内存、但这种方法也不起作用。

    [/报价]

    真是个惊喜。 您是否明白为什么会出现这种情况?
    我正计划将 FEE 用于我的项目。

    再次感谢您的辛勤工作、  
    加布里埃尔  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Gabriel:

    这是令人惊讶的。 您是否明白为什么会出现这种情况?
    我正计划将费用用于我的项目。

    如果我在 _TI_auto_init 函数之后调用 FAPI 相关函数、我没有遇到任何问题、可以成功写入闪存、但如果我在该函数之前调用它、我将无法擦除或写入扇区。  

    我想这个 _TI_auto_init 函数将会初始化存储在 BSS 段中的全局变量、因此如果 FAPI 库可能会使用初始化的全局变量、因为我们的函数无法正常工作。 这就是我采用未使用的寄存器方法的原因。

    --

    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好消息:R9战略似乎在发挥作用!

    话虽如此、我注意到了一种奇怪的行为:看门狗位始终置位。
    在进行软件复位时、App_Rst_src 设置为0x2008。  

    您是否还始终设置了看门狗?
    是否还有其他任务要做、以便  系统测试中止状态寄存器(SYSTASR)正常运行?

    不确定是否有用、但在另一个主题中、 提到了可能有用的内容:  

    >如果出现新的复位、SYSESR 寄存器之前的复位源状态位不会自动清零。 读取该寄存器后、软件应清除所有被置位的标志、以便确定未来复位的来源。  



    此外、我更好地理解您的解决方案、您是如何知道 rstSrc 变量将存储在 R12寄存器中的?

    register uint32_t rstSrc;
    rstSrc = (uint16_t)SYS_EXCEPTION;
    

    此致!
    加布里埃尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Gabriel:

    这话,我注意到一个奇怪的行为:看门狗位总是被设置。
    在进行软件复位时、App_Rst_src 设置为0x2008。  
    [报价用户 id="550002" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1214054/rm46l852-generated-code-in-sys_startup-c-prevents-us-to-know-system-reset/4593794 #4593794"]您是否始终都设置了看门狗?

    我来确认一下。

    >如果出现新的复位、SYSESR 寄存器中以前的复位源状态位不会自动清除。 读取该寄存器后、软件应清除所有被置位的标志、以便确定未来复位的来源。  [/报价]

    是的、没错、但在 SYSESR 清除相应位之前、我们将立即复制这些 SYSESR。 如果  再次发生任何新的复位、则 rstSrc 变量将使用新的 SYSESR 值进行更新。

    此外,为了更好地了解您的解决方案,您怎么知道 rstSrc 变量将存储在 R12寄存器中?

    实际上、在调试模式下声明变量 i 已验证后、我随后使用了该寄存器。 根据我的初始方法、我真的不想知道寄存器、我只是想将 rstsrc 中存储的值复制到 App_Rst_src 变量、但与之相关的是分配给 rstsrc  的寄存器变得损坏、因此我再次将该值复制到了其他某个寄存器。

    --

    谢谢。此致、
    Jagadish。

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我来确认一下。

    [/报价]

    很期待看到您取得的成果。

    实际上在声明变量 i 在调试模式下验证后,该变量将被分配,之后我使用了该寄存器

    您是否认为可以使变量加载变得显式?  
    这样它就能顺应未来(最糟糕的是让编译器更新中断代码)


    大概是这样吗? (不确定它是如何工作的)


    const unsigned int test = 0x10000;
    
    __asm__ volatile ("MOV R10, %[input]"
        : // no C variable outputs
        : [input] "r" (test)
        : "R10"      // tell the compiler R10 is modified
          );

    此致、
    加布里埃尔

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Gabriel:

    您是否始终设置了看门狗?

    实际上、如果我们看到 TRM、这不是看门狗复位的原因

    它是由调试引起的 ICEPICK 复位所致。

    在代码中、如果看门狗复位标志设置、则会再次验证 WATCHDOG_STATUS 寄存器以确认它是否真正由看门狗引起。 如果这不是由安全装置引起的、那么他们通过 ICEPICK_RESET 来确认这个复位原因。

    --

    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    看起来它在工作!  
    通过使用  WATCHDOG_STATUS 、我们可以区分看门狗和 JTAG 复位。

    最后一步是使 R12负载显式(以确保此解决方案面向未来)。
    您知道在寄存器中加载 C 变量的方法吗?

    这无法编译:

    const unsigned int test = 0x10000;
    
    __asm__ volatile ("MOV R10, %[input]"
        : // no C variable outputs
        : [input] "r" (test)
        : "R10"      // tell the compiler R10 is modified
          );


    此致、
    加布里埃尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Gabriel:

    使用  watchdog_status ,我们可以区分看门狗和 JTAG 复位。
    [/报价]

    很高兴听到这个消息。

    您知道在寄存器中加载 C 变量的方法吗?

    我尝试了不同的方法、但没有一种方法能够将变量值加载到寄存器中、这就是为什么我坚持使用我共享的方法的原因。

    --

    谢谢。此致、
    Jagadish。

    [/quote]