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 ;
}
}