1、概述
嵌入式系统在受到外界的强干扰的时候或程序出现异常后会出现程序跑飞之后无法恢复的情况,看门狗就是为了在这种情况发生之后对系统进行复位。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示MCU已经挂了),便实现处理器的自动复位重启(发送复位信号)。
从实现方式上来看,看门狗分为两种:硬件看门狗和软件看门狗。硬件看门狗就是使用逻辑电路或者专用的看门狗芯片。软件看门狗则相对复杂一点,一般的实现都是通过一个守护任务,定期的查询喂狗动作,一旦喂狗超时,就会触发重启。
2、HAL接口介绍
AliOS Things对于不同底层驱动的wdg操作实现,统一封装成本文所述hal wdg接口。
hal相关头文件位于目录:include/aos/hal。
HaaS1000上hal相关实现位于具体的mcu目录下,如:platform/mcu/haas1000/hal/。
2.1、API列表
hal_wdg_init |
初始化指定看门狗 |
hal_wdg_reload |
重载指定看门狗,喂狗 |
hal_wdg_finalize |
关闭指定看门狗 |
2.2、API详情
2.2.1、相关结数据结构
wdg_dev_t
typedef struct {
uint8_t port; /* wdg port */
wdg_config_t config; /* wdg config */
void *priv; /* priv data */
} wdg_dev_t;
wdg_config_t
typedef struct {
uint32_t timeout; /* Watchdag timeout ms */
} wdg_config_t;
2.2.2、hal_wdg_init
初始化指定看门狗
函数原型
int32_t hal_wdg_init(wdg_dev_t *wdg);
参数
wdg_dev_t *wdg |
入参 |
看门狗设备描述 |
用户自定义一个wdg_dev_t结构体 |
返回值
返回成功或失败, 返回0表示看门狗初始化成功,非0表示失败
调用示例
wdg_dev_t wdg1;
/* wdg port set */
wdg1.port = WDG1_PORT_NUM;
/* set reload time to 1000ms */
wdg1.config.timeout = 1000; /* 1000ms */
ret = hal_wdg_init(&wdg1);
2.2.3、hal_wdg_reload
重载指定看门狗,喂狗
函数原型
void hal_wdg_reload(wdg_dev_t *wdg);
参数
wdg_dev_t *wdg |
入参 |
看门狗设备描述 |
使用hal_wdg_init时传入wdg_dev_t结构体 |
返回值
返回成功或失败, 返回0表示看门狗重载成功,非0表示失败
调用示例
ret = hal_wdg_reload(&wdg1);
2.2.4、hal_wdg_finalize
关闭指定看门狗
函数原型
int32_t hal_wdg_finalize(wdg_dev_t *wdg);
参数
wdg_dev_t *wdg |
入参 |
看门狗设备描述 |
使用hal_wdg_init时传入wdg_dev_t结构体 |
返回值
返回成功或失败, 返回0表示看门狗关闭成功,非0表示失败
调用示例
ret = hal_wdg_finalize(&wdg1);
3、示例介绍
这一节,将学习驱动板载的watchdog如果触发重启的。
3.1、硬件实现
本章用到的硬件电路在开发板上默认是已经连接好了的。这里用到的看门狗芯片是ADM706S。
默认的看门狗超时周期为1.6s, WDI管脚有电平转换就会重置定时器(喂狗成功,否则就会重启主MCU)。
3.2、软件设计
看门狗部分测试代码位于
application/example/edu_demo/mfg_test/watchdog_test.c
驱动代码位于
platform/board/haaseduk1/drivers/watchdog.c
当前代码已经实现了周期性喂狗的操作,发生在触发ticks的时候。
3.2.1、喂狗实现
HaaS EDU K1的喂狗操作发生在ticks打点的时间,文件位于
platform/board/haaseduk1/config/k_config.c
void krhino_tick_hook(void)
{
static unsigned int idx = 0;
if((idx % (RHINO_CONFIG_TICKS_PER_SECOND / 2) ) == 0) {
watchdog_feeddog();
}
idx ++;
}
3.2.2、喂狗操作
void watchdog_feeddog(void)
{
if(watchdog_flag == 1) {
return;
}
if(wdg_gpio.port == 0) {
wdg_gpio.port = HAL_IOMUX_PIN_P4_5;
wdg_gpio.config = OUTPUT_PUSH_PULL;
hal_gpio_init(&wdg_gpio);
}
hal_gpio_output_toggle(&wdg_gpio);
}
3.3、编译与下载
3.3.1、代码准备
打开edu_demo的产测开关
application/example/edu_demo/Config.in
在该文件中修改编译选项,打开EDK_DEMO_FACTORY_TEST_ENABLIE开关。
config EDK_DEMO_FACTORY_TEST_ENABLIE
bool "enable factory test function"
default y
加入Demo到启动代码
application/example/edu_demo/app_entry.c
函数application_start中注释掉menu_init();,添加watchdog_stopfeed();
//menu_init();
watchdog_stopfeed(); //停止喂狗,1.6s触发重启
3.3.2、编译
命令行方式进行编译
aos make distclean
aos make edu_demo@haaseduk1 -c config
aos make
3.3.3、烧录
- 命令行方式
aos upload
- 图形界面方式
详见HaaS EDU K1 快速开始 第4.3.3章节-使用GUI工具烧录部分。
开发者技术支持
如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号
更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/