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.

[参考译文] RTOS/CC2650:看门狗不能正常工作

Guru**** 2576215 points
Other Parts Discussed in Thread: SYSBIOS, CC1350

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/590155/rtos-cc2650-watchdog-not-working-properly

器件型号:CC2650

工具/软件:TI-RTOS

您好!

您好!

 我是看门狗功能、它以某种奇怪的方式工作、但我的问题是、我将看门狗周期设置为大约30秒。 在第一个周期之后、它启动、然后使自身能够发现、但在下一个周期、当它获得看门狗时、它不会被发现  (此时绿色指示灯也不闪烁)。第三个周期后,指示灯再次重新启动并使其能够发现。 在第四个周期、它显示的行为与第二个周期相同。我不知道如何解决此问题。我使用的是 ble_sdk_2_02_01_18、编译器是 TI V 5.2.9。 我要附加的代码的小快照:  

#define Watchdog_count 1.
#define WATCHDOG_TIMEOUT_MS 12000/1800000 // 1800000/1000= 1800/60=30分钟  

我现在使用的是30分钟看门狗计时器。 因此、它在30分钟后会被重置、但直到接下来的30分钟才会显示。请帮助我解决我在这里遇到的问题。

/*********

@文件 main.c

@简要介绍 BLE SensorTag 示例应用的主要入门知识。

组:WCS、BTS
目标器件: CC2650、 CC2640、 CC1350

秘书长的报告

版权所有(c) 2014-2016、德州仪器(TI)公司
保留所有权利。

以源代码和二进制形式重新分发和使用、有无
允许进行修改、前提是满足以下条件
符合:

*源代码的重新分发必须保留上述版权
声明、此条件列表和以下免责声明。

*二进制形式的再发行必须复制上述版权
注意、本条件列表和中的以下免责声明
分发时提供的文档和/或其他材料。

*德州仪器公司的名称和名称均不相同
其贡献者可用于认可或推广衍生产品
未经特定的事先书面许可。

本软件由版权所有者和贡献者"按原样"提供
以及任何明示或暗示的保证、包括但不限于
对特定适销性和适用性的隐含保证
不承认目的。 在任何情况下、版权所有者不得或
任何直接、间接、偶然、特殊、
惩罚性或后果性损害(包括但不限于
采购替代货物或服务;丧失使用、数据或利润;
或业务中断)、无论原因是什么以及任何责任理论、
无论是合同、严格责任还是侵权行为(包括疏忽或)
否则)因使用本软件而以任何方式产生、
即使被告知可能会发生此类损坏。

秘书长的报告
版本名称:BLE_SDK_2_02_01_18
发布日期:2016年10月26日15:20:04
(小部分 /

// TI RTOS
#include <ti/sysbios/BIOS.h>
#include
#include
#include
#include
// BLE
#include "bcomdef.h"

//应用
#include "sensortag.h"
#include "sensortag_tmp.h"
#include "sensortag_hum.h"
#include "sensortag_bar.h"

#ifndef USE_DEFAULT_USER_CFG

#include "Ble_user_config.h"

// BLE 用户定义的配置
bleUserCfg_t user0Cfg = BLE_USER_CFG;

#endif // USE_DEFAULT_USER_CFG

/*********
*宏
*
#define Watchdog_count 1.
#define WATCHDOG_TIMEOUT_MS 12000/1800000 // 1800000/1000= 1800/60=30分钟
/*********
*常量
*

/*********
* typedef
*

/*********
*局部变量
*

/*********
*全局变量
*

#ifdef CC1350_LAUNCHXL
#ifdef power_saving
//用于唤醒回调的电源通知对象
Power_NotifyObj rFSwitchPowerNotifyObj;
静态 uint8_t rFSwitchNotifyCb (uint8_t 事件类型、uint32_t *事件变量、
uint32_t * clientArg);
#endif //power_saving

PIN_STATE radCtrlState;
PIN_Config radCtrlCfg[]=  

Board_DIO1_RFSW | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、/*射频 SW 开关默认为2.4GHz 路径*/
Board_DIO30_SWPWR | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、/*射频开关电源*
PIN_TERMINATE
};
PIN_Handle radCtrlHandle;
#endif //CC1350_LAUNCHXL

/*********
* extern
*

extern void AssertHandler (uint8 assertCasuse、uint8 assertSubcause);
extern uint32_t WatchdogCC26XX_convertMsToTicks (uint32_t 毫秒);
void watchdog_initlize (void);
/*********
*本地
*
/*********
*@fn Main
*
*@简要应用程序主页
*
*输入参数
*
*@param 无。
*
*输出参数
*
*@param 无。
*
*@返回无。
*
int main()

/*注册应用程序回调到堆栈中发出的 TRAP 断言*/
RegisterAssertCback (AssertHandler);

PIN_init (BoardGpioInitTable);

#ifdef CC1350_LAUNCHXL
//启用2.4GHz 无线电
radCtrlHandle = PIN_OPEN (&radCtrlState、radCtrlCfg);

#ifdef power_saving
power_registerNotify (&rFSwitchPowerNotifyObj、  
PowerCC26XX_entering_standby | PowerCC26XX_awarK_STANDBY、
(POWER_NotifyFxn) rFSwitchNotifyCb、NULL);
#endif //power_saving  
#endif //CC1350_LAUNCHXL

#ifndef power_saving
/*设置待机和空闲模式的约束*/
power_setConstraint (PowerCC26XX_SB_disallow);
power_setConstraint (PowerCC26XX_IDLE_PD_Disallow);
#endif // power_saving

/*初始化 iCall 模块*/
iCall_init();

/*启动外部映像的任务-优先级5 */
iCall_createRemoteTasks();

/*启动配置文件-优先级3 */
GAPRole_createTask();

/*启动应用程序-优先级1 */
SensorTag_createTask();
SensorTagTmp_createTask();
SensorTagHum_createTask();
SensorTagBar_createTask();
/*启动应用程序安全装置*/
Watchdog_initlize();

BIOS_start();//启用中断并启动 SYS/BIOS */

返回0;


/*********
*@fn AssertHandler
*
*@简述这是应用程序用于发出断言的回调处理程序
堆栈中。 当在堆栈中定义 EXT_HAL_ASSERT 时
*项目在提出断言时将调用此函数、  
*并可用于观察或从预期中陷阱违规  
*行为。  
*  
*例如、对于堆分配失败、堆栈将升高  
* HAL_ASSERT_CAUSE_OUT_ORT_MEMORY 作为 assertC句 和  
* HAL_ASSERT_SUBCAUSE_NONE 作为 assertSubcause。 一个应用
*开发人员可以通过调用在栈上捕获任何 malloc 失败
匹配情况下的* HAL_ASSERT_SPINLOCK。
*
*建议应用程序开发人员扩展此功能
*供其自己的应用程序使用。 为此、添加 hal_dassert.c
*到您的项目工作区、hal_assert.h 的路径(这可以  
*位于堆栈侧)。 通过包含来产生断言
* hal_assert.h 并使用宏 HAL_ASSERT (CAUST)来提出  
*用自变量 assertCus. 可能是 assertSubcause
*可在之前由宏 HAL_ASSERT_SET_SUBCAUSE (SUBAUSE)进行选择设置
*以确认其描述的原因。 更多信息是
*在 hal_dassert.h 中可用
*
*输入参数
*
*@param assertCusal -按照 hal_dassert.h 中定义的断言原因
*@param assertSubcause -可选断言子 cause (请参阅 hal_dassert.h)。
*
*输出参数
*
*@param 无。
*
*@返回无。
*
空 AssertHandler (uint8 assertCasuse、uint8 assertSubcause)

//检查断言原因
开关(砂锅)

默认值:
HAL_ASSERT_SPINLOCK;

返回;


/*********
*@fn smallErrorHook
*
*@要连接 到 TI-RTOS的简短错误处理程序。
*
*输入参数
*
*@param EB -指向错误块的指针。
*
*输出参数
*
*@param 无。
*
*@返回无。
*
空 smallErrorHook (Error_Block *EB)

适用于(;);

#IF 已定义(CC1350_LAUNCHXL)&&已定义(POWER_SAVing)
/*********
*@fn rFSwitchNotifyCb
*
*@简短的电源驱动器回调、以切换射频开关开启电源状态
*转换。
*
*输入参数
*
*@param eventType -状态变化。
*@param eventArg -未使用。
*@param clientArg -未使用。
*
*@返回 Power_NOTIFYDONE 以指示成功。
*
静态 uint8_t rFSwitchNotifyCb (uint8_t 事件类型、uint32_t *事件变量、
uint32_t *客户关系)

if (eventType = PowerCC26XX_entering_standby)

//关闭射频开关
PIN_setOutputValue (radCtrlHandle、Board_DIO30_SWPWR、0);

否则、如果(eventType = PowerCC26XX_AK_STANDBY)

//为射频开关加电
PIN_setOutputValue (radCtrlHandle、Board_DIO30_SWPWR、1);


//已成功处理通知
返回 Power_NOTIFYDONE;

#endif //CC1350_LAUNCHXL||节能


/*********
*@fn watchdog_init()
*
*@简单实现看门狗功能。
*
*
*输入参数
*
*@param 无。
*
*@返回 void。
*

空安全装置回调(UARg a0){

while (1);//在此处停止以检查是否正在调用回调

/*********
*@fn watchdog_init()
*
*@简单实现看门狗功能。
*
*
*输入参数
*
*@param 无。
*
*@返回 void。
*

void watchdog_initlize (void)

Watchdog_handle;
Watchdog_init();
Watchdog_Params 参数;
Watchdog_Params_init (params);
params.callbackFxn =安全装置回调;
params.resetMode = Watchdog_reset_on;
params.debugStallMode = Watchdog_debug_star_on;
观察子句柄= Watchdog_open (0、&params);
Watchdog_setReload (watchdogHandle、WatchdogCC26XX_convertMsToTicks (watchdog_timeout_MS));

/*避免待机以使看门狗保持运行*/
power_setConstraint (PowerCC26XX_SB_disallow);

/*********
*

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

    您好!

    在复位器件之前、看门狗回调会进入两次回调。
    当它第一次进入回调时、您进入 while 循环、从不退出。 Hwi 锁定所有任务(因此、您的应用程序不响应)。
    当看门狗计时器第二次到期时、您的器件将复位。 这将使您的设备恢复到正常状态。

    只需确认我所说的内容、请尝试以下操作:

    1. 注释掉代码中对 Watchdog_clear()的任何调用。  
    2. 在看门狗回调函数中注释掉 while 循环。

    您应该会看到系统永远不会停止、并且器件将在60秒后复位。 如果您想在30秒后重置设备、则应将看门狗超时设置为15秒。

    查看此主题、了解有关回调函数中应执行的操作的信息:

    此致、

    米歇尔

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

    您好 、Michel Solecki、

    正如您所说、我做了这个部分、但我仍然看到同样的行为。 器件 在一个周期内停止、在第二个周期内复位。我也必须对中断服务例程执行任何操作吗??

    您所了解的所有人员及时提供帮助将会非常出色。

    以下是代码差异:

    /*********
    *@fn watchdog_init()
    *
    *@简单实现看门狗功能。
    *
    *
    *输入参数
    *
    *@param 无。
    *
    *@返回 void。
    *

    空安全装置回调(UARg a0){

    //SysCtrlSystemReset();

    /*********
    *@fn watchdog_init()
    *
    *@简单实现看门狗功能。
    *
    *
    *输入参数
    *
    *@param 无。
    *
    *@返回 void。
    *

    void watchdog_initlize (void)

    Watchdog_init();
    Watchdog_Params 参数;
    Watchdog_Params_init (params);
    params.callbackFxn =安全装置回调;
    params.resetMode = Watchdog_reset_on;
    params.debugStallMode = Watchdog_debug_star_off;
    观察子句柄= Watchdog_open (0、&params);
    Watchdog_setReload (watchdogHandle、WatchdogCC26XX_convertMsToTicks (watchdog_timeout_MS));

    /*避免待机以使看门狗保持运行*/
    power_setConstraint (PowerCC26XX_SB_disallow);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我无法理解为什么设备在第二次重置之前挂起。在第二次重置时工作正常、但这是不可接受的。我的看门狗将在半小时后重置设备。但这个问题使设备在半小时内处于活动状态、在下半小时内处于活动状态 比如死区状态或一些不可恢复的挂起阶段。

    当我尝试使用时钟对象进行系统复位时、器件会得到完美复位、并且一直工作正常。

    时钟对象的小代码集::


    //执行周期性事件的频率(以毫秒为单位)
    #define RESET_PERIOD_EVT_PERIOD RESET_Period_Two_Hour

    // RTOS 应用程序的内部事件
    #define RESET_STATE_CHANGE_EVT 0x0001
    #define RESET_CHAR_CHANGE_EVT 0x0002
    #define RESET_RECEIVE_EVT 0x0004
    #define RESET_CONN_EVT_END_EVT 0x0008

    /*********
    *@fn RESET_clockHandler
    *
    *@用于时钟超时的简短处理函数。
    *
    *@param arg -事件类型
    *
    *@返回无。
    *
    静态空 Reset_clockHandler (UARg 参数)

    SysCtrlSystemReset();




    //启动时钟对象
    //为内部周期事件创建一次性时钟。
    Util_constructClock (ResetClock、Reset_clockHandler、RESET_PERIOD_EVT_PERIOD、0、TRUE、RESET_PERIOD_EVT);



    请告知在看门狗装置中应该做什么、这让我疯了。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    调试时、我看到它锁定在以下函数:

    /*
    *==== Hwi_exHandler ===
    *
    void Hwi_exHandler (UINT * exstack、UINT LR)

    Hwi_module->exACTIVe[0]= true;

    /*如果没有插入异常处理程序,请在此处旋转*/
    while (Hwi_excHandlerFunc = NULL){



    Hwi_exHandlerFunc (exstack、LR);


    直到下一次回调重置设备时、才会在这里旋转。一些帮助将会很好。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您似乎遇到了我遇到的确切问题、您的解决方法应该与 Janet 在这里所解释的完全相同:
    e2e.ti.com/.../532111

    您是否还没有尝试过她描述的 WatchdogCC26XX.c 文件的补丁?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我已经这么做了、但我仍然看到同样的行为
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您似乎遇到了某种例外情况。

    您能否检查 ROV (CCS 中的工具菜单下)并检查 任务和 BIOS 部分、以查看是否有任何相关信息可供我们使用^

    您还可以检查可能显示错误发生位置的调用栈。

    此致、

    米歇尔

    编辑:您能否告诉我们您在项目中使用的 TI-RTOS 版本?

    ROV 链接:  

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、那么、 代码在"未插入异常处理程序"占位符中旋转的原因可能是因为您尚未添加看门狗的异常处理程序-您可以研究我发布的代码、该代码可以正常工作或追溯到最初发布的代码 由 TI 自己的"供应商"提供:

    e2e.ti.com/.../586176
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、user1408718、
    那么、我应该对看门狗的特殊处理程序执行什么操作、我应该将它添加到哪里。
    最近两天我没有在我的桌面上。抱歉,我的回复太晚了。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michel、
    我正在使用 tirtos_cc13xx_cc26xx_2_20_01_08.I 将在今天之前使用 ROV 部分进行更新。