当前位置: 首页 > news >正文

Diving into the STM32 HAL----- IWDG and WWDG Timers笔记

        墨菲定律指出,任何可能出错的事情都会出错。尤其是对于嵌入式系统来说,情况尤其如此。除了硬件故障也会对软件产生影响外,即使是最仔细的设计也可能会出现一些意外情况,导致我们设备的异常行为。这可能会产生重大成本,特别是如果设备设计为在危险和关键环境中工作。

        市面上几乎所有的嵌入式微控制器都提供看门狗定时器 (WDT)。看门狗通常实现为自由运行、向下计数,当计数值达到零或计数器未在明确定义的临时窗口内重新加载其初始值时,这会导致 MCU 重置(在本例中我们谈论窗口式看门狗)。启用后,固件需要“不断”将看门狗计数器寄存器刷新到其初始值,否则 MCU 复位线被定时器断言为低电平,并且硬复位继续进行。

        WDT 的智能管理可以帮助我们处理所有导致嵌入式固件故障情况的不需要的情况(未处理的异常、堆栈溢出、访问无效的内存位置、由于不稳定的电源导致的 SRAM 损坏、无条件循环等)。此外,如果 WDT 可以在计数器用完时警告我们,我们可以尝试恢复固件的常规活动,或者至少将设备置于安全状态。

        STM32微控制器提供两个独立的看门狗定时器:独立看门狗(IWDG)和系统窗口看门狗(WWDG)。它们具有几乎相同的特性,除了其中几个特性使一个定时器在某些特定应用中比另一个定时器更合适。本章介绍如何使用 CubeHAL 来利用这两个重要且经常未得到充分利用的外设。

1、独立看门狗定时器

        IWDG 是一个由低速内部 (LSI) 振荡器计时的 12 位降序定时器:这解释了形容词 independent 的原因,这意味着该外设不是由外设时钟馈送的,而外设时钟又由 HSI 或 HSE 振荡器生成。这是一个重要的特性,即使主时钟发生故障,IWDG 定时器也能工作:即使 CPU 停止,看门狗也会继续计数,当达到零时,它会重置 MCU。如果固件设计正确以解决此问题,则 MCU 可以使用内部振荡器 (HSE) 从故障 clock 中恢复。

        在 STM32F0/F3/F7/L0/L4/L5/G0/G4 系列中,此定时器可以选择在窗口模式下工作。这意味着我们可以设置一个时间窗口(从 0x0 到 0xFFF 不等)来确定何时可以刷新定时器计数器。如果我们在计数器达到窗口值之前刷新定时器,那么当定时器达到零时,MCU 会以相同的方式重置。这样可以确保 “事物” 以正确的方式移动,尤其是当 MCU 完成在明确定义的时间窗口中工作的重复性任务时。

        IWDG 定时器需要多长时间才能重置 MCU?以下公式确定 IWDG 定时器的更新事件:

其中 Period 范围从 0 到 4095,IWDGPSC 对应于一个专用的 3 位预分频器,范围从 2 到 8。例如,假设 LSI 时钟以 32kHz 运行,周期等于 0xFFF 且 IWDGPSC 等于 2,则 IWDG 定时器将在以下时间后下溢: UpdateEventIWDG = (2^2 )*(4096)/ 32000 ≈ 0.5s。

        IWDG 定时器还支持硬件看门狗功能。配置flash option bytes 区域的一个特殊位,使定时器在每次系统重置后自动开始计数。与常规定时器和其他微控制器架构不同,一旦 STM32 看门狗定时器启动,就无法停止它。这是在开发低功耗应用程序时需要牢记的重要限制。

1.1、使用 CubeHAL 对 IWDG 定时器进行编程

        为了操作 IWDG 外设,HAL 定义了 C 结构体IWDG_HandleTypeDef,其定义方式如下:

typedef struct {IWDG_TypeDef *Instance; /* Pointer to IWDG descriptor */IWDG_InitTypeDef Init; /* IWDG initialization parameters */HAL_LockTypeDef Lock; /* IWDG locking object */__IO HAL_IWDG_StateTypeDef State; /* IWDG communication state */
} IWDG_HandleTypeDef;

        为了配置 IWDG 外设,我们使用 C 结构体IWDG_InitTypeDef实例,其定义方式如下:

typedef struct {uint32_t Prescaler; /* Selects the prescaler of the IWDG */uint32_t Reload; /* Specifies the IWDG down-counter reload value */uint32_t Window; /* Specifies the window value to be compared to the down-counter */
} IWDG_InitTypeDef;

        • Prescaler:此字段指定 prescaler 值,它可以采用从 2² 到 2⁸ 的所有幂。为了指定此值,CubeHAL 定义了七个不同的宏 - IWDG_PRESCALER_4、IWDG_PRESCALER_8、...、IWDG_PRESCALER_256。

        • Reload:指定定时器周期,即刷新定时器时的自动重新加载值。范围可以从 0x0 到 0xFFF(默认值)。

        • Window:对于提供窗口化 IWDG 的 STM32 MCU,此字段设置相应的窗口值,允许刷新定时器。范围可以从 0x0 到 0xFFF(默认值)。

        要配置和启动 IWDG 定时器,我们使用 CubeHAL 函数:

HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg);

        而要在它达到零之前刷新它,我们使用函数:

HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg);

2、系统窗口看门狗定时器

        WWDG 是由 APB 时钟计时的 7 位下降计数器定时器。与 IWDG 定时器不同,WWDG 定时器设计为在给定的时间窗口内刷新,否则会触发 MCU 重置。WWDG 计时器的工作方式对于新手来说似乎有点违反直觉。让我们逐步解释它的工作原理。WWDG 是一个 7 位定时器(见下图)。

其计数器寄存器的设置范围为 0x7F 到 0x40。此值将用于在刷新时重新加载计数器寄存器(我们将此值称为 TS)。

        WWDG 定时器具有这样的特性:当计数器的第 7 位(上图中的 T6)从 1 切换到 0 时,将发生系统复位。这意味着当计数器达到对应于 0111111 的值 TE = 0x3F 时,MCU 将被重置。

        WWDG 由 APB 总线主时钟馈送。时钟由一个固定因子 (4096) 加上一个可编程因子进行预缩放,公式如下:

例如,假设 WWDGPSC = 4096·8 且 APB 时钟为 48MHz,则计数器每 682.6μS 递减 1。

        如前所述,WWDG 定时器只能在给定的时间窗口内刷新:这个可编程值的范围可以从 TS 到 0x40:越接近 TS,窗口越宽。例如,如果我们使用值 TW = 0x5F 配置窗口寄存器,则只有当 WWDG 定时器的计数器从 0x5F 降至 0x40 时,我们才能刷新 WWDG 定时器。

        下图清楚地显示了时间窗口的作用。如果我们尝试刷新那些灰色区域中的 WWDG 定时器,即 0x7F 和 0x60 之间,或者当计数器低于 0x3F 时,MCU 将被重置。

        临时窗口持续多长时间?这由以下公式定义:

其中 Period = TS − TW 。例如,让我们假设将计数器刷新值(即 TS)设置为 0x7F,将窗口值(即 TW )设置为 0x5F。此外,让我们假设 APB 时钟等于 48MHz,可编程预分频因子等于 8。我们有: WWDGWmin = 4096 * (2^3 )  *(0x20 + 1)/ 48000000 ≈ 22.5ms。

        这表示在刷新 WWDG 计数器之前必须等待的最小超时。相反,最大超时由较低值和固定值 0x40 表示。再次使用公式,我们得到:WWDGWmax = 4096 * (2^3 ) *(0x3F + 1)/ 48000000 ≈ 43.6ms。这意味着在上次刷新后 22.5ms 之前或 43.6ms 之后刷新 WWDG 计时器将导致系统重置。

        WWDG 还有另一个重要特性:当计数器达到 TI = 0x40 值时,在会导致 MCU 复位的 0x3F 值之前仅一个“滴答”,如果启用,则会触发专用 IRQ。此中断称为早期唤醒中断 (EWI),可用于在极端情况下最终刷新 WWDG 定时器,或将设备置于安全状态。专用 ISR 称为 WWDG_IRQHandler(),它是 15 个 Cortex-M 异常之后的第一个 ISR。

        最后,像 IWDG 定时器一样,WWDG 也支持硬件看门狗功能。

2.1、使用 CubeHAL 对 WWDG 定时器进行编程

        为了操作 WWDG 外设,HAL 定义了 C 结构体WWDG_HandleTypeDef,其定义方式如下:

typedef struct {WWDG_TypeDef *Instance; /* Pointer to WWDG descriptor */WWDG_InitTypeDef Init; /* WWDG initialization parameters */HAL_LockTypeDef Lock; /* WWDG locking object */__IO HAL_WWDG_StateTypeDef State; /* WWDG communication state */
} WWDG_HandleTypeDef;

        为了配置 WWDG 外设,我们使用 C 结构体WWDG_InitTypeDef实例,其定义方式如下:

typedef struct {uint32_t Prescaler; /* Select the prescaler of the WWDG */uint32_t Window; /* Specifies the window value to be compared to the down-counter */uint32_t Counter; /* Specifies the WWDG down-counter reload value */uint32_t EWIMode; /* Specifies if WWDG Early Wakeup Interupt is enable or not. This parameter can be a value of @ref WWDG_EWI_Mode */
} WWDG_InitTypeDef;

        • Prescaler:此字段指定 prescaler 值,其范围可以是 1 到 8 之间的 2 的所有幂。为了指定此值,CubeHAL 定义了四个不同的宏 - WWDG_PRESCALER_1、WWDG_PRESCALER_2、...、WWDG_PRESCALER_8。

        • Window:此字段设置允许刷新定时器的相应窗口值。它的范围可以从 Counter 字段(默认字段)的值到 0x3F。

        • Counter:指定定时器周期,即刷新定时器时的重新加载值。范围可以从 0x7F(默认值)到 0x3F。

        • EWIMode:此字段启用早期唤醒中断 (EWI),它可以采用值 WWDG_EWI_ENABLE 和 WWDG_EWI_DISABLE。

        要配置和启动 WWDG 计时器,我们使用 CubeHAL 函数:

L_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg);

        当 WWDG 定时器 EWI 模式启用时,我们必须实现 WWDG_IRQHandler() ISR 并调用函数:

void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg);

        在中断触发时收到通知的正确方法包括实现回调例程:

void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg);

        要在时间窗口内刷新 WWDG 定时器,我们使用函数:

HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg, uint32_t Counter);

其中 Counter 参数对应于 WWDG counter 寄存器中要重新加载的值。

        最后,作为 APB clocks的 WWDT timer,我们需要使用宏 __HAL_RCC_WWDG_CLK_ENABLE() 来启用 peripheral clock。

3、检测由看门狗定时器引起的系统重置

        检测系统重置何时是由 watchdog timer 过期引起的,这可能很有用。这可能有助于我们了解调试会话期间出现的问题。复位和时钟控制 (RCC) 外设寄存器中的两个特殊位允许检测此事件。

        要检测 reset 是否是由 IWDG 计时器引起的,我们可以使用以下宏检查相应的标志:

__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST);

        而对于 WWDG 计时器,我们可以检查另一个标志:

__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST);

4、在调试会话期间冻结看门狗定时器

        在调试会话期间,WWDG 和 IWDG 定时器都将保持计数。这将阻止我们执行逐步调试。我们可以配置调试接口,以便在 MCU 停止时使用以下宏停止看门狗定时器:__HAL_DBGMCU_FREEZE_IWDG();

__HAL_DBGMCU_FREEZE_WWDG();

5、为您的应用选择合适的看门狗定时器

        两个看门狗定时器具有相似的功能,并且都做同样的事情:如果我们在给定时间内没有刷新它们的计数器寄存器,则重置 MCU。但是什么时候用某种定时器而不是其他定时器呢?

        当我们需要确保主时钟正常工作时,IWDG 计时器是首选。作为由独立 LSI 计时的 IWDG,检测此类故障很有用。此外,如果我们使用的是 RTOS,我们可以设置一个配置了最大优先级的独立线程,并使用软件定时器定期刷新 IWDG 定时器。这也有助于我们理解内核正在正确地调度线程。

        当我们必须确保某些操作在固定且明确的时间窗口内执行时,WWDG 定时器必须优于 IWDG 定时器。如果该过程花费的时间更少或更多,则它将无法在临时窗口中刷新定时器,从而导致系统重置。此外,如果我们想执行关键操作(例如将机器置于安全状态或将特殊数据保存在非易失性存储器中),WWDG 是正确的选择:借助早期预警 IRQ,我们可以收到正在进行的系统重置的通知。

相关文章:

Diving into the STM32 HAL----- IWDG and WWDG Timers笔记

墨菲定律指出,任何可能出错的事情都会出错。尤其是对于嵌入式系统来说,情况尤其如此。除了硬件故障也会对软件产生影响外,即使是最仔细的设计也可能会出现一些意外情况,导致我们设备的异常行为。这可能会产生重大成本,…...

使用statefulset管理pod

deployment主要管理无状态的pod,就算需要磁盘也是期望做动态扩容的。而对于那种有状态需要存储数据的,如log、数据库、消息中间件需要持久化数据的,则建议使用StatefulSet,我们的pod现在扩充了pv和pvc,那就使用Statefu…...

6个AI生成PPT的网站,pptai一键生成

演讲和展示PPT是当今办公和学习中的重要组成部分,无论是工作汇报、发表研究成果,还是课件培训,一款精心制作的PPT能够有效吸引观众的参与,并将你的信息深入人心。借助不断进步的人工智能技术,众多免费的AI PPT生成器可…...

【力扣】541.反转字符串2

问题描述 思路解析 每当字符达到2*k的时候,判断,同时若剩余字符>k,只对前k个进行判断(这是重点)因为字符串是不可变变量,所以将其转化为字符串数组,最后才将结果重新转变为字符串 字符串->字符数组 …...

如何优雅的用PyQt访问http(仅供参考)

使用pydantic或dataclaass创建一个数据存储对象 第一种 # coding: utf-8 from typing import Anyimport requests from pydantic import Field, BaseModelclass ResponseModel(BaseModel):status: bool Field(True, description"响应状态")message: str Field(请求…...

小程序租赁系统开发的优势与应用解析

内容概要 随着科技的迅猛发展,小程序租赁系统应运而生,成为许多企业优化业务的重要工具。首先,它提升了用户体验。想象一下,用户只需轻轻一点,就能够浏览和租赁心仪的商品,这种便捷的过程使繁琐的操作大大…...

Group Convolution(分组卷积)

分组卷积的优点: 减少参数数量: 在分组卷积中,每个分组只与一部分输入通道进行卷积运算,这意味着模型的参数数量会减少。例如,如果一个卷积层有8个输入通道和8个输出通道,且不使用分组,那么将有…...

uniapp在H5使用vue-router路由返回上一页不会触发销毁函数解决方法

问题:uniapp在H5使用vue-router路由,如果在H5平台上进行页面刷新操作,再返回上一页,可能会遇到beforeDestroy、destroyed、onUnload生命周期钩子不被触发的问题。这是因为在H5中,页面的刷新实际上是整个应用的重新加载…...

YOLOv8配置文件应该如何命名?

文末有重点 1.配置文件解析代码yolov8/ultralytics/nn/tasks.py 如下: def yaml_model_load(path):"""Load a YOLOv8 model from a YAML file."""import repath Path(path)if path.stem in (fyolov{d}{x}6 for x in nsmlx for d i…...

扫雷-完整源码(C语言实现)

云边有个稻草人-CSDN博客 在学完C语言函数之后,我们就有能力去实现简易版扫雷游戏了(成就感满满),下面是扫雷游戏的源码,快试一试效果如何吧! 在test.c里面进行扫雷游戏的测试,game.h和game.c…...

数据库(MySQL黑马)

基础篇 MySQL概述 数据库概述 数据库相关概念 主流的关系型数据库管理系统 MySQL数据库的安装与启动 下载:MySQL :: MySQL Community Downloads 安装步骤 MySQL―8.0.40超详细保姆级安装教程_mysql8.0.40安装教程-CSDN博客文章浏览阅读1k次。_mysql8.0.40安装教…...

UE5 Line Trace By Channel(通道线条追踪)节点

在 Unreal Engine 5 (UE5) 中,Line Trace By Channel 是一个常用于进行物理射线检测(raycasting)的节点。它会沿着一条从起点到终点的直线发射一条射线,并检测射线与世界中任何物体的碰撞。这个节点广泛应用于枪械射击、检测物体、…...

How to use the ‘git log‘ command to get change log for each file?

1. Using git log command #!/bin/bash# 目标文件名 output_file"git_log.csv"# 打印 CSV 文件的标题行 echo "CommitID,Author,Author Email,Date,Added-Lines Removed-Lines File" > $output_file echo "CommitID,Author,Author Email,Date,Add…...

node.js中实现router模块化管理

index.js const express require(express); const app express()// 导入路由模块 const router require(./router/index)// 注册路由模块 app.use(router)app.listen(3000, ()>{console.log(http://127.0.0.1:3000) })router/index.js const express require(express…...

突破性算法:让无人机集群在狭窄空间内穿针引线

导读 在建筑救援、森林搜索等任务中,无人机集群经常会遇到狭窄空间限制和动态障碍物变化等挑战。这些挑战会导致集群内部冲突,或在执行任务时因避让动态障碍物而导致系统混乱。实际应用场景和任务的严格特征往往使得全局搜索难以优化,而局部避…...

人工智能如何改变你的生活?

在我们所处的这个快节奏的世界里,科技融入日常生活已然成为司空见惯的事,并且切实成为了我们生活的一部分。在这场科技变革中,最具变革性的角色之一便是人工智能(AI)。从我们清晨醒来直至夜晚入睡,人工智能…...

C语言main()函数

C语言main()函数 argc(argument count) 在C或C程序中,argc(argument count的缩写)是一个由程序运行时环境自动提供的整数,用于指示传递给main函数的命令行参数的数量。因此,不需要&#xff08…...

【LC】162. 寻找峰值

题目描述: 峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] nums[n] -∞ 。 你必须…...

Zero to JupyterHub with Kubernetes上篇 - Kubernetes 离线二进制部署

前言: 纯个人记录使用。 搭建 Zero to JupyterHub with Kubernetes 上篇 - Kubernetes 离线二进制部署。搭建 Zero to JupyterHub with Kubernetes 中篇 - Kubernetes 常规使用记录。搭建 Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s。 k8s二进…...

HTML5+JavaScript实现消消乐游戏

HTML5JavaScript实现消消乐游戏 点击两个相邻的方块来交换它们位置。 如果交换后形成三个或更多相同图案的方块连成一线,这些方块会被消除。 消除后,上方的方块会下落填补空缺,顶部会生成新的方块。 每消除一个方块得10分。例如&#xff0…...

深度学习:在PyTorch中进行模型验证完整流程

深度学习:在PyTorch中进行模型验证完整流程(以图像为例) 详细说明在PyTorch中进行模型验证的全过程。 模型验证的详细步骤和流程 1. 设置计算设备 选择合适的计算设备是性能优化的第一步。基于系统的资源(GPU的可用性&#xf…...

洛谷 P1747 好奇怪的游戏 C语言 bfs

题目: https://www.luogu.com.cn/problem/P1747#submit 题目描述 爱与愁大神坐在公交车上无聊,于是玩起了手机。一款奇怪的游戏进入了爱与愁大神的眼帘:***(游戏名被打上了马赛克)。这个游戏类似象棋,但…...

豆包MarsCode

01 AI代码陪练 来到豆包MarsCode官网:http://sqllb.com/6FRiH76 ,点击左上方的代码练习,就能看到一个AI代码陪练的练习场。 在左边栏,可以看到各种各样的算法题目,在右侧是MarsCode AI,中间是算法题目和…...

Docker网络模式:桥接(Bridge)模式与主机模式(Host)实操对比(一)

文章目录 前言一、桥接模式(Bridge Mode)前言 随着容器化技术的发展,Docker 已成为开发和部署应用的首选工具之一。Docker 不仅简化了应用的打包过程,还提供了多种网络模式来满足不同应用场景下的需求。本文将重点探讨两种常用的 Docker 网络模式——桥接模式(Bridge Mod…...

3. STM32_串口

数据通信的基础概念 什么是串行/并行通信: 串行通信就是数据逐位按顺序依次传输 并行通信就是数据各位通过多条线同时传输。 什么是单工/半双工/全双工通信: 单工通信:数据只能沿一个方向传输 半双工通信:数据可以沿两个方向…...

【Git】Git 命令参考手册

目录 Git 命令参考手册1. 创建仓库1.1 创建一个新的本地仓库1.2 克隆一个仓库1.3 克隆仓库到指定目录 2. 提交更改2.1 显示工作目录中已修改的文件,准备提交2.2 将文件添加到暂存区,准备提交2.3 将所有已修改的文件添加到暂存区,准备提交2.4 …...

EBS 中 Oracle Payables (AP) 模块的相关集成

Oracle E-Business Suite (EBS) 中的 Oracle Payables (AP) 模块是一个全面的应付账款管理系统,它不仅提供了丰富的功能来管理与供应商的财务交易,还通过与其他模块的紧密集成,实现了企业内部各个业务流程的无缝衔接。以下是 Oracle Payables…...

【LC】896. 单调数列

题目描述&#xff1a; 如果数组是单调递增或单调递减的&#xff0c;那么它是 单调 的。如果对于所有 i < j&#xff0c;nums[i] < nums[j]&#xff0c;那么数组 nums 是单调递增的。 如果对于所有 i < j&#xff0c;nums[i]> nums[j]&#xff0c;那么数组 nums 是…...

大语言模型LLM的微调代码详解

代码的摘要说明 一、整体功能概述 这段 Python 代码主要实现了基于 Hugging Face Transformers 库对预训练语言模型&#xff08;具体为 TAIDE-LX-7B-Chat 模型&#xff09;进行微调&#xff08;Fine-tuning&#xff09;的功能&#xff0c;使其能更好地应用于生成唐诗相关内容的…...

鸿蒙主流路由详解

鸿蒙主流路由详解 Navigation Navigation更适合于一次开发,多端部署,也是官方主流推荐的一种路由控制方式,但是,使用起来入侵耦合度高,所以,一般会使用HMRouter,这也是官方主流推荐的路由 Navigation官网地址 个人源码地址 路由跳转 第一步-定义路由栈 Provide(PageInfo) pag…...

GelSight和Meta AI合作推出多模态指尖形全向视触觉传感器Digit360

近日&#xff0c;触觉智能技术先锋 GelSight 与 Meta AI相关团队今宣布推出 Digit 360&#xff0c;这是一款呈人工指尖形状的触觉传感器&#xff0c;它能够以高精度将触摸数字化&#xff0c;从而提供较为丰富且详细的触觉数据。Digit 360将会拓展触觉传感研究领域&#xff0c;标…...

XX科技面试笔试题

笔试题 一、选择题 (每题5分,共20分) 1、构成存储器的最小单位是 ( ) A、bit B、Byte C、MB 2、下列不属于WEB服务的是 ( ) A、Apache B、Nginx C、IIS D、LVS 3、web服务器默认端口为 ( ) A、80 B、800 C、22 D、43 4、下列安装系统方法中,适合大量装机需求的是 ( ) A、U盘…...

AVL、B树和B+树

AVL树定义 AVL树&#xff08;Adelson-Velsky 和 Landis 树&#xff09;是一种自平衡的二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;&#xff0c;由苏联数学家Georgy Adelson-Velsky和Evgenii Landis在1962年提出。AVL树通过在每个节点上维护一个平衡因子&#…...

[SWPUCTF 2021 新生赛]include

参考博客: 文件包含 [SWPUCTF 2021 新生赛]include-CSDN博客 NSSCTF | [SWPUCTF 2021 新生赛]include-CSDN博客 考点:php伪协议和文件包含 PHP伪协议详解-CSDN博客 php://filter php://filter可以获取指定文件源码。当它与包含函数结合时&#xff0c;php://filter流会被当…...

ES----安装 elasticsearch入门,elasticsearch安装,centos安装es,centos安装elasticsearch

ES 如需要对应资源&#xff0c;请评论留言&#xff0c;或再最后视频中关注获取 1. 安装 1.1 安装es 创建网络&#xff08;centos系统&#xff0c;docker环境&#xff09; docker network create es-netdocker安装es —如果下载失败&#xff0c;请看我的docker配置镜像的文章…...

探索文件系统,Python os库是你的瑞士军刀

文章目录 探索文件系统&#xff0c;Python os库是你的瑞士军刀第一部分&#xff1a;背景介绍第二部分&#xff1a;os库是什么&#xff1f;第三部分&#xff1a;如何安装os库&#xff1f;第四部分&#xff1a;简单库函数使用方法1. 获取当前工作目录2. 改变当前工作目录3. 列出目…...

android studio引用so库

在工程中编译好的so库文件将在原始编译工程对应目录下&#xff1a;build/intermediates/cxx/Debug/xxxxxx/obj/ 其目录结构如上所示&#xff0c;包含生成的四个版本&#xff0c;每个文件夹下均包含c/c源码编译成的Android版本的libnavi.so库和提供应用接口的libnavi-lib.so库。…...

Ubuntu 服务器部署 Tomcat 并配置 SSL/TLS 证书

本文目录 准备登陆云服务器安装 Java下载 tomcat 包配置防火墙浏览器访问 Tomcat 默认页面以服务的形式运行 Tomcat创建 Tomcat 用户和组创建 systemd 服务文件启动 tomcat 服务 Tomcat webapps 文件目录部署一个静态网站tomcat 的配置文件 将域名解析到服务器Tomcat 配置 SSL/…...

不间断电源 (UPS) 对现代技术可靠性的影响

在这个技术型世界里&#xff0c;无论是在个人还是商业环境中&#xff0c;电力供应商提供的稳定供电都变得越来越重要。 不间断电源 (UPS) 系统是一种不可或缺的解决方案&#xff0c;可保证终端设备不受干扰地运行&#xff0c;在出现电源问题或故障时让用户继续工作。 这篇文章…...

Android 基础类(01)- Thread类 - readyToRun和threadLoop

一、前言&#xff1a; 在阅读AOSP代码过程中&#xff0c;我们经常会看到Thread子类重写两个方法&#xff1a;readyToRun和threadLoop&#xff0c;不清楚的同学&#xff0c;可能在这儿连调用逻辑都搞不清楚了&#xff0c;因为找不到谁调用了它。我这儿先不去深究Thread内部逻辑…...

【组件封装】uniapp vue3 封装一个自定义下拉刷新组件pullRefresh,带刷新时间和加载动画教程

文章目录 前言一、实现原理二、组件样式和功能设计三、scroll-view 自定义下拉刷新使用回顾相关属性&#xff1a;最终版完整代码&#xff1a; 前言 手把手教你封装一个移动端 自定义下拉刷新组件带更新时间和加载动画&#xff08;PullRefresh&#xff09;&#xff0c;以uniapp …...

通过 JNI 实现 Java 与 Rust 的 Channel 消息传递

做纯粹的自己。“你要搞清楚自己人生的剧本——不是父母的续集&#xff0c;不是子女的前传&#xff0c;更不是朋友的外篇。对待生命你不妨再大胆一点&#xff0c;因为你好歹要失去它。如果这世上真有奇迹&#xff0c;那只是努力的另一个名字”。 一、crossbeam_channel 参考 cr…...

一起学习Fortran:如何安装Fortran

Fortran&#xff08;全称Formula Translation&#xff0c;意为“公式翻译”&#xff09;是一种通用编译命令式编程语言&#xff0c;适用于数值计算和科学计算。Fortran语言最初是由IBM在20世纪50年代为科学和工程应用程序而开发的&#xff0c;第一个Fortran版本——FORTRAN I在…...

社交新零售模式下“2+1 链动模式 S2B2C 商城小程序”的创新实践与发展策略

摘要&#xff1a;随着实体商业与社交网络深度融合&#xff0c;社交新零售蓬勃兴起&#xff0c;“21 链动模式 S2B2C 商城小程序”作为其中创新典范&#xff0c;融合独特激励机制与数字化运营优势&#xff0c;重塑零售生态。本文剖析该模式架构、运作逻辑&#xff0c;探讨其在私…...

【博主推荐】C# Winform 拼图小游戏源码详解(附源码)

文章目录 前言摘要1.设计来源拼图小游戏讲解1.1 拼图主界面设计1.2 一般难度拼图效果1.3 普通难度拼图效果1.4 困难难度拼图效果1.5 地域难度拼图效果1.6 内置五种拼图效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载结束语 前言 在数字浪潮汹涌澎湃的时代&#xff0c;程序开…...

贝叶斯统计的核心思想与基础知识:中英双语

中文版 贝叶斯统计的核心思想与基础知识 贝叶斯统计是以贝叶斯定理为核心&#xff0c;通过将先验知识和观测数据相结合&#xff0c;更新对参数或模型的认知的一种统计方法。它不仅强调概率的频率解释&#xff08;频率统计学中概率描述事件的长期发生频率&#xff09;&#xf…...

Verilog使用liberty文件中cell单元的demo

Liberty&#xff08;.lib&#xff09;文件是用来描述标准单元库中逻辑单元&#xff08;如门电路、触发器等&#xff09;的时序和功耗特性的&#xff0c;不是用来直接定义Verilog中的元件。在Verilog设计中&#xff0c;我们通常通过实例化模块&#xff08;module&#xff09;来创…...

openssl生成ca证书

常见CA文件夹 1、生成CA钥匙 openssl genrsa -out ./private/cakey.pem 2、生成CA自签名 openssl req -new -x509 -key ./private/cakey.pem -out ./cacert.crt -days 3650 3、生成http服务器私钥 openssl genrsa -out ./data/frontt.project.com.key 2048 4、CA给http服务器…...

OGRE 3D----2. QGRE + QQuickView

将 OGRE(面向对象图形渲染引擎)集成到使用 QQuickView 的 Qt Quick 应用程序中,可以在现代灵活的 UI 框架中提供强大的 3D 渲染功能。本文将指导您如何在 QQuickView 环境中设置 OGRE。 前提条件 在开始之前,请确保您已安装以下内容: Qt(版本 5.15 )OGRE(版本14.2.5)…...

【Java 学习】面向程序的三大特性:封装、继承、多态

引言 1. 封装1.1 什么是封装呢&#xff1f;1.2 访问限定符1.3 使用封装 2. 继承2.1 为什么要有继承&#xff1f;2.2 继承的概念2.3 继承的语法2.4 访问父类成员2.4.1 子类中访问父类成员的变量2.4.2 访问父类的成员方法 2.5 super关键字2.6 子类的构造方法 3. 多态3.1 多态的概…...