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.

[参考译文] CC3220SF:看门狗计时器和网络处理器重启

Guru**** 2589245 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/871944/cc3220sf-watchdog-timer-and-network-processor-restart

器件型号:CC3220SF

您好!

我希望定期检查循环、并在循环挂起时重新启动网络处理器。  


是否有可用作参考的看门狗计时器示例?

谢谢、

David

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

    尊敬的 David:

    您可以在 SDK 的 Examples/drivers 文件夹中找到看门狗示例。 如需了解更多详细信息、请参阅 TI 驱动程序 API 文档: http://dev.ti.com/tirex/explore/node?node=AIQLpsWAlAhNbRw7tZeAww__fc2e6sr__LATEST

    TRM 的看门狗部分 包括一个代码片段、详细介绍了建议的看门狗恢复序列。 这包括 NWP 的带外中断。 请注意、您应该在适用的情况下使用非阻塞或超时选项。 建议不要将此中断替换为 sl_Stop (超时)、而只能在看门狗恢复上下文中使用。

    此致、

    Sarah

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

    您好、Sarah、

    下面是主代码。 您能不能告诉我应该在哪里插入代码段( TRM 第335页的第10.4.2节、图10-10):

    谢谢、

    David

    /*
    版权所有(c) 2016、德州仪器(TI)公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    //
    
    /*
    === main_tirtos.c ====
    */
    #include 
    
    /* POSIX 头文件*/
    #include 
    
    /* RTOS 头文件*/
    #include 
    
    /* TI-RTOS 头文件*/
    #include 
    
    /*示例/板头文件*/
    #include "Board.h"
    
    extern void * mainThread (void * arg0);
    
    /*以字节为单位的堆栈大小*/
    #define THREADSTACKSIZE 4096
    
    /*
    === main ====
    */
    int main (void)
    {
    pthread_t 线程;
    pthread_attr_t pAttrs;
    struct sched_param primParam;
    int retc;
    int detachState;
    
    /*呼叫板初始化函数*/
    Board_initGeneral();
    
    /*设置优先级和堆栈大小属性*/
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 1;
    
    detachState = pthread_create_detached;
    retc = pthread_attr_setdetachstate (&pAttrs、detachState);
    if (retc!= 0)
    {
    /* pthread_attr_setdetachstate()失败*/
    while (1)
    {
    ;
    }
    }
    
    pthread_attr_setschedparam (&pAttrs、&priParam);
    
    retc |= pthread_attr_setstacksize (&pAttrs、THREADSTACKSIZE);
    if (retc!= 0)
    {
    /* pthread_attr_setstacksize()失败*/
    while (1)
    {
    ;
    }
    }
    
    retc = pthread_create (&thread、&pAttrs、mainThread、NULL);
    if (retc!= 0)
    {
    /* pthread_create()失败*/
    while (1)
    {
    ;
    }
    }
    
    BIOS_start();
    
    返回(0);
    }/*
    
    
    ==== dummyOutput ====
    FreeRTOS
    和 TI-RTOS 解决方案的基准测试和尺寸比较*所需的虚拟 SysMin 输出函数。
    */
    void dummyOutput (void)
    {
    }
    

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

    尊敬的 David:

    粘贴了 main_tirtos.c 的代码 看门狗应用程序的大部分内容位于 drivers/watchdog/swatchdog.c 中 您可以在看门狗回调中使用该片段。

    此致、

    Sarah

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

    您好、Sarah、

    明白了。 在 if (!flag){Watchdog_clear (watchdogHandle);}语句之后插入片段是否正确?

    谢谢、

    David

    void watchdogCallback (uintptr_t 未使用)
    {
    GPIO_TOGGLE (Board_GPIO_LED0);
    
    如果(!flag){
    Watchdog_clear (watchdogHandle);
    } 

    //是否应该在此处插入图10-10中的片段?

     

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

    尊敬的 David:

    如果您使用的是看门狗回调、则无需检查看门狗标志。 否则、是的、代码段可以到达那里。

    此致、

    Sarah

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

    您好、Sarah、

    您能帮您了解为什么我不需要检查该标志吗? 我在回调中使用了以下代码、代码段位于"else"部分。

    void watchdogCallback (uintptr_t 未使用)
    {
    无符号超长整数年期;
    //GPIO_TOGGLE (Board_GPIO_LED0);
    
    if (!watchdog_FLAG){
    Watchdog_clear (watchdogHandle);
    }
    其他
    {
    //获取复位原因
    ulResetCas= PRCMSysResetCauseGet ();
    
    //如果复位原因是从 WDOG 触发器恢复
    IF (ulResetCASE= PRCM_WDT_RESET)
    {
    // MCU 中断 NWP (这是带外中断)
    //这会强制 NWP 进入空闲状态
    HWREG (0x400F70B8)= 0x1;
    UtilsDelay (800000/5);
    
    //清除中断
    HWREG (0x400F70B0)= 0x1;
    UtilsDelay (800000/5);
    
    //重置 NWP、WLAN 域
    HWREG (0x440E16C)|= 0x2;
    UtilsDelay (800);
    
    //确保以前将 ANA DCDC 移至 PFM 模式
    //调用休眠
    HWREG (0x4402F024)&= 0xF7FFFFFF;
    
    //选择唤醒源作为内部计时器
    PRCMHibernateWakeupSourceEnable (PRCM_HIB_SLOW_CLK_CTR);
    
    //设置休眠周期并进入休眠模式
    PRCMHibernateIntervalSet (330*3);
    PRCMHibernateEnter();
    }
    }
    

    谢谢、

    David

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

    尊敬的 David:

    您已经输入了看门狗回调、这意味着已触发看门狗。 检查这里的看门狗标志还会告诉您什么? 除非您在应用中跟踪自己的看门狗计数器?

    此致、

    Sarah

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

    您好、Sarah、

    我认为检查标志(根据看门狗示例)的目的是防止器件复位。 以下是示例 html 的摘录:

    • 应用程序为看门狗模块提供一个回调函数、该函数在每个看门狗计时器超时(在看门狗中断上下文中)时执行。 回调会重复清除看门狗计时器,从而防止器件复位并切换 Board_GPIO_LED0

    •  Board_GPIO_BUTTON0 按下后 mainThread 、会清除 flag 回调所使用的。 回调会看到该标志并停止调用 Watchdog_clear()

    •  mainThread 执行以下操作:确定是否已按下 Board_GPIO_BUTTON0。 如果是、清除复位标志;允许看门狗计时器在下一次中断时复位器件。

    如果我误解了检查标志的含义、您能告诉我吗?

    谢谢。

    David