LISA WDT 中断模式示例
源码位置: samples/drivers/devices/lisa_wdt/interrupt 查看源码
功能说明
演示如何使用 LISA WDT 驱动的中断模式,通过超时回调函数处理看门狗超时事件。
底层采用两阶段超时机制:中断阶段超时(int_timeout_ms)触发回调,复位阶段超时(rst_timeout_ms)后系统复位。应用层可在回调中执行恢复操作或重新喂狗,避免系统复位。
新特性
中断通知机制:超时通过中断回调通知应用层,而非直接复位
灵活的恢复策略:回调中可执行数据保存、状态恢复或重新喂狗等操作
两阶段超时保护:中断阶段提供恢复机会,复位阶段作为最后保护
适合关键任务场景:可在超时回调中执行关键操作,提高系统可靠性
硬件连接
无需外部连接,WDT 为芯片内部外设。
使用场景
适用于需要在看门狗超时前执行恢复操作的场景,如保存关键数据、记录错误日志、执行故障恢复等。通过中断回调机制,在系统复位前提供处理窗口。
示例步骤
获取 WDT 设备
配置看门狗参数(中断超时 1000ms,复位超时 500ms)
设置超时回调函数
启动看门狗
在主循环中前 5 次正常喂狗(每 800ms)
停止喂狗,等待超时中断触发
超时后通过回调函数处理(打印信息,后续会触发复位)
编译
重要提示:在编译前,请先确认您使用的开发板型号。SDK 目前支持以下开发板:
arcs_evb - ARCS EVB 评估板
arcs_mini - ARCS Mini 开发板
根据您的开发板型号,选择对应的编译命令:
在示例目录下执行编译:
# 使用 arcs_evb 开发板
./build.sh -C -DBOARD=arcs_evb
# 或使用 arcs_mini 开发板
./build.sh -C -DBOARD=arcs_mini
Note
如果在 SDK 根目录执行,需要指定示例路径:
# 使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb
# 或使用 arcs_mini 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_mini
Note
确保已安装对应的工具链。
烧录
编译完成后,使用 SDK tools 目录下的 cskburn 工具烧录固件:
./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x0 build/arcs.bin -C arcs
Note
烧录参数说明:
-s /dev/ttyUSB0:串口设备路径,需要根据实际情况修改 - Linux 系统:通常是/dev/ttyUSB0或/dev/ttyACM0- 可通过ls /dev/tty*命令查看可用串口设备 - 不同开发板或 USB 转串口芯片可能使用不同的设备名-b 3000000:烧录波特率(3Mbps)0x0:烧录起始地址build/arcs.bin:编译生成的固件路径-C arcs:芯片类型
注意事项:
确保开发板已正确连接到电脑
如果无法识别串口设备,请检查 USB 连接线是否正常,或尝试其他 USB 端口
预期输出
终端输出:
=== LISA WDT interrupt example ===
wdt0 device ready
WDT configured: int_timeout=1000 ms, rst_timeout=500 ms (total=1500 ms)
WDT timeout callback registered
WDT started
WDT state: RUNNING
Feeding WDT every 800 ms for 5 times, then stop to trigger timeout
WDT fed (1/5)
WDT fed (2/5)
WDT fed (3/5)
WDT fed (4/5)
WDT fed (5/5)
Stopped feeding WDT, waiting for timeout interrupt (should occur after 1000 ms)...
(等待约 1 秒后)
WDT callback triggered - Resetting
(再等待约 0.5 秒后系统复位)
核心 API
API |
说明 |
|---|---|
|
获取 WDT 设备 |
|
配置看门狗超时参数 |
|
设置超时回调函数 |
|
启动看门狗 |
|
查询看门狗状态 |
|
喂狗(刷新看门狗计数器) |
中断模式说明
看门狗中断模式的工作原理:
两阶段超时机制:
中断阶段:连续
int_timeout_ms(1000ms)未喂狗,触发中断并调用回调函数复位阶段:从中断触发后开始,再经过
rst_timeout_ms(500ms)仍未处理,系统自动复位
回调触发时机:中断阶段超时时立即在中断上下文中调用回调函数
恢复机会:回调函数中可执行数据保存、状态恢复或重新喂狗,避免系统复位
总复位时间:
int_timeout_ms + rst_timeout_ms = 1500ms
关键代码
/* 配置看门狗:中断超时 1s,复位超时 0.5s */
lisa_wdt_config_t config = {
.int_timeout_ms = 1000, /* 中断超时时间 1s */
.rst_timeout_ms = 500, /* 复位超时时间 0.5s */
};
lisa_wdt_setup(wdt_dev, &config);
/* 设置超时回调函数 */
lisa_wdt_set_callback(wdt_dev, wdt_timeout_callback, NULL);
/* 启动看门狗 */
lisa_wdt_start(wdt_dev);
/* 定期喂狗 */
lisa_wdt_feed(wdt_dev);
配置说明
超时参数配置
int_timeout_ms:中断超时时间(1000ms),超时后触发中断回调rst_timeout_ms:复位超时时间(500ms),从中断触发后开始计算总复位时间:
int_timeout_ms + rst_timeout_ms = 1500ms
回调函数实现
void wdt_timeout_callback(void *user_data)
{
/* 注意:此函数在中断上下文中执行 */
printf("WDT callback triggered - Resetting\n");
/* 可在此执行:数据保存、错误记录、重新喂狗等操作 */
}
注意事项
中断上下文限制:回调函数在中断上下文中执行,应尽量简短快速,避免执行耗时操作或阻塞操作
喂狗频率:正常运行时,喂狗间隔应小于中断超时时间(1000ms),示例中使用 800ms 确保安全
恢复策略:在超时回调中可以重新喂狗以继续运行,也可以执行关键操作后允许复位
复位时间窗口:中断触发后有
rst_timeout_ms(500ms)的处理窗口,需在此时间内完成关键操作并发控制:如果回调中重新喂狗,应确保喂狗操作正确完成,避免重复触发中断