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.

[参考译文] CC1312R:如何在不等待任务结束的情况下停止/中止任何传感器控制器活动?

Guru**** 2555630 points
Other Parts Discussed in Thread: CC1312R

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1062105/cc1312r-how-to-stop-abort-any-sensor-controller-activity-without-waiting-tasks-to-end

器件型号:CC1312R

您好!

对于我的项目、我需要存储在一个 RAM sоme 的数据段中、该数据段应在 SW 或 WDT 复位后能够保存。 由于 M4 SRAM 由硬件清零、因此不是合适的存储位置、因此我必须使用 AUX_SRAM、因为它看起来不在 RAM 错误检测硬件的覆盖范围内。

为了使所有 AUX_SRAM 都可用于传感器控制器(SC)应用、我不想为这些重置存活数据保留一部分。 因此、我需要在保存数据和执行复位之前停止所有 SC 功能、以避免执行某些 SC 任务来覆盖我的数据。  停止 SC 将在禁用 HWI 的情况下完成、并且在将数据保存到 AUX_SRAM 后、将完成 SW 或 WDT 复位。

问题是如何在不等待其任务结束或类似操作的情况下尽可能快地停止或终止任何 SC 活动?

此致、

Dimitar Devedzhiev

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

    您好、Dimitar、

    我只是想确保我理解正确。

    您有一个使用所有可用 AUX_SRAM 的传感器控制器应用。 但是、如果存在软件或 WDT 复位、您还需要使用 AUX_SRAM 来保存一些关键数据。

    您需要做的是立即停止传感器控制器应用程序、这样您就可以使用 AUX_SRAM、而不会导致其中的数据损坏。 我是对的吗?

    使用终止代码(传感器控制器任务代码)来处理此问题是否足够? 您可能知道、每个传感器控制器任务都具有:

    • 初始化代码:在系统 CPU 应用程序启动任务时运行
    • 执行代码:可由 AON_RTC 或软件定期触发
    • 事件处理程序代码:可由各种外设事件触发
    • 终止代码:在系统 CPU 应用程序停止任务时运行

    当然、根据应用的不同、您需要确保处理终止代码中的所有内容(与 SC 相关)。

    BR、
    安德烈斯

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

    安德烈斯、您好!

    一般而言、当我要覆盖 AUX_SRAM 变量或 SC 代码时、我需要在这之前将其停止、以便在我的卵巢(M4)之后无法写入 AUX_SRAM。

    根据我所展示的内容,scifStopTasksNbl()不会中断传感器控制器上正在进行的代码执行,因此可能必须等待任务执行完成。 因此、我需要快速/突然地停止 SC、从我的角度来看、这种 shoud 不会因为将要进行的重置而受损。

    那么、您能否给出一个如何突然停止 SC 的想法?

    此致、
    Dimitar Devedzhiev

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

    您好、Dimitar、

    我与更熟悉传感器控制器的人进行了核对、您答对了。 主要问题是传感器控制器不能被抢占。 那么、这是一个硬件限制。

    除了让传感器控制器完成代码执行之外、我实际上没有看到任何其他选项。 但是、正如您提到的、在您的情况下、这可能不是一个选项。

    BR、
    安德烈斯

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

    安德烈斯、您好!

    查看 由 Sensor Controller Studio SCIF_framework.c 生成的 scifInit()函数,我看到以下代码:

        // Start the Sensor Controller
        HWREG(AUX_SCE_BASE + AUX_SCE_O_CTL) |= AUX_SCE_CTL_CLK_EN_M;

    这在我的脑海中产生了一个问题:是否可以通过从 AUX_SCE:CTL 中清除此位来停止 SC、而不会以某种方式对整个系统造成危害(导致 M4功能停滞或导致某些内部总线崩溃)?    

    此致、

    Dimitar Devedzhiev

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

    您好、Dimitar、

    我刚刚检查了其中一个传感器控制器示例、当您有终止代码时、您将获得以下 API:

    /** \brief Uninitializes the driver in order to release hardware resources or switch to another driver
      *
      * All Sensor Controller tasks must have been stopped before calling this function, to avoid leaving
      * hardware modules used in an unknown state. Also, any tick generation must have been stopped to avoid
      * leaving handshaking with the tick source in an unknown state.
      *
      * This function will wait until the Sensor Controller is sleeping before shutting it down.
      */
    void scifUninit(void) {
    
        // Wait until the there are no more pending wake-up signals
        while (HWREG(AUX_SCE_BASE + AUX_SCE_O_WUSTAT) & AUX_SCE_WUSTAT_WU_SIGNAL_M);
    
        // Wait until the Sensor Controller is idle (it might still be running, though not for long)
        while (!(HWREG(AUX_SCE_BASE + AUX_SCE_O_CPUSTAT) & AUX_SCE_CPUSTAT_SLEEP_M));
    
        // Stop and reset the Sensor Controller Engine
        HWREG(AUX_SCE_BASE + AUX_SCE_O_CTL) = AUX_SCE_CTL_CLK_EN_M | AUX_SCE_CTL_RESTART_M;
        scifSetSceOpmode(AUX_SYSIF_OPMODEREQ_REQ_A);
        HWREG(AUX_SCE_BASE + AUX_SCE_O_CTL) = AUX_SCE_CTL_CLK_EN_M | AUX_SCE_CTL_SUSPEND_M;
        HWREG(AUX_SCE_BASE + AUX_SCE_O_CTL) = 0x0000;
    
        // Power down the Sensor Controller
        scifSetSceOpmode(AUX_SYSIF_OPMODEREQ_REQ_PDA);
    
        // Disable the Sensor Controller task ALERT event as wake-up source for the MCU domain
        scifSetMcuwusel(OSAL_TASK_ALERT_MCUWUSEL_WU_EV_INDEX, AON_EVENT_MCUWUSEL_WU0_EV_NONE);
    
        // Disable interrupts
        osalDisableCtrlReadyInt();
        osalUnregisterCtrlReadyInt();
        scifOsalDisableTaskAlertInt();
        osalUnregisterTaskAlertInt();
    
        // Perform task resource uninitialization
        scifData.fptrDriverSetupUninit();
    
    } // scifUninit

    您可以在此处看到、该寄存器确实用于停止传感器控制器。 但是、同样还有一些额外的事情发生、可以安全地关闭传感器控制器电源、例如重新启动指令和挂起指令。

    此外、中断执行的主要问题是、它可能会使某些硬件模块处于未知状态、这可能会在稍后导致问题。 我想这一切都取决于您的传感器控制器应用。

    BR、
    安德烈斯

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

    安德烈斯、您好!

    我必须停止 SC 的那一刻,与它的工作异步,甚至与它的初始化更加严重,因此尝试停止它的任务和调用这个 scifUninit()函数将是不正确的。

    您写道:"中断执行的主要问题是、它可能会使某些硬件模块处于未知状态、这可能会在稍后导致问题。"

    在我的情况下、SC 的未来行为(我是指重新开始)不应成为问题、因为在尝试再次使用之前会进行重置。

    最重要的问题是:"它可能会使某些硬件模块处于未知状态、这可能会在稍后导致问题。" 可能会影响 M4 MCU 的工作、对 AUX_SRAM 的访问或其某些内部总线?

    此致、

    Dimitar Devedzhiev

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

    您好、Dimitar、

    老实说,很难分辨这可能有多大问题。

    假设您使用的是 DAC 或 ADC 等。 有一些硬件信标用于跟踪外设(传感器控制器或系统 MCU)的当前所有者。

    当 SC 被中断时、这个信号量被保持在一个未知状态、这样、当它需要使用外设时、会给 MCU 带来问题。 或者、由于所有内容都已重置、因此不会发生任何不良情况。 AUX_SRAM 也是如此。

    我想知道的唯一方法是进行测试。 但请记住、这是您自行承担风险的事情。

    BR、
    安德烈斯

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

    安德烈斯、您好!

    由于我已经编写了 SC 未来行为(我的意思是重新开始)、因此在我的情况下不会出现问题、因为在尝试再次使用之前会进行重置。 主 MCU 在复位前也不会使用任何外设。  

    我认为、SC 突然停止是否会"伤害"主 MCU 和系统总线的问题答案只能由具有 CC1312架构(M4和 SC)设计相关硬件知识的人员给出。 这是一些 TI 的相关人士肯定拥有的知识(其中一位可能会指导编写 scifInit()和 scifUninit()函数的 SW 团队)。 无需进行测试、因为我怀疑在 CC1312R 的设计状态中也未讨论过类似的问题。

    但是、看起来我不会收到这个答案、我将尝试避免 AUX_RAM 覆盖。

    此致、

    Dimitar Devedzhiev

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

    您好、Dimitar、

    很抱歉、我的回答不符合您的预期。

    我的答复是根据传感器控制器的现有文件作出的,其中明确指出,只应在某些条件下对某些寄存器进行写入,否则会导致一些未指明的行为(例如将硬件模块保持在未知状态)。

    在这种情况下、"未知状态"一词涵盖了许多可能的内容、因此我无法为您提供明确的答案、因为即使它可能对您有用、也可能对其他人不有用。 这就是为什么不幸的是、如果做了这件事、就会由您自行承担风险。

    BR、
    安德烈斯