Q群:
电话:
邮箱:
地址:
本开发指南给用户提供了Watchdog的基本配置,工程构建编译、操作API介绍以及使用示例展示。
以STM32为例,如果在提供的oneos源码中已经有适合的工程DEMO工程,则可以直接使用;如果没有请参照快速上手中的操作指南,新建一个适合的工程。
(Top) → Drivers→ WDG
[*] Using watchdog drivers
3.Esc键退出menuconfig,注意保存所修改的设置。
在上一步打开的OneOS-Cube 工具命令行中输入 scons --ide=mdk5重新构建keil工程;
打开对应的 oneos\projects\xxxxx(project文件夹) 目录下的 project.uvprojx 工程文件,此时即可在工程中添加相应的应用程序。
在打开的工程application 文件夹中右键选择Manage Project Items,按下图所示添加自己编写的或所提供的wdt_test.c文件(路径:oneos\demos\drivers\);
编译并下载工程,运行程序;
打开串口工具如xshell等,通信成功后,输入wdt_test命令,即可观察到代码在喂狗一段时间后停止喂狗会产生的复位现象。
如不再使用Watchdog设备,可再次使用OneOS-Cube工具取消,在Drivers-> WDG 下取消Using watchdog drivers选项的选择,保存设置后重新生成工程即可。
应用程序通过系统提供的IO设备模型接口来访问Watchdog设备,接口如下:
函数 | 说明 |
---|---|
os_device_find | 根据Watchdog设备名称查找设备指针 |
os_device_open | 打开Watchdog设备 |
os_device_control | 控制Watchdog设备 |
os_device_close | 关闭Watchdog设备 |
该函数用于查找系统中已经注册的Watchdog设备,函数原型如下:
os_device_t *os_device_find(const char *name);
参数 | 说明 |
---|---|
name | Watchdog设备名称 |
返回 | 说明 |
设备指针 | 名为name的设备指针 |
OS_NULL | 没有找到设备 |
打开Watchdog设备,函数原型如下:
os_err_t os_device_open(os_device_t *dev)
参数 | 说明 |
---|---|
dev | 设备指针 |
返回值 | 说明 |
OS_EOK | 设备打开成功 |
其他错误码 | 设备打开失败 |
该函数发送控制命令以控制Watchdog设备,函数原型如下:
os_err_t os_device_control(os_device_t *dev, int cmd, void *arg)
参数 | 说明 |
---|---|
dev | 设备指针 |
cmd | 控制命令 |
arg | 可变参数 |
返回值 | 说明 |
OS_EOK | 函数执行成功 |
OS_ENOSYS | 函数执行失败,dev为空 |
其他错误码 | 函数执行失败 |
cmd控制命令取值如下
#define OS_DEVICE_CTRL_WDT_GET_TIMEOUT (1) /* 获取溢出时间(秒) */
#define OS_DEVICE_CTRL_WDT_SET_TIMEOUT (2) /* 设置溢出时间(秒) */
#define OS_DEVICE_CTRL_WDT_GET_TIMELEFT (3) /* 获取剩余时间(秒) */
#define OS_DEVICE_CTRL_WDT_KEEPALIVE (4) /* 喂狗 */
#define OS_DEVICE_CTRL_WDT_START (5) /* 开启 */
#define OS_DEVICE_CTRL_WDT_STOP (6) /* 关闭 */
该函数用于关闭Watchdog设备,需要同os_device_open配对使用,函数原型如下:
os_err_t os_device_close(os_device_t *dev)
参数 | 说明 |
---|---|
dev | 设备指针 |
返回值 | 说明 |
OS_EOK | 设备关闭成功 |
其他错误码 | 设备关闭失败 |
#include <os_task.h>
#include <device.h>
#include <os_errno.h>
#include <watchdog/watchdog.h>
#include <string.h>
#include <shell.h>
#define WDT_DEVICE_NAME "iwdg1"
static int wdg_test(int argc, char *argv[])
{
os_err_t ret = OS_EOK;
os_uint32_t timeout = 10;
char device_name[OS_NAME_MAX];
int count = 0;
os_device_t *wdg_dev;
if (argc == 2)
{
strncpy(device_name, argv[1], OS_NAME_MAX);
}
else
{
strncpy(device_name, WDT_DEVICE_NAME, OS_NAME_MAX);
}
wdg_dev = os_device_find(device_name);
if (!wdg_dev)
{
os_kprintf("find %s failed!\r\n", device_name);
return OS_ERROR;
}
ret = os_device_open(wdg_dev);
if (ret != OS_EOK)
{
os_kprintf("initialize %s failed!\r\n", device_name);
return OS_ERROR;
}
ret = os_device_control(wdg_dev, OS_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
if (ret != OS_EOK)
{
os_kprintf("%s not support set timeout!\r\n", device_name);
}
ret = os_device_control(wdg_dev, OS_DEVICE_CTRL_WDT_START, OS_NULL);
if (ret != OS_EOK)
{
os_kprintf("start %s failed!\r\n", device_name);
return OS_ERROR;
}
os_device_control(wdg_dev, OS_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
while (count < 11)
{
os_task_msleep(1000);
count++;
os_kprintf("watch dog keep alive for :%ds\r\n", count);
os_device_control(wdg_dev, OS_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
}
count = 0;
os_kprintf("\r\n");
while (1)
{
os_kprintf("watch dog stop feed for :%d.%ds\r\n", count / 10, count % 10);
os_task_msleep(100);
count++;
}
}
SH_CMD_EXPORT(wdg_test, wdg_test, "test Independent watchdog!");
运行结果如下:
sh>wdt_test
watch dog keep alive for :1s
watch dog keep alive for :2s
watch dog keep alive for :3s
watch dog keep alive for :4s
watch dog keep alive for :5s
watch dog keep alive for :6s
watch dog keep alive for :7s
watch dog keep alive for :8s
watch dog keep alive for :9s
watch dog keep alive for :10s
watch dog keep alive for :11s
watch dog stop feed for :0.0s
watch dog stop feed for :0.1s
watch dog stop feed for :0.2s
watch dog stop feed for :0.3s
watch dog stop feed for :0.4s
.... ...
watch dog stop feed for :10.0s