WatchDog

简要说明

WatchDog(看门狗)本质上时一个定时器,这个定时器可用来监控程序的运行。看门狗可以设置一个预定的时间,在指定时间内若未对定时器进行喂狗操作将会导致系统复位。程序设计时通过在程序的关键点预埋喂狗动作,当程序由于某种原因(软件或硬件故障)未按指定的逻辑运行时可复位系统,保证系统的可用性。

接口描述

csi_wdt_initialize

wdt_handle_t csi_wdt_initialize(int32_t idx, wdt_event_cb_t cb_event)
  • 功能描述:

    • 通过索引号初始化对应的wdt实例,返回wdt实例的句柄 。
  • 参数:

    • idx: 设备号。
    • cb_event:
    • wdt实例的事件回调函数(一般在中断上下文执行)。回调函数原型定义 wdt_event_cb_t。
    • 回调函数类型wdt_event_cb_t定义如下:

      typedef void (*wdt_event_cb_t)(int32_t idx, wdt_event_e event);
      

    ​ 其中idx为设备号,event 为传给回调函数的事件类型。

    ​ wdt回调事件枚举类型见wdt_event_e 定义。

  • 返回值:

wdt_event_e:

名字 定义 备注
WDT_EVENT_TIMEOUT 中断触发事件

csi_wdt_uninitialize

int32_t csi_wdt_uninitialize(wdt_handle_t handle)
  • 功能描述:

    • wdt实例反初始化。该接口会停止wdt实例正在进行的工作(如果有),并且释放相关的软硬件资源。
  • 参数:

    • handle: 实例句柄。
  • 返回值:

    • 错误码。

csi_wdt_power_control

int32_t csi_wdt_power_control(wdt_handle_t handle, csi_power_stat_e state)
  • 功能描述:

    • 配置iic 实例的功耗模式。
  • 参数:

    • handle: 实例句柄。
    • state: wdt的功耗模式,参看
    • csi_power_stat_e \<csi_power_stat_e\ * 的定义。
  • 返回值:

    • 错误码。

csi_wdt_set_timeout

int32_t csi_wdt_set_timeout(wdt_handle_t handle, uint32_t value)
  • 功能描述:

    • wdt超时设置。
  • 参数:

    • handle: 实例句柄。
    • value: wdt超时时间,单位是毫秒。
  • 返回值:

    • 错误码。

csi_wdt_start

int32_t csi_wdt_start(wdt_handle_t handle)
  • 功能描述:

    • wdt计时启动。
  • 参数:

    • handle: 实例句柄。
  • 返回值:

    • 错误码。

csi_wdt_stop

int32_t csi_wdt_stop(wdt_handle_t handle)
  • 功能描述:

    • wdt计时停止。
  • 参数:

    • handle: 实例句柄。
  • 返回值:

    • 错误码。

csi_wdt_restart

int32_t csi_wdt_restart(wdt_handle_t handle)
  • 功能描述:

    • wdt计时重启。
  • 参数:

    • handle: 实例句柄。
  • 返回值:

    • 错误码。

csi_wdt_read_current_value

int32_t csi_wdt_read_current_value(wdt_handle_t handle, uint32_t *value)
  • 功能描述:

    • 获得当前wdt计时值。
  • 参数:

    • handle: 实例句柄。
    • value: 用于返回当前计时值。
  • 返回值:

    • 错误码。

示例

WDT示例1

#define WDT_TIMEOUT 10000
static wdt_handle_t wdt_handle;

static void wdt_event_cb_fun(int32_t idx, wdt_event_e event)
{
    //do your job here according to event
}

void example_main(void)
{
    int32_t ret;

    wdt_handle = csi_wdt_initialize(0, wdt_event_cb_fun);

    if (wdt_handle == NULL) {
        printf("csi_wdt_initialize error\n");
        return;
    }

    ret = csi_wdt_set_timeout(wdt_handle, WDT_TIMEOUT);

    if (ret < 0) {
        printf("csi_wdt_set_timeout error\n");
        return ;
    }
    ret = csi_wdt_start(wdt_handle);

    if (ret < 0) {
        return;
    }

    int i;
    // feedog use restart function
    for (i = 0; i < 10; i++) {
        mdelay(WDT_TIMEOUT - 10);
        ret = csi_wdt_restart(wdt_handle);

        if (ret < 0) {
            return ;
        }
    }

    uint32_t value;
    csi_wdt_read_current_value(wdt_handle, &value);

    ret = csi_wdt_stop(wdt_handle);

    if (ret < 0) {
        printf("csi_wdt_stop error\n");
        return ;
    }

    ret = csi_wdt_uninitialize(wdt_handle);

    if (ret < 0) {
        printf("csi_wdt_uninitialize error\n");
        return ;
    }
}

results matching ""

    No results matching ""