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.

[参考译文] TMS320F2800157:锁步功能

Guru**** 2538930 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1359735/tms320f2800157-lockstep-functionality

器件型号:TMS320F2800157
主题中讨论的其他器件:C2000WARE

软件:
CCS 版本:12.7.0.00007  

C2000Ware_5_02_00_00

硬件:

LAUNCHXL_F2800157

您好!

我正在尝试执行板的锁步功能的 POC。 我学习了 MCU 的参考手册和安全手册、还查看了 driverlib 中的 lcm.c 和 lcm.h 文件。 我想问一些有关锁步函数的问题、以及我如何将其正确集成到我的软件中。

我刚刚运行 led ex1_blinky 示例、它使用 SYSCFG 创建板级配置文件、而我在调试模式下运行所有代码。 (我知道 LCM 在调试模式下不工作)

1.

在参考手册中、它表示:  

  1. 使用以下位锁定 LSEN 配置:
    • CPU_SYS_REGS [CPUSYSLOCK2.LSEN=1]
  2. 使用以下位启用所需模块的比较器:
    • LCM_REGS [LCM_CONTROL。 CMPEN= 1]
    • 锁步比较将立即开始下一个周期、

默认情况下、应在示例中启用 LCM、这就是我在示例中看到的。 在 device.c 文件中的 Device_init 函数中、我看到  

从而:

//
// Enable lockstep compare module
//
HWREG_BP(LCM_CPU1_BASE + LCM_O_CONTROL) |= LCM_CONTROL_CMPEN;

但我看不到 LSEN 配置锁定的位置。 我在 LCM_isLockStepEnabled 函数中仅看到了一个类似的 Marco LCM_STATUS_LSEN、当我在主函数中调用它时返回的值为 true。 我需要设置任何寄存器吗、或者这足够吗?


 

2.

我尝试了运行下面的代码、并看到了我们如何在 调试模式下执行自检/强制错误、然后在最后清除标志。

LCM_Status stat = LCM_runSelfTest(LCM_CPU1_BASE);
LCM_Status stat1 = LCM_runComp1ErrorForceTest(LCM_CPU1_BASE);
LCM_Status stat2 = LCM_runComp2ErrorForceTest(LCM_CPU1_BASE);

查看代码时、我假设将在代码中以这种方式使用 LCM。 在我需要比较的任何关键算法之后、我将调用 LCM_getLockStepCompareStatus 函数、如果该函数失败、则我需要进行错误处理并清除标志以继续。 如果它通过了,我可以继续,不需要清除任何标志。 这是使用 LCM 功能的正确方法吗? 还是需要添加其他特性?

uint16_t x = 10;
uint16_t y = 5;
uint16_t z = x+y;
    
if (LCM_getLockStepCompareStatus(LCM_CPU1_BASE) == LCM_FAIL) {
    // handle error and clear the flag
    LCM_clearFlags(LCM_STATUS_CLEAR_CMP_FAIL);
} else {
    // algorithm works fine
}

3.我阅读了 LCM 错误将如何生成 NMI 中断、无论是寄存器奇偶校验还是锁步比较。 我必须在 SYSCFG 中启用中断、每当出现 LCM 错误时、我都会收到 _ interrupt void Interrupt_nmiHandler (void)。 我可以使用 sysctl_getNMIFagStatus()函数来获取什么样的错误并进行错误处理。

我在这里的问题是:
a.即使我在 接收到 LCM 比较错误后调用 LCM_clearFlags (LCM_STATUS_CLEAR_CMP_FAIL)、我仍会获得中断吗? 如果是、则我需要在中断时清除 NMIFags。

b.当我收到寄存器奇偶校验错误 NMI 中断时、是否需要使用 SYSCTL_clearAllNMIRFlags (void)或 SYSCTL_clearNMiStatus (uint16_t NMiFlags)清除标志以继续执行程序、而不是结束程序?


4.我看到、为了测试 LCM 错误、有第3.5.3节"错误注入测试"强制执行错误。 是否有任何其他方法可以在没有注入的情况下创建 LCM 错误? (例如使用 α 粒子轰击硬件)

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

    谢尔谢克、您好!

    Unknown 说:
    即使我 在收到 LCM 比较错误后调用 LCM_clearFlags (LCM_STATUS_CLEAR_CMP_FAIL)、我仍会收到中断吗? 如果是、则需要在中断时清除 NMIFags。[/引号]

    >只要 生成比较失败、无论尝试清除 CMP 失败状态的速度有多快、您都会获得 NMI。
    是的、你需要清除 NMI ISR 中的 NMI 标志和系统控制寄存器标志

    当我收到寄存器奇偶校验错误 NMI 中断时、是否需要使用 SYSCTL_clearAllNMIFags (void)或 SYSCTL_clearNMiStatus (uint16_t nmiFlags)清除标志以继续执行程序而不是结束程序?

    是出错后清除所有标志、然后继续执行程序的其余部分

    Unknown 说:
    我看到要测试 LCM 错误、第3.5.3节"错误注入测试"可强制执行错误。 是否有任何其他方法可以在没有注入的情况下创建 LCM 错误? (如使用 α 粒子对硬件进行轰击)

    当然,但我不会建议,因为明显的原因.. 为什么您更喜欢破坏性/侵入式测试而不是基于硬件的故障注入来生成 LCM 错误?

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

    棒极了、感谢您的澄清。

     您还能回答第一部分和第二部分吗?

    我需要设置任何注册还是足够了吗?
    [quote userid="602178" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1359735/tms320f2800157-lockstep-functionality 这样使用 LCM 功能的方式是否正确? 或者还需要添加更多内容?

    请提供有关如何使用 LCM 功能的任何示例的建议。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    一旦 生成比较失败,无论您尝试清除 CMP 失败状态的速度有多快,您都将获得 NMI [/报价]

    正如您在图中看到的那样、我启用了全局 NMI 中断设置、但在我运行代码时没有获得任何中断

    LCM_Status stat1 = LCM_runComp1ErrorForceTest(LCM_CPU1_BASE);
    LCM_Status stat2 = LCM_runComp2ErrorForceTest(LCM_CPU1_BASE);

    您能否解释一下背后的原因? 我没有在调试模式下运行。 我正在使用 LCM_isDebuggerConnected (LCM_CPU1_BASE)函数进行验证。

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

    、您还能解释一下您是如何函数 的:LCM_lockRegister、 LCM_unlockRegister 和 LCM_committRegister? 因为手册中有"奇偶校验方案在相应的寄存器中每字节数据提供一个奇偶校验位"的说明。 对以下任何 持续监控的寄存器 导致奇偶校验位的更新。"
    这些 持续监控的寄存器是什么?  

    该代码表明

    //  \param regs is the logical OR of the registers to be locked
    //!             - LCM_LOCK_LCM_CONTROL
    //!             - LCM_LOCK_LCM_STATUS_CLEAR
    //!             - LCM_LOCK_PARITY_TEST

    由于未提供示例、请建议如何使用这些函数。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这些 持续监控的寄存器是什么?  [/报价]

    这些寄存器受奇偶校验保护、在手册中有非常清楚的说明。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我启用了全局 NMI 中断设置,如您在图像中所见,但我在运行代码时没有收到任何中断[/引号]

    是否设置了 NMI ISR?
    如果是、请放置一个断点、查看它是否到达 NMI ISR

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

    是的、我已如下图所示设置 NMI ISR。 我尝试在中断处放置断点、但始终无法到达那里。

     

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

    我查看了示例 sysctl_ex1_missing_clock_detection 以查看是否设置了 NMI。 它完全不同、只是 在 SYSCFG 文件上启用 NMI 全局中断。 示例运行正常、但它模拟的是时钟丢失检测功能、我现在不想使用该功能(因为我关注的是 LCM)

        stat = SysCtl_getNMIStatus();
    
        //
        // Simulate a missing clock detection
        //
        SysCtl_disconnectMCDClockSource();
    
        stat = SysCtl_getNMIStatus();

    在此示例中,我注意到一件事是,在仿真丢失的时钟检测之前 ,SYSCTL_getNMiStatus ()函数返回 false,在 SYSCTL_disconnectMCDClockSource ()函数调用后,SYSCTL_getNMiStatus ()返回 true。  

    我不明白 NMI 为什么未启用。 您能帮助吗?
    我用于启用 NMI 的代码如下:

    //
        // Re-map NMI signal to call the ISR function in this
        // example
        //
        SysCtl_clearAllNMIFlags();
        Interrupt_register(INT_NMI, &nmi_isr);
    
        //
        // Enabling the NMI global interrupt
        //
        SysCtl_enableNMIGlobalInterrupt();
    
        Interrupt_enable(INT_NMI);
    
        //
        // Enable Global Interrupt (INTM) and real time interrupt (DBGM)
        //
        EINT;
        ERTM;

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

    谢尔谢克、您好!

    我查看了示例 sysctl_ex1_missing_clock_detection 以查看是否设置了 NMI。 完全不同的是仅在  SYSCFG 文件上启用 NMI 全局中断

    假设您已正确设置 NMI 处理程序、并将 MCD 示例作为参考。

    发生锁步模块比较错误时会设置 LCM_ERR_FLG 寄存器并也应设置 NMI 标志您可以设置断点并查看寄存器视图并进行检查。

    以下是条件:  

    在 GERR 标志被清除之前、不会触发更多 NMI。

    还可以检查 NMISHDWLG 寄存器。 强制/触发 LCM 错误后立即更改以下位

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

    好的、我让它工作了。 我设置好了一切、在中断之后清除了 GERR 标志。

    关于该主题的最后一个问题。

    我们使用 LCM_runComp1ErrorForceTest ()函数来强制执行 LCM 错误,但在生产中,我们不会强制执行错误。
    LCM 在后台连续运行、当我们遇到任何 LCM 错误时、将获取 NMI 中断(我们需要清除 LCM 标志、NMI 标志和 GERR 标志)。 在这个实现的下面我放了一个示例代码。 这种方式是否适合投入生产?

    __interrupt void nmi_isr(void)
    {
        uint16_t nmistatus = SysCtl_getNMIFlagStatus();
        SysCtl_clearAllNMIFlags();
        if ((nmistatus & SYSCTL_NMI_NMIINT) != 0U) {
            log("SYSCTL_NMI_NMIINT\n\0");
        }
        if ((nmistatus & SYSCTL_NMI_LSCMPERR) != 0U) {
            LCM_clearFlags(LCM_CPU1_BASE, LCM_STATUS_CLEAR_CMP_FAIL);
            uint32_t LCMErrorFlag = SysCtl_getLCMErrorFlag();
            SysCtl_clearLCMErrorFlag(LCMErrorFlag);
        }
    }

     同时,非常感谢您的全力帮助。

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

    谢尔谢克、您好!

    仅供参考:F280015x 的 SDL(软件诊断库)是公开的。 您可以在 C2000Ware 的 libraries/diagnostics/f280015x 下找到它。
    如果还不知道吗?

    我们使用 LCM_runComp1ErrorForceTest() 函数强制执行 LCM 错误,但在生产中,我们不会强制执行错误。

    这符合您的功能安全目标。 如果您了解功能安全术语、那么这实际上是一种诊断测试

    LCM 在后台连续运行、当我们遇到任何 LCM 错误时、将获得 NMI 中断(我们需要清除 LCM 标志、NMI 标志和 GERR 标志)

    如果实际的 LCM 比较错误在运行时发生而不强制错误、那么您通常要进入 NMI ISR 并确保将系统置于安全状态
    根据您的应用、您会希望采取措施将系统置于安全状态、并决定是否继续安全。如果发生 LCM、我们不会在这些问题上向客户提出建议。它是用户系统集成商的责任。

    如果您想继续、清除所有标志(NMI 标志、LCM 错误标志)和 LCM CMP 错误状态并退出 NMI ISR。 如果检查清除此标志可以是 LCM 比较错误状态寄存器而不是 NMI 状态、因为 NMI 状态可在 NMIWD 置位时被清除。

    谢谢