stm32 单片机使用 rt-thread 的syswatch 系统守护软件包

news/2024/10/24 6:13:40/

syswatch__0">一、系统看守(syswatch)组件 介绍

系统看守(syswatch)组件 主要功能是保障实时操作系统正常运行,防止系统死机以及各种异常引起的线程阻塞,保障整个系统长期正常运行。
系统看守具备以下几种行为模式:
1、系统崩溃或硬件异常导致系统失去调度时,执行 系统复位 恢复系统正常运行。
2、当有异常导致某些线程长时间阻塞时,可根据用户的配置实施 系统复位 / 杀掉阻塞线程 / 重启阻塞线程 的方式恢复系统正常运行。

原理介绍
系统看守(syswatch)组件 使用实时操作系统中允许的最高优先级作为看守线程的优先级,保障看守线程不会被阻塞,同时看守线程由看门狗提供看护,保障看守线程正常运行。系统看守通过 线程调度回调接口 监测线程的调度情况,当检测到有线程发生异常阻塞时,开始检测和确认具体哪个线程发生了异常阻塞,最后根据异常解决模式执行 系统复位 / 杀掉阻塞线程 / 重启阻塞线程 清除异常,使系统恢复正常运行。

配置参数说明
在这里插入图片描述
注意事项
1、syswatch 依赖于看门狗设备而工作,使用本组件时请确认已注册了看门狗设备。
2、syswatch 全权管理看门狗,请不要在其它线程中使用和操作看门狗
3、syswatch 提供了3种异常解决模式,请根据实际需要配置适合的工作模式。
4、syswatch_set_event_hook 提供用户安装事件回调函数,以便针对重要事件发生时进行一些必要处理,如系统复位前须对重要数据进行保存时,可设置回调函数完成相应处理,如不需要可不设置。

二、开发配置

2.1 开发环境

基于 env 进行配置开发。RT-Thread Env 工具包括配置器和包管理器,用来对内核和组件的功能进行配置,对组件进行自由裁剪,对线上软件包进行管理,使得系统以搭积木的方式进行构建,简单方便。
硬件:基于野火 stm32f407 开发板
软件:rt-thread 4.1.1 版本,基于 stm32f407-atk-explorer bsp包

2.2 时钟配置

stm32f407-atk-explorer bsp包的外部晶振是8MHZ,野火 stm32f407 开发板外部晶振是25MHZ,需要先修改配置系统时钟。
参考野火教程:
在这里插入图片描述
系统时钟的计算:SYSCLK=PLLCLK=HSE/m*n/p
HSE 使用 25M,参数 m 设置为 25,所以需要修改系统时钟的时候只需要修改参数 n 和 p 即可,SYSCLK=PLLCLK=HSE/m*n/p。

在这里插入图片描述
在这里插入图片描述
系统时钟配置完整代码如下:

void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};/**Configure the main internal regulator output voltage*/__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);/**Initializes the CPU, AHB and APB busses clocks*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.LSEState = RCC_LSE_ON;RCC_OscInitStruct.LSIState = RCC_LSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 25;RCC_OscInitStruct.PLL.PLLN = 336;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 7;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/**Initializes the CPU, AHB and APB busses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK){Error_Handler();}PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK){Error_Handler();}
}

2.3 开启看门狗

在这里插入图片描述
Kconfig 文件 相关
在这里插入图片描述

    config BSP_USING_WDTbool "Enable Watchdog Timer"select RT_USING_WDTdefault n

开始之后,下面的选项会自动勾选。
在这里插入图片描述
Kconfig 文件 相关
在这里插入图片描述

config RT_USING_WDTbool "Using Watch Dog device drivers"default n

重新编译,下载到开发板,查看设备
在这里插入图片描述
使用的是独立看门狗(IWDG)
在这里插入图片描述

区分独立看门狗(IWDG)和窗口看门狗(WWDG)

syswatch__109">2.4 syswatch 组件

开启 syswatch 组件
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

下载软件包
在这里插入图片描述
编译
在这里插入图片描述

三、测试

下载到开发板,运行如下
在这里插入图片描述

查看线程
在这里插入图片描述
配置的异常解决模式是2,可知可重启异常线程。
在这里插入图片描述

测试代码,编写异常线程:

/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2018-11-06     SummerGift   first version* 2018-11-19     flybreak     add stm32f407-atk-explorer bsp*/#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>#define THREAD_PRIORITY         25
#define THREAD_STACK_SIZE       512
#define THREAD_TIMESLICE        5static rt_thread_t tid1 = RT_NULL;/* defined the LED0 pin: PF6 */
#define LED0_PIN    GET_PIN(F, 6)
#define LED1_PIN    GET_PIN(C, 6)/* 线程 1 的入口函数 */
static void thread1_entry(void *parameter)
{rt_kprintf("hello world\r\n");while(1){}
}int main(void)
{/* set LED0 pin mode to output */rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);/* 创建线程 1,名称是 thread1,入口是 thread1_entry*/tid1 = rt_thread_create("thread1",thread1_entry, RT_NULL,THREAD_STACK_SIZE,THREAD_PRIORITY, THREAD_TIMESLICE);/* 如果获得线程控制块,启动这个线程 */if (tid1 != RT_NULL)rt_thread_startup(tid1);while (1){rt_pin_write(LED0_PIN, PIN_HIGH);rt_pin_write(LED1_PIN, PIN_HIGH);rt_thread_mdelay(500);rt_pin_write(LED0_PIN, PIN_LOW);rt_pin_write(LED1_PIN, PIN_LOW);rt_thread_mdelay(500);}
}

测试结果,异常线程可重新重启
在这里插入图片描述

参考:
https://gitee.com/RT-Thread-Mirror/rt-thread-syswatch
STM32库开发实战指南——基于野火霸天虎开发板


http://www.ppmy.cn/news/1541530.html

相关文章

zookeeper的作用--有无zookeeper的区别

如果光了解zookeeper的作用可能有些抽象&#xff0c;本文从对比有无zookeeper的情况来更直观凸显其作用。 ZooKeeper在分布式系统中提供了多种关键功能&#xff0c;包括配置管理、命名服务、分布式锁、集群管理等。下面通过一些具体场景来对比有ZooKeeper和没有ZooKeeper的情况…

开发板+freertos+lvgl学习1

#目的 最近找到了一块开发板&#xff0c;并且买了一个手表屏幕&#xff0c;准备学习下lvglfreerots #详细实验步骤 ##整体配置如下 首先是连接硬件并通过cubemx对主板进行配置 大体分类几类功能&#xff1a; 其中spi1lcd开头的引脚用来控制手表lcd屏幕 其中i2ctouch开头的引脚…

create-vite my-vite-uniapp-project

搭建一个使用 Vue 3、TypeScript、Vite、uni-app、uView UI库和Element Plus的项目&#xff0c;你可以遵循以下步骤&#xff1a; 安装 Node.js 和 npm。 使用以下命令全局安装 Vue CLI&#xff1a; npm install -g vue/cli创建一个新的 Vue 3项目&#xff0c;并选择 TypeScr…

15_卸载操作

在之前我们就提到&#xff0c;首次渲染之后&#xff0c;后续如果再调用 render 函数时&#xff0c;传递的 vnode 为 null 则表示是卸载。 当时我们是直接通过执行 container.innerHTML ‘’ 来实现的&#xff0c;但是这样做会有以下几个问题&#xff0c;如下&#xff1a; 容…

关于使用 C# 处理水位数据多种格式的统一转换

关于使用 C# 处理水位数据多种格式的统一转换 1、前言2、水位数据的多种格式3、水位数据多种格式的统一转换程序展示4、水位数据多种格式的统一转换 C# 代码4.1、声明引用命名空间4.2、多种格式的统一转换 C# 代码4.3、多种格式的统一转换 C# 代码&#xff0c;文件输出保存 1、…

简单的 curl HTTP的POSTGET请求以及ip port连通性测试

简单的 curl HTTP的POST&GET请求以及ip port连通性测试 1. 需求 我们公司有一个演示项目&#xff0c;需要到客户那边进行项目部署&#xff0c;项目部署完成后我们需要进行项目后端接口的测试功能&#xff0c;但是由于客户那边么有条件安装类似于postman这种的测试工具&am…

STM32CubeMX软件界面不清晰调整方法

STM32CubeMX软件界面不清晰调整方法 添加系统环境变量 变量名: J2D_D3D 变量值: false 结果 貌似没有多大变化 添加上述系统环境变量后界面变化如下(没什么大变化) 参考链接 STM32CubeMX软件界面花屏&#xff0c;混乱的解决方案。 彻底解决STM32CUBEMX画面撕裂/重影问题

【Qt】控件——Qt显示类控件、常见的显示类控件、显示类控件的使用、Label、LCD Number、ProgressBar、Calendar Widget

文章目录 Qt4. Qt显示类控件LabelLCD NumberProgressBarCalendar Widget Qt 4. Qt显示类控件 Label QLabel 可以用来显示文本和图片。 属性说明textQLabel 中的文本textFormat文本的格式&#xff1a;Qt::PlainText&#xff1a;纯文本 Qt::RichText&#xff1a;富文本&#xf…