RT-Thread学习笔记(三)
RT-Thread学习笔记
- 时钟管理
- 时钟节拍
- 获取系统节拍
- 定时器
- 系统定时器初始化
- 定时器工作机制
- 动态创建定时器
- 静态创建定时器
- 定时器控制
- 高精度延时函数
时钟管理
操作系统需要通过时间来规范其任务
时钟节拍
任何操作系统都需要提供一个时钟节拍,以供系统处理所有和时间有关的事件,如线程的延时、线程的时间片轮转调度以及定时器超时等。
RT-Thread 中,时钟节拍的长度可以根据 RT_TICK_PER_SECOND
的定义来调整。 RT_TICK_PER_SECOND 称为 系统节拍频率(System Tick Frequency),也叫:每秒节拍数 / 每秒系统滴答数
rtconfig.h
是 RT-Thread 系统配置头文件,用于控制内核功能、组件、驱动和中间件是否启用的开关配置。它相当于整个RT-Thread 工程的“功能开关总控台”。
✅ 主要作用
系统的节拍是1000Hz,即 1/100=1ms 一个节拍
时钟节拍数的原理是用了一个硬件的滴答定时器(SysTick),调用系统滴答定时器中断处理函数(每1ms触发一次systick定时器中断),用来进行计数。
SysTick(系统定时器)是 ARM Cortex-M 内核内置的一个 简单、专用的 24 位倒计时定时器,用于提供系统时基(如 1ms),通常用来驱动 RTOS 的节拍中断(tick)。
每1ms触发一次systick定时器中断后就会执行SysTick_Handler()函数,即回调函数,进行相应操作
SysTick_Handler()回调函数里调用了rt_tick_increase()函数
rt_tick_increase()函数每一次都对 rt_tick 加1
rt_tick 是一个静态全局变量,在初始化的时候是为0
获取系统节拍
使用 rt_tick_t rt_tick_get(void)
函数,函数的返回值是计数值的值
系统默认1ms,tick加1,延时500ms,也确实每次打印都是加500
将系统节拍频率改为1000,即10000Hz,tick每 100us 加1
编译会有警告,但是只是看一下现象
确实是大约每次加1000
改为100Hz
但是一般情况下是不去修改这个系统节拍频率的,只是为了看现象,因为系统各个模块都需要以这个为基准,所以很重要,不轻易修改
定时器
定时器,是指从指定的时刻开始,经过一定的指定时间后触发一个事件,定时器有硬件定时器和软件定时器之分。
硬件定时器: 芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。硬件定时器就是在使用裸机开发时使用到的基本定时器、通用定时器和高级定时器。
软件定时器: 由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受数目限制的定时器服务。RT-Thread操作系统提供软件实现的定时器,以时钟节拍(OS Tick)的时间长度为单位,即定时数值必须是OS Tick的整数倍。
RT-Thread的定时器提供两类定时器机制:单次触发和周期触发
✅ 区别对比:
根据定时器超时函数执行时所处的上下文环境,RT-Thread的定时器可以分为HARD_TIMER模式和SOFT_TIMER模式。
🌩️ 硬定时器(Hard Timer)
定时器超时后,直接在中断中调用回调函数
响应速度快、精度高
不能使用可能引起调度的操作(例如 rt_sem_take()、rt_thread_delay())
✅ 适用场景:时间精度要求高、执行逻辑简单的任务
⚠️ 注意事项:不能调用阻塞函数或复杂逻辑
例如在中断上下文中执行的超时函数它不应该试图去申请动态内存、释放动态内存等
🧵 软定时器(Soft Timer)
定时器回调是由一个后台线程(timer thread)在线程上下文中执行
可以使用 RTOS 的全部功能,如信号量、消息队列、动态内存等
✅ 适用场景:回调函数里需要调度、操作 RTOS 对象的场合
⚠️ 注意事项:精度略低,取决于 RT_TIMER_THREAD_PRIO 线程调度
该模式被启用后,系统会在初始化时创建一个 timer 线程,然后SOFT_TIMER 模式的定时器超时函数在都会在timer线程的上下文环境中执行
系统定时器初始化
系统定时器初始化函数在启动函数中
启动函数有两个 rt_thread_startup()
和 rtthread_startup()
✅ rt_thread_startup()
作用:启动一个单独线程
✅ rtthread_startup()
作用:启动整个 RT-Thread 内核系统
一般在 main() 或 boot 初始化里调用一次
含义类似 RT-Thread 的“入口函数”
rt_list_init() 是 RT-Thread 中用于初始化一个内核链表节点的函数。这个链表叫做“内核双向链表(rt_list_t)”,是 RT-Thread 里非常核心的数据结构,用于管理各种系统资源,比如线程、定时器、等待队列等。
✅ rt_list_t 是什么?
struct rt_list_node
{struct rt_list_node *next; // 指向下一个节点struct rt_list_node *prev; // 指向上一个节点
};
这是一个 双向循环链表节点结构,RT-Thread 用它来组成各种对象的“队列”或“链表”。
✅ rt_list_init() 干什么用?
void rt_list_init(struct rt_list_node *l)
{l->next = l;l->prev = l;
}
💡 初始化后,该节点既是头,也是尾。可以开始往里插入元素。
📦 链表(List)在 RT-Thread 中有什么用?
由上面可知,在系统初始化时就把硬件定时器和软件定时器都初始化好了,也给用户应用层提供了相应的操作接口去操作定时器,上面的作为了解
定时器工作机制
在 RT-Thread 定时器模块中维护着两个重要的全局变量:
- 当前系统经过的 tick 时间 rt_tick(当硬件定时器中断来临时,它将加 1)
- 定时器链表 rt_timer_list。系统新创建并激活的定时器都会按照以超时时间排序的方式插入到rt_timer_list 链表中。
如下图所示,系统当前tick值为20,在当前系统中已经创建并启动了三个定时器,分别是定时时间为50个tick的Timer1、100个tick的Timer2和500个tick的Timer3,这三个定时器分别加上系统当前时间 rt_tick=20,从小到大排序链接在 rt_timer_list 链表中,形成如图所示的定时器链表结构。
而 rt_tick 随着硬件定时器的触发一直在增长(每一次硬件定时器中断来临,rt_tick 变量会加 1) ,50个tick以后,rt_tick从20增长到70,与Timer1的timeout值相等,这时会触发与Timer1定时器相关联的超时函数,同时将Timer1从rt_timer_list链表上删除。同理,100个tick和500个tick过去后,与Timer2 和 Timer3 定时器相关联的超时函数会被触发,接着将 Time2 和 Timer3 定时器从 rt_timer_list链表中删除。
如果系统当前定时器状态在 10 个 tick 以后(rt_tick=30)有一个任务新创建了一个 tick 值为 300 的Timer4定时器,由于Timer4定时器的timeout=rt_tick+300=330,因此它将被插入到Timer2和Timer3定时器中间,形成如下图所示链表结构:
因为上面说到定时器分为两种,一种是单次触发,另一种是周期触发的
如果是周期触发的定时器,假设此时tick为20,timeout设置为10,那么当tick为30时会触发该定时器,并把它移除出链表中,然后timeout+10,再次添加进链表中,以此周期循环
动态创建定时器
动态创建定时器函数
rt_timer_t rt_timer_create(const char *name,void (*timeout)(void *parameter),void *parameter,rt_tick_t time,rt_uint8_t flag)
第一个参数是定时器的名字
第二个参数是一个函数指针,即超时函数,定时时间到了要去处理的超时事件,通过回调这个超时函数
第三个参数是传递给超时函数的参数
第四个参数是超时的时间
第五个参数是flag
#define RT_TIMER_FLAG_DEACTIVATED 0x0 /**< timer is deactive */
#define RT_TIMER_FLAG_ACTIVATED 0x1 /**< timer is active */
#define RT_TIMER_FLAG_ONE_SHOT 0x0 /**< one shot timer */
#define RT_TIMER_FLAG_PERIODIC 0x2 /**< periodic timer */#define RT_TIMER_FLAG_HARD_TIMER 0x0 /**< hard timer,the timer's callback function will be called in tick isr. */
返回值是 rt_timer_t
/*** timer structure*/
struct rt_timer
{struct rt_object parent; /**< inherit from rt_object */rt_list_t row[RT_TIMER_SKIP_LIST_LEVEL];void (*timeout_func)(void *parameter); /**< timeout function */void *parameter; /**< timeout function's parameter */rt_tick_t init_tick; /**< timer timeout tick */rt_tick_t timeout_tick; /**< timeout tick */
};
typedef struct rt_timer *rt_timer_t;
定时器删除函数
rt_err_t rt_timer_delete(rt_timer_t timer)
传入参数就是动态创建的定时器,返回值是错误码
#include <rtthread.h>#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>rt_timer_t tm1;//定义一个参数用于接收创建定时器后的返回值void time1out_callback(void *parameter)//创建一个回调函数
{}int main(void)
{tm1 = rt_timer_create("tm1_demo", time1out_callback, NULL, 3000, \RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER );//创建一个软件定时器,周期触发模式if(tm1 == RT_NULL)//如果创建失败{LOG_E("rt_timer_create failed...\n");return -RT_ENOMEM;}LOG_D("rt_timer_create successed...\n");//如果创建成功return RT_EOK;
}
在终端用list_timer查看定时器线程,可以看到成功创建了一个软件定时器,但是还没有启动,超时时间为0
使用函数rt_err_t rt_timer_start(rt_timer_t timer)
启动定时器
再次查看定时器状态,也已经是启动状态
静态创建定时器
使用的函数
void rt_timer_init(rt_timer_t timer,const char *name,void (*timeout)(void *parameter),void *parameter,rt_tick_t time,rt_uint8_t flag)
函数没有返回值,第一个参数是定时器句柄,即要定义一个rt_timer_t
类型的结构体变量,然后传入,第二个参数是定时器的名字,第三个参数是超时的回调函数,第四个参数是传给回调函数的参数,第五个参数是超时时间,第六个参数是flag,与动态创建不同的是是否需要我们自己手动申请内存
对应的脱离函数
rt_err_t rt_timer_detach(rt_timer_t timer)
即将静态初始化的定时器从链表中移除
#include <rtthread.h>#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>rt_timer_t tm1;//定义一个参数用于接收创建定时器后的返回值struct rt_timer tm2;//定义一个结构体,用于静态创建定时器void time1out_callback(void *parameter)//创建一个回调函数
{rt_kprintf("tm1 running...\n");//3s打印一次
}void time2out_callback(void *parameter)//静态定时器回调函数
{rt_kprintf("tm2 running...\n");//3s打印一次
}int main(void)
{//动态创建tm1 = rt_timer_create("tm1_demo", time1out_callback, NULL, 3000, \RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER );//创建一个软件定时器,周期触发模式if(tm1 == RT_NULL)//如果创建失败{LOG_E("rt_timer_create failed...\n");return -RT_ENOMEM;}LOG_D("rt_timer_create successed...\n");//如果创建成功rt_timer_start(tm1);//启动定时器//静态创建rt_timer_init(&tm2, "tm2_demo", time2out_callback, NULL, 3000, \RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER);rt_timer_start(&tm2);//启动定时器,传入的是地址return RT_EOK;
}
定时器控制
让定时器停止,与启动函数一般是成对出现
rt_err_t rt_timer_stop(rt_timer_t timer)
控制定时器
rt_err_t rt_timer_control(rt_timer_t timer, int cmd, void *arg)//cmd
#define RT_TIMER_CTRL_SET_TIME 0x0 /**< set timer control command */
#define RT_TIMER_CTRL_GET_TIME 0x1 /**< get timer control command */
#define RT_TIMER_CTRL_SET_ONESHOT 0x2 /**< change timer to one shot */
#define RT_TIMER_CTRL_SET_PERIODIC 0x3 /**< change timer to periodic */
#define RT_TIMER_CTRL_GET_STATE 0x4 /**< get timer run state active or deactive*/
#define RT_TIMER_CTRL_GET_REMAIN_TIME 0x5 /**< get the remaining hang time */
在定时器2的回调函数中修改定时器2的超时时间,从3s变为1s,并打印系统tick时间,方便观察
可以看到第一次打印时间是3s后,后面的都为1s打印一次
让定时器2触发5次后,改为单次触发
在循环触发5次后,定时器2再触发
触发模式也确实变成了单次触发
高精度延时函数
注意:这个函数只支持低于1个OS Tick的延时, 否则SysTick会出现溢出而不能够获得指定的延时时间
即该函数只适用于延时低于一个系统tick,即低于1ms时使用,此函数是us级别的
void rt_hw_us_delay(rt_uint32_t us)
相关文章:
RT-Thread学习笔记(三)
RT-Thread学习笔记 时钟管理时钟节拍获取系统节拍定时器系统定时器初始化定时器工作机制动态创建定时器静态创建定时器定时器控制高精度延时函数 时钟管理 操作系统需要通过时间来规范其任务 时钟节拍 任何操作系统都需要提供一个时钟节拍,以供系统处理所有和时间…...
【HTTPS协议原理】数据加密、如何防止中间人攻击、证书和签名、HTTPS完整工作流程
⭐️个人主页:小羊 ⭐️所属专栏:Linux网络 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 数据加密常见的加密方式数据摘要方案一:仅使用对称加密方案二:仅使用非对称加密方案三:双…...
Springboot 集成 RBAC 模型实战指南
RBAC 模型核心原理 详情可参考之前的笔记:https://blog.csdn.net/qq_35201802/article/details/146036789?spm1011.2415.3001.5331 RBAC 定义与优势 RBAC(Role-Based Access Control,基于角色的访问控制)** 是一种通过角色关联…...
C++继承(最详细)
目录 1.继承的概念以及定义 1.1 继承的概念 1.2 继承的定义 编辑 2.继承中的作用域 3.基类和派生类间的转换 4.派生类的默认成员函数 5.实现不被继承的类 6.継承与友元 编辑 7.继承与静态成员 8.多继承及其菱形继承问题 8.2 虚继承 8.3 来看一个小题 9.继承…...
【使用Plink检测ROH问题查找】为什么检测ROH参数不一样,FROH近交系数结果差异很大?
为什么检测ROH参数不一样,结果差异很大? 结果 基于ROH检测的结果与参数设置密切相关。参数的改变(对应近交系数改变)可能会对结果产生很大影响。 原因 ROH分析缺乏共识标准,这种缺乏共识将导致结果偏倚,…...
mybatis mapper.xml中使用枚举
重点:application.propertis配置类 #TypeEnumHandler 这个类的包名,不是全路径 mybatis.type-handlers-packagecom.fan.test.handler两个枚举类: public enum StatusEnum {DELETED(0),ACTIVE(1);private final int code;StatusEnum(int cod…...
探索科技的边界:代理IP与汽车产业链的创新之旅
目录 一、代理IP:汽车产业的"数字放大镜" 二、创新应用场景:从实验室到量产线 三、技术挑战与进化方向 四、未来图景:车联网时代的"数字血管" 结语:重构产业认知的"数字齿轮" 在数字化浪潮席卷…...
单个或批量实现-提取PDF文档中的合同号和姓名并按“合同号_姓名”格式重命名文件。
第一、单个PDF文件命名格式: 提取PDF文档中的合同号和姓名并按“合同号_姓名”格式重命名文件 import pdfplumber import re import osdef extract_contract_info(pdf_path):with pdfplumber.open(pdf_path) as pdf:for page in pdf.pages:text page.extract_tex…...
虚拟机的网络配置
第一章 配置网络(注意NAT类型) 1. 在VMware中配置 虚拟网络编译器 1) 点击编辑 就会出现 虚拟网络编译器 并点击(要再虚拟机关机的情况下进行) 2)点击右下角的 更改设置 再点击 VMnet 红色框里192.168.x…...
JAVA设计模式——(二)组合模式
JAVA设计模式——(二)组合模式 原理解释实现定义规范接口定义主干定义分支定义叶子测试代码 优势 原理 组合模式用于描述对象在“整体-部分”中的关系,用户对单个对象和组合对象的使用具有一致性。 组合模式中由于单个对象和组合对象的使用…...
【数据结构和算法】5. 堆栈和队列
本文根据 数据结构和算法入门 视频记录 文章目录 1. 堆栈(Stack)1.1 概念1.2 数组栈实现1.3 链式栈实现 2. 队列(Queue)2.1 概念2.2 数组队列实现2.3 链式队列实现 在这一章我们来了解两个很特殊的数据结构:堆栈 (Stac…...
万字长文 | Apache SeaTunnel 分离集群模式部署 K8s 集群实践
文章作者:雷宝鑫 整理排版:白鲸开源 曾辉 Apache SeaTunnel官网链接: https://seatunnel.apache.org/ Apache SeaTunnel(以下简称SeaTunnel)是一款新一代高性能、分布式的数据集成同步工具,正受到业界广泛关注和应用。SeaTunnel支…...
逻辑回归:使用 S 型函数进行概率预测
逻辑回归:使用 S 型函数进行概率预测 摘要 本文章深入探讨了逻辑回归模型如何利用 S 型函数将线性回归的输出转换为概率值。文章详细阐述了 S 型函数的数学原理、在逻辑回归中的应用以及其在机器学习中的重要性。通过具体示例和练习,帮助读者理解如何使…...
马浩棋:产通链CT-Chain 破局不动产 RWA,引领数智金融新变革
全球不动产 RWA 数智金融高峰论坛上马浩棋先生致辞 在全球不动产 RWA 数智金融高峰论坛暨产通链 CT-Chain 上链首发会的现场,犀牛世纪集团(香港)有限公司董事会主席马浩棋成为众人瞩目的焦点。此次盛会汇聚了全球金融、区块链及不动产领域的…...
iscsi服务端安装及配置
1. 安装targetcli软件包 yum install -y targetcli 2. 启动target服务 systemctl start target systemctl enable target 3. 配置防火墙 firewall-cmd --add-port"3260/tcp" 3. 准备一个物理分区(或者逻辑分区)…...
常见的神经网络权重文件格式及其详细说明
常见的神经网络权重文件格式及其详细说明的表格: 扩展名所属框架/工具如何生成表示内容使用方法注意事项.pt, .pthPyTorchtorch.save(model.state_dict(), "model.pt")PyTorch模型的状态字典(权重和参数)或整个模型加载方式&#…...
帕金森发病类型和阶段
文章目录 直观认识帕金森综合症的类型一、原发性帕金森综合征二、继发性(获得性)帕金森综合征三、帕金森叠加综合征(Atypical Parkinsonism)四、遗传性帕金森综合征五、其他罕见类型推荐文献与资源 PD的病理分期理论(B…...
基于ssm的“安家”儿童福利院管理系统(源码+文档)
项目简介 “安家”儿童福利院实现了以下功能: “安家”儿童福利院管理系统的主要使用者分为管理员:儿童管理、申请领养管理、捐赠管理、楼栋管理、宿舍管理、分配信息管理、宿舍物品管理、报修管理、维修工管理、报修状态管理、留言管理、系统管理。 用…...
闲聊人工智能对媒体的影响
技术总是不断地改变信息的传播方式。互联网促进了社交媒体的蓬勃发展。 网络媒体成为主流。大语言模型为代表的人工智能的出现,又会对媒体传播带来怎样的改变呢?媒体的演变反映了社会和技术的演变。 人工智能(AI) 将继续对整个媒体行业产生变革性的影响。…...
健身房管理系统(springboot+ssm+vue+mysql)含运行文档
健身房管理系统(springbootssmvuemysql)含运行文档 健身房管理系统是一个全面的解决方案,旨在帮助健身房高效管理其运营。系统提供多种功能模块,包括会员管理、员工管理、会员卡管理、教练信息管理、解聘管理、健身项目管理、指导项目管理、健身器材管理…...
离散化区间和 java c++
文章目录 题面解题思路javacpp 题面 题目链接:点击传送 假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。 现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。 接下来,进行 m 次询问,每…...
「数据可视化 D3系列」入门第十二章:树状图详解与实践
树状图深度解析与实现 一、核心API解析1. d3.hierarchy2. d3.tree3. 节点操作方法 二、完整实现解析三、高级技巧与优化四、常见问题解决小结下章预告:地图可视化 树状图是一种常见的层次结构可视化方式,它能够清晰地展示数据之间的父子关系。本文将详细…...
IDEA 创建Maven 工程(图文)
设置Maven 仓库 打开IDEA 开发工具,我的版本是2024.3.1(每个版本的位置不一样)。在【Customize】选项中,可以直接设置【语言】,在最下面选择【All setting】。 进入到熟悉的配置界面,选择配置的【setting…...
机器学习06-RNN
RNN(循环神经网络)学习笔记 一、RNN 概述 循环神经网络(Recurrent Neural Network,RNN)是一类以序列数据为输入,在序列的演进方向进行递归且所有节点(循环单元)按链式连接的递归神…...
Java常用正则表达式及使用方法
在 Java 中,Pattern 和 Matcher 类是 java.util.regex 包的核心,用于处理正则表达式。 Pattern 类 Pattern 类表示编译后的正则表达式,它提供了一种将正则表达式字符串编译成可执行对象的方式,以便后续用于匹配操作。 常用方法…...
新零售行业时代:如何用科技驱动传统零售的转型升级
新零售行业时代:如何用科技驱动传统零售的转型升级 “在变化的世界中,唯一不变的是变化本身。” 一、传统零售的困局:当“生存”成为一场鏖战 街角的便利店老板老王,每天凌晨4点起床进货,却在月…...
DeepSeek和Excel结合生成动态图表
文章目录 一、前言二、3D柱状图案例2.1、pyecharts可视化官网2.2、Bar3d-Bar3d_puch_card2.3、Deepseek2.4、WPS2.5、动态调整数据 一、前言 最近在找一些比较炫酷的动态图表,用于日常汇报,于是找到了 DeepseekExcel王牌组合,其等同于动态图…...
大模型学习笔记------Llama 3模型架构之分组查询注意力(GQA)
大模型学习笔记------Llama 3模型架构之分组查询注意力(GQA) 1、分组查询注意力(GQA)的动机2、 多头注意力(Multi-Head Attention, MHA)3、 多查询注意力 (Multi-Query Attention,MQA)4、 分组查…...
WordPress 只能访问html文件,不能访问php
部署WordPress 遇到的问题 说来惭愧,尝试了多次流程,输入ip能够访问到配置路径下面的html文件,但就是无法访问php文件,查来查去,最后在AI工具的逐一梳理下,是PHP-FPM配置下面出的问题,默认账号…...
Python 之 pyecharts 使用
要说绘制动态图表,echarts 肯定是有一席之地的,特别是像 flask 这种轻量级的 web 框架,在 html 中动态嵌入生成 echarts 无疑是很优的选择。pyecharts 简单来说就是以 python 的方式来生成对应的 echarts 图表。 安装 pip install pyechart…...
【第九章 Python学习之函数Ⅱ】
【2025】Python最新最完整教程,零基础看这一个就够了 第九章 Python学习之函数Ⅱ 文章目录 【2025】Python最新最完整教程,零基础看这一个就够了前言一、说两句二、定义函数函数定义规则函数的参数参数的类型及用途1. 必需参数(位置参数)2. 关键字参数3. 默认参数4. 可变参…...
传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。此 RPC 请求中提供了过多的参数。最多应为 2100。
### Error updating database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。此 RPC 请求中提供了过多的参数。最多应为 2100。 这是因为集合数据量过大,需要对集合进行拆分操作࿰…...
IDEA热加载
翻译:"你运行的应用程序 BfApplication 启动之后,它的一些类文件(通常是你修改过的 .java 文件被重新编译了)发生了变化。你想现在就重新加载这些更改过的类吗?" 解释: 热重载: 这是一种开发时非常有用的技术。当你…...
常用第三方库:dio网络库使用与封装
常用第三方库:dio网络库使用与封装 前言 dio是Flutter生态中最受欢迎的网络请求库之一,它提供了强大的功能和灵活的配置选项。本文将从实战角度深入介绍dio的使用技巧和最佳实践。 基础知识 1. dio简介 dio是一个强大的Dart Http请求库,…...
解决IntelliJ IDEA配置文件(application.properties)中文注释变成乱码的问题
文章目录 1. 问题呈现2. 问题产生的原因3. 解决方法 更多 IntelliJ IDEA 的使用技巧可查看 IntelliJ IDEA 专栏中的文章:IntelliJ IDEA 1. 问题呈现 在 IntelliJ IDEA 中打开配置文件(application.properties)时,文件中的中文注…...
linux基础14--dns和web+dns
DNS:域名系统(Domain Name System) DNS协议是用来将域名转换为IP地址或将IP地址转换为相应的域名 DNS使用TCP和UDP端口53,给用户提供解析时一般使用UDP53 对于每一级域名长度的限制是63个字符,域名总长度则不能超过2…...
Java 静态内部类面试题与高质量答案合集
本文整理了关于 Java 静态内部类(Static Nested Class)在面试中的高频问题及标准答案,帮助你理解其底层原理、内存表现以及实际应用。 1. 什么是静态内部类?和普通内部类有什么区别? 答: 静态内部类是定义…...
React.cloneElement的用法详解
React.cloneElement的用法详解 React.cloneElement 是 React 提供的一个 API,用于克隆现有的 React 元素,并在克隆的基础上添加或覆盖属性,同时保留原有的子元素。 语法 React.cloneElement(element: ReactElement, props?: Partial<P…...
【数学建模】孤立森林算法:异常检测的高效利器
孤立森林算法:异常检测的高效利器 文章目录 孤立森林算法:异常检测的高效利器1 引言2 孤立森林算法原理2.1 核心思想2.2 算法流程步骤一:构建孤立树(iTree)步骤二:构建孤立森林(iForest)步骤三:计算异常分数 3 代码实现…...
3.1 WPF使用MaterialDesign的介绍1
MaterialDesignInXAML Toolkit 是一个流行的开源 C# WPF 控件库,它实现了 Google 的 Material Design 规范,让开发者可以轻松创建现代化的 WPF 应用程序界面 Material Design 是一个流行的设计语言,由 Google 开发,旨在帮助开发者构建美观且一致的 UI 界面。对于使用 C# 的…...
多路转接select服务器
目录 select函数原型 select服务器 select的缺点 前面介绍过多路转接就是能同时等待多个文件描述符,这篇文章介绍一下多路转接方案中的select的使用 select函数原型 #include <sys/select.h> int select(int nfds, fd_set *readfds, fd_set *writefds, f…...
【算法】BFS-解决FloodFill问题
目录 FloodFill问题 图像渲染 岛屿数量 岛屿的最大面积 被围绕的区域 FloodFill问题 FloodFill就是洪水灌溉的意思,假设有下面的一块田地,负数代表是凹地,正数代表是凸地,数字的大小表示凹或者凸的程度。现在下一场大雨&…...
二叉树层序遍历技术解析与面试指南
文章目录 一、二叉树层序遍历技术解析1. 问题描述2. 层序遍历核心思想3. Java实现代码(带详细注释)4. 算法关键点解析5. 复杂度分析 二、资深后端面试深度指南1. 高频面试问题集Q1: 如何实现Z字形层序遍历(锯齿形遍历)?…...
软考软件设计师考试情况与大纲概述
文章目录 **一、考试科目与形式****二、考试大纲与核心知识点****科目1:计算机与软件工程知识****科目2:软件设计** **三、备考建议****四、参考资料** 这是一个系列文章的开篇 本文对2025年软考软件设计师考试的大纲及核心内容进行了整理,并…...
一款丰富的工作流自动化平台 | N8N 83.6K ⭐
N8N 介绍 N8N 是一个工作流自动化平台,为技术团队提供代码的灵活性和无代码的速度。n8n 具有 400 集成、原生 AI 功能和公平代码许可证,可让您构建强大的自动化功能,同时保持对数据和部署的完全控制。 🚢 项目地址 Github: https…...
Apache PDFBox
Apache PDFBox 是一个用于处理 PDF 文档的开源 Java 库,由 Apache 软件基金会开发和维护。它提供了丰富的功能,允许开发者在 Java 应用程序中创建、读取、修改和提取 PDF 文件中的信息。以下是关于 PDFBox 的详细介绍: 主要功能 创建 PDF 文…...
如何批量为多个 Word 文档添加水印保护
在日常办公中,Word文档添加水印是一项重要的操作,特别是在需要保护文件内容的安全性和版权时。虽然Office自带了添加水印的功能,但当需要一次性给多个Word文档添加水印时,手动操作显得非常繁琐且低效。为了提高效率,可…...
【MySQL】005.MySQL表的约束(上)
文章目录 表的约束1. 约束概念2. 空属性2.1 基本语法2.2 使用示例 3. 默认值3.1 基本概念3.2 使用示例 4. 列描述4.1 基本概念4.2 使用示例 5. zerofill5.1 基本功能5.2 使用示例5.3 注意事项 6. 主键6.1 基本概念6.2 使用示例 表的约束 1. 约束概念 真正约束字段的是数据类型…...
力扣刷题Day 27:环形链表(141)
1.题目描述 2.思路 创建一个结点集合,遍历链表,如果遇到已经加进集合的结点就说明链表有环。 3.代码(Python3) class Solution:def hasCycle(self, head: Optional[ListNode]) -> bool:node headnode_set set()while node…...
window上 elasticsearch v9.0 与 jmeter5.6.3版本 冲突,造成es 启动失败
[2025-04-22T11:00:22,508][ERROR][o.e.b.Elasticsearch ] [AIRUY] fatal exception while booting Elasticsearchjava.nio.file.NoSuchFileException: D:\Program Files\apache-jmeter-5.6.3\lib\logkit-2.0.jar 解决方案: 降低 es安装版本 ,选择…...