您好!
我希望定期检查循环、并在循环挂起时重新启动网络处理器。
是否有可用作参考的看门狗计时器示例?
谢谢、
David
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.
您好!
我希望定期检查循环、并在循环挂起时重新启动网络处理器。
是否有可用作参考的看门狗计时器示例?
谢谢、
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) { }
您好、Sarah、
明白了。 在 if (!flag){Watchdog_clear (watchdogHandle);}语句之后插入片段是否正确?
谢谢、
David
void watchdogCallback (uintptr_t 未使用) { GPIO_TOGGLE (Board_GPIO_LED0); 如果(!flag){ Watchdog_clear (watchdogHandle); }
//是否应该在此处插入图10-10中的片段?
}
您好、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
您好、Sarah、
我认为检查标志(根据看门狗示例)的目的是防止器件复位。 以下是示例 html 的摘录:
应用程序为看门狗模块提供一个回调函数、该函数在每个看门狗计时器超时(在看门狗中断上下文中)时执行。 回调会重复清除看门狗计时器,从而防止器件复位并切换 Board_GPIO_LED0。
Board_GPIO_BUTTON0 按下后 mainThread 、会清除 flag 回调所使用的。 回调会看到该标志并停止调用 Watchdog_clear()。
mainThread 执行以下操作:确定是否已按下 Board_GPIO_BUTTON0。 如果是、清除复位标志;允许看门狗计时器在下一次中断时复位器件。
如果我误解了检查标志的含义、您能告诉我吗?
谢谢。
David