PSoc62™开发板之WDT应用

news2024/10/6 5:58:48

看门狗

看门狗定时器(WDT)是一种硬件定时器,在出现意外固件时自动复位设备执行路径。如果启用了WDT,则必须在固件中定期进行服务,以避免复位。否则,计时器失效并产生一个设备复位。此外,WDT可以用作中断源或在低功耗唤醒源模式。PSoC 6 MCU系列包括一个自由运行WDT和两个多计数器WDT (MCWDT)。WDT是16位的计数器。每个MCWDT有两个16位计数器和一个32位计数器。这样,看门狗系统共有7个计数器——5个16位和2个32位。所有16位计数器都可以产生看门狗设备复位。所有七个计数器都可以在匹配事件上生成中断

在这里插入图片描述

实验目的

WDT看门狗功能演示,模拟程序跑飞的情形(按键中断输入一个crash),看看系统能不能正常复位

组件配置

在RT-Thread Settings里边开启Watchdong Timer选项

在这里插入图片描述

按键中断的控制参考文章,这里需要使用按键来生成一个crash

程序设计

WDT初始化

int init_wdt(void)
{
    rt_err_t ret = RT_EOK;
    rt_uint32_t timeout = 100;

    wdg_dev = rt_device_find(WDT_DEV);
    if (!wdg_dev)
    {
        rt_kprintf("find %s failed!\n", WDT_DEV);
        return RT_ERROR;
    }

     rt_device_init(wdg_dev);

    ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
    if (ret != RT_EOK)
    {
        rt_kprintf("set %s timeout failed!\n", WDT_DEV);
        return RT_ERROR;
    }

    ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
    if (ret != RT_EOK)
    {
        rt_kprintf("start %s failed!\n", WDT_DEV);
        return -RT_ERROR;
    }

    rt_thread_idle_sethook(idle_hook);

    return ret;
}

WDT定期喂狗

static rt_device_t wdg_dev;

static void idle_hook(void)
{
    rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
}

按键GPIO初始化

int main(void)
{
    rt_pin_mode(USER_KEY, PIN_MODE_INPUT_PULLUP);
    rt_pin_attach_irq(USER_KEY, PIN_IRQ_MODE_RISING_FALLING, irq_callback, RT_NULL);
    rt_pin_irq_enable(USER_KEY, PIN_IRQ_ENABLE);
    return 0;
}

编写中断异常,当按键按下时程序会触发空指针写入异常进行崩溃

// write a bug to crash
void irq_callback()
{
    rt_kprintf("To be crashed!\n");

    char *p = NULL;
    *p = 1080;
}

整合程序,这里加入了LED交替亮灭来反馈系统是否处于运行状态

#include <rtthread.h>
#include <rtdevice.h>
#include "drv_gpio.h"

#define WDT_DEV    "wdt"
#define LED_PIN     GET_PIN(0, 1)
#define USER_KEY    GET_PIN(6, 2)

static rt_device_t wdg_dev;

static void idle_hook(void)
{
    rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
}

int init_wdt(void)
{
    rt_err_t ret = RT_EOK;
    rt_uint32_t timeout = 100;

    wdg_dev = rt_device_find(WDT_DEV);
    if (!wdg_dev)
    {
        rt_kprintf("find %s failed!\n", WDT_DEV);
        return RT_ERROR;
    }

     rt_device_init(wdg_dev);

    ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
    if (ret != RT_EOK)
    {
        rt_kprintf("set %s timeout failed!\n", WDT_DEV);
        return RT_ERROR;
    }

    ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
    if (ret != RT_EOK)
    {
        rt_kprintf("start %s failed!\n", WDT_DEV);
        return -RT_ERROR;
    }

    rt_thread_idle_sethook(idle_hook);

    return ret;
}

// write a bug to crash
void irq_callback()
{
    rt_kprintf("To be crashed!\n");

    char *p = NULL;
    *p = 1080;
}

int main(void)
{
    rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
    rt_pin_mode(USER_KEY, PIN_MODE_INPUT_PULLUP);
    rt_pin_attach_irq(USER_KEY, PIN_IRQ_MODE_RISING_FALLING, irq_callback, RT_NULL);
    rt_pin_irq_enable(USER_KEY, PIN_IRQ_ENABLE);

    init_wdt();

    for (;;)
    {
        rt_pin_write(LED_PIN, PIN_HIGH);
        rt_thread_mdelay(500);
        rt_pin_write(LED_PIN, PIN_LOW);
        rt_thread_mdelay(500);
    }

    return 0;
}

注意事项

  • RT-Thread Studio出现warning: tidle0 stack is close to end of stack address.的解决办法:修改工程文件rtconfig.h中IDLE_THREAD_STACK_SIZE的值为512
  • 不能使用debug模式运行,否则看门狗将失效

实验效果

按键触发程序崩溃,LED灯灭掉,系统停止喂狗,重新复位,复位后的LED灯又在交替亮灭

PSoc62™开发板之WDT应用

总结

看门狗的应用非常多,当程序无缘无故跑飞的时候,它可以抓住时机将系统复位,避免嵌入式系统宕机带来的损失,但不要过于依赖看门狗,该解决的问题总是要解决!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1428358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正点原子--STM32定时器学习笔记(1)(更新中....)

F1系列基本定时器&#xff08;TIM6 / TIM7&#xff09; 我们的目标是通过TIM6基本定时器定时500ms&#xff0c;让LED0每隔500ms闪一下&#xff01; 思路&#xff1a;使用定时器6&#xff0c;实现500ms产生一次定时器更新中断&#xff0c;在中断里执行“翻转LED0”。 定时器什…

2024021期传足14场胜负前瞻

2024021期赛事由亚洲杯2场、英超5场&#xff0c;德甲6场、非洲杯1场组成。售止时间为2月3日&#xff08;周六&#xff09;19点00分&#xff0c;敬请留意&#xff1a; 本期1.5以下赔率3场&#xff0c;1.5-2.0赔率3场&#xff0c;其他场次基本皆是平半盘、平盘。本期14场整体难度…

第三百零三回

文章目录 1. 概念介绍2. 实现方法2.1 文字信息2.2 红色边框 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何实现密码输入框"相关的内容&#xff0c;本章回中将介绍如何在在输入框中提示错误.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们…

LabVIEW CVT离合器性能测试

介绍了CVT&#xff08;连续变速器&#xff09;离合器的性能测试的一个应用。完成了一个基于LabVIEW软件平台开发的CVT离合器检测与控制系统&#xff0c;通过高效、准确的测试方法&#xff0c;确保离合器性能达到最优。 系统采用先进的硬件配合LabVIEW软件&#xff0c;实现了对…

python-自动化篇-运维-实现读取日志文件最后一行的时间

文章目录 1. 使用Python打开日志文件2.python读取文件最后一行两种方式3.读取当前时间&#xff0c;进行两者相减&#xff0c;超时报警4.将内容推送到企业微信5. 关闭日志文件整体代码 1. 使用Python打开日志文件 在开始实时读取日志文件之前&#xff0c;我们首先需要打开一个日…

深入了解键盘:分类、工作原理与操作指南

键盘 键盘是计算机使用的主要输入设备之一&#xff0c;键盘主要由创建字母、数字和符号并执行附加功能的按钮组成&#xff0c;通常用于向计算机或其他数字设备输入文本、命令和各种控制信号。 键盘是计算机中最重要的字符输入设备&#xff0c;其基本组成元件是按键开关&#…

画质和场景双需求下,海信电视U8KL的变与不变

又到一年春节&#xff0c;最近几年大家过年的方式越来越丰富&#xff0c;但是跟家人在一起看春晚依然是主流&#xff0c;电视也是过年不可或缺的家庭成员。 当然&#xff0c;随着大家对生活品质的要求更高&#xff0c;对电视的要求也变得更高了。比如&#xff0c;现在春晚直播…

ESP-IDF增加自定义组件开发过程记录

ESP-IDF增加自定义组件开发过程记录 记录一下&#xff0c;自定义组件开发方式容易实现代码的复用。比如说在实现一些芯片或者模块的代码上&#xff0c;网上先找找有的话就可以不用自己写了&#xff0c;实在没有的时候只能自己辛苦摸索编写了。 前言: 因为对cmake也不懂&…

纯血鸿蒙来了,鸿蒙App开发该如何提速

“全世界做产品挣钱的公司很多&#xff0c;但有能力打造操作系统的公司没有几家&#xff0c;最后世界上的操作系统就只有三套&#xff1a;鸿蒙、iOS和安卓。” --- 360集团创始人、董事长周鸿祎 “HarmonyOS实现了AI框架、大模型、设计系统、编程框架、编程语言、编译器等全栈…

Google Earth Engine tools——利用geetools中的algorithms算法实现hsv

简介 锐化HSV是一种图像处理技术&#xff0c;它是通过调整图像的颜色分量来增强图像的细节和清晰度。HSV是一种颜色空间模型&#xff0c;它基于人类视觉感知的方式来描述颜色。HSV代表色调&#xff08;Hue&#xff09;、饱和度&#xff08;Saturation&#xff09;和明度&…

正点原子--STM32中断系统学习笔记(1)

1、什么是中断&#xff1f; 原子哥给出的概念是这样的&#xff1a;打断CPU正常执行的程序&#xff0c;转而处理紧急程序&#xff0c;然后返回原暂停的程序继续运行&#xff0c;就叫中断。 当发生中断时&#xff0c;当前执行的程序会被暂时中止&#xff0c;进而进入中断处理函…

Vector CANdb++ Editor和CANdb++ Admin的区别

目录 1 CANdb Editor和CANdb Admin的功能偏差 2 CANdb Program窗口 3 下载并安装CANdb Editor和CANdb Admin 3.1 安装CANdb Admin.J1939 3.0 SP27 优质博文推荐阅读&#xff08;单击下方链接&#xff0c;即可跳转&#xff09;&#xff1a; Vector工具链 CAN Matrix DBC …

解析Excel文件内容,按每列首行元素名打印出某个字符串的统计占比(超详细)

目录 1.示例&#xff1a; 1.1 实现代码1&#xff1a;列数为常量 运行结果&#xff1a; 1.2 实现代码2&#xff1a;列数为变量 运行结果&#xff1a; 1.示例&#xff1a; 开发需求&#xff1a;读取Excel文件&#xff0c;统计第3列到第5列中每列的"False"字段占…

Linux VLAN相关概念、转发原理及处理流程

背景 二、三层转发是网络工程师经常接触到的一个问题&#xff0c;VLAN配置是二、三层转中一个很重要的概念&#xff0c;在配置VLAN的情况下&#xff0c;内核对报文是如何处理的呢&#xff1f; 概念 了解VLAN转发&#xff0c;首先必须知道VLAN相关概念&#xff1b; VLAN作用 V…

闲聊电脑(4)硬盘分区

夜深人静&#xff0c;万籁俱寂&#xff0c;老郭趴在电脑桌上打盹&#xff0c;桌子上的小黄鸭和桌子旁的冰箱又开始窃窃私语…… 小黄鸭&#xff1a;冰箱大哥&#xff0c;上次你说的那个“分区”和“格式化”是什么意思&#xff1f; 冰箱&#xff1a;分区么&#xff0c;就是分…

Kotlin快速入门系列10

Kotlin的委托 委托模式是常见的设计模式之一。在委托模式中&#xff0c;有两个对象参与处理同一个请求&#xff0c;接受请求的对象将请求委托给另一个对象来处理。与Java一样&#xff0c;Kotlin也支持委托模式&#xff0c;通过关键字by。 类委托 类的委托即一个类中定义的方…

VPP学习-startup.conf配置文件

背景 VPP&#xff08;Vector Packet Processing&#xff0c;矢量报文处理&#xff09;&#xff0c;作为一个开源的高性能数据包处理框架&#xff0c;旨在提供可扩展、灵活且高效的网络数据包处理能力&#xff1b;由于传统Linux 内核协议栈整体网络吞吐性能的局限性&#xff0c;…

MySQL | 一定会走索引却没有走的原因,日志报conversion相关错误

TL;DR&#xff1a;函数作用于表字段时&#xff0c;索引会失效。 具体情况 Indexes如下&#xff1a; SQL如下&#xff1a; explain select *from accounting_status_flow_tab_00000000WHERE ( client_no 6848134000 and loan_no 0119324345936016261000 )order by modif…

MySQL 8.0 引入 innodb_flush_method 等新参数的系统调用分析

本文我们将讨论如何在操作系统级别验证 innodb_flush_method 和 innodb_use_fdatasync 修改为默认值之外的其它值&#xff08;特别是 O_DIRECT 是最常用的&#xff09;后的效果。 介绍 首先&#xff0c;让我们定义该 innodb_flush_method 参数的作用。它规定了 InnoDB 如何管…

加快“数实融合”推进新型工业化 济南个性化体检“把脉”企业数字化转型难点痛点

加快“数实融合”推进新型工业化 济南个性化体检“把脉”企业数字化转型难点痛点 以主流价值为光&#xff0c;解读“济南故事”&#xff0c;解码C位新闻。爱济南客户端推出“追光”栏目&#xff0c;发挥新型主流媒体权威性和创新性&#xff0c;着眼经济社会发展紧要处、关键处、…