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

FreeRTOS软件定时器

软件定时器就是"闹钟",你可以设置闹钟,

用软件定时器的话USE_TIMER要设置为1

  • 在30分钟后让你起床工作
  • 每隔1小时让你例行检查机器运行情况

软件定时器也可以完成两类事情:

  • 在"未来"某个时间点,运行函数
  • 周期性地运行函数

日常生活中我们可以定无数个"闹钟",这无数的"闹钟"要基于一个真实的闹钟。

在FreeRTOS里,我们也可以设置无数个"软件定时器",它们都是基于系统滴答中断(Tick Interrupt)。

本章涉及如下内容:

  • 软件定时器的特性
  • Daemon Task
  • 定时器命令队列
  • 一次性定时器、周期性定时器的差别
  • 怎么操作定时器:创建、启动、复位、修改周期

16.2.2 守护任务的调度(就是定时管理任务,用来唤醒其他任务的任务)

守护任务的调度,跟普通的任务并无差别。当守护任务是当前优先级最高的就绪态任务时,它就可以运行。它的工作有两类:

  • 处理命令:从命令队列里取出命令、处理
  • 执行定时器的回调函数

能否及时处理定时器的命令、能否及时执行定时器的回调函数,严重依赖于守护任务的优先级。下面使用2个例子来演示。

例子1:守护任务的优先性级较低

  • t1:Task1处于运行态,守护任务处于阻塞态。 守护任务在这两种情况下会退出阻塞态切换为就绪态:命令队列中有数据、某个定时器超时了。 至于守护任务能否马上执行,取决于它的优先级。
  • t2:Task1调用 xTimerStart() 要注意的是,xTimerStart() 只是把"start timer"的命令发给"定时器命令队列",使得守护任务退出阻塞态。 在本例中,Task1的优先级高于守护任务,所以守护任务无法抢占Task1。
  • t3:Task1执行完 xTimerStart() 但是定时器的启动工作由守护任务来实现,所以*xTimerStart()*返回并不表示定时器已经被启动了。
  • t4:Task1由于某些原因进入阻塞态,现在轮到守护任务运行。 守护任务从队列中取出"start timer"命令,启动定时器。
  • t5:守护任务处理完队列中所有的命令,再次进入阻塞态。Idel任务时优先级最高的就绪态任务,它执行。
  • 注意:假设定时器在后续某个时刻tX超时了,超时时间是"tX-t2",而非"tX-t4",从 xTimerStart() 函数被调用时算起。

例子2:守护任务的优先性级较高

  • t1:Task1处于运行态,守护任务处于阻塞态。 守护任务在这两种情况下会退出阻塞态切换为就绪态:命令队列中有数据、某个定时器超时了。 至于守护任务能否马上执行,取决于它的优先级。

  • t2:Task1调用xTimerStart() 要注意的是,*xTimerStart()只是把"start timer"的命令发给"定时器命令队列",使得守护任务退出阻塞态。 在本例中,守护任务的优先级高于Task1,所以守护任务抢占Task1,守护任务开始处理命令队列。 Task1在执行xTimerStart()*的过程中被抢占,这时它无法完成此函数。

  • t3:守护任务处理完命令队列中所有的命令,再次进入阻塞态。 此时Task1是优先级最高的就绪态任务,它开始执行。

  • t4:Task1之前被守护任务抢占,对*xTimerStart()*的调用尚未返回。现在开始继续运行次函数、返回。

  • t5:Task1由于某些原因进入阻塞态,进入阻塞态。Idel任务时优先级最高的就绪态任务,它执行。

注意,定时器的超时时间是基于调用 xTimerStart() 的时刻tX,而不是基于守护任务处理命令的时刻tY。假设超时时间是10个Tick,超时时间是"tX+10",而非"tY+10"。

16.2.3 回调函数

定时器的回调函数的原型如下:

void ATimerCallback( TimerHandle_t xTimer );

定时器的回调函数是在守护任务中被调用的,守护任务不是专为某个定时器服务的,它还要处理其他定时器。

所以,定时器的回调函数不要影响其他人:

  • 回调函数要尽快实行,不能进入阻塞状态
  • 不要调用会导致阻塞的API函数,比如 vTaskDelay()
  • 可以调用 xQueueReceive() 之类的函数,但是超时时间要设为0:即刻返回,不可阻塞

16.3 软件定时器的函数

根据定时器的状态转换图,就可以知道所涉及的函数:

16.3.1 创建

要使用定时器,需要先创建它,得到它的句柄。

有两种方法创建定时器:动态分配内存、静态分配内存。函数原型如下:

/* 使用动态分配内存的方法创建定时器* pcTimerName:定时器名字, 用处不大, 尽在调试时用到* xTimerPeriodInTicks: 周期, 以Tick为单位* uxAutoReload: 类型, pdTRUE表示自动加载, pdFALSE表示一次性* pvTimerID: 回调函数可以使用此参数, 比如分辨是哪个定时器* pxCallbackFunction: 回调函数* 返回值: 成功则返回TimerHandle_t, 否则返回NULL*/
TimerHandle_t xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks,const UBaseType_t uxAutoReload,void * const pvTimerID,TimerCallbackFunction_t pxCallbackFunction );/* 使用静态分配内存的方法创建定时器* pcTimerName:定时器名字, 用处不大, 尽在调试时用到* xTimerPeriodInTicks: 周期, 以Tick为单位
(不直观可以用pdMS_TO_TICKS()函数可以把毫秒转换为TICK)* uxAutoReload: 类型, pdTRUE表示自动加载, pdFALSE表示一次性* pvTimerID: 回调函数可以使用此参数, 比如分辨是哪个定时器* pxCallbackFunction: 回调函数* pxTimerBuffer: 传入一个StaticTimer_t结构体, 将在上面构造定时器* 返回值: 成功则返回TimerHandle_t, 否则返回NULL*/
TimerHandle_t xTimerCreateStatic(const char * const pcTimerName,TickType_t xTimerPeriodInTicks,UBaseType_t uxAutoReload,void * pvTimerID,TimerCallbackFunction_t pxCallbackFunction,StaticTimer_t *pxTimerBuffer );

回调函数的类型是:

void ATimerCallback( TimerHandle_t xTimer );typedef void (* TimerCallbackFunction_t)( TimerHandle_t xTimer );

16.3.2 删除

动态分配的定时器,不再需要时可以删除掉以回收内存。删除函数原型如下:

/* 删除定时器* xTimer: 要删除哪个定时器* xTicksToWait: 超时时间* 返回值: pdFAIL表示"删除命令"在xTicksToWait个Tick内无法写入队列*        pdPASS表示成功
*/
BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait );

定时器的很多API函数,都是通过发送"命令"到命令队列,由守护任务来实现。

如果队列满了,"命令"就无法即刻写入队列。我们可以指定一个超时时间 xTicksToWait ,等待一会。

16.3.3 启动/停止

启动定时器就是设置它的状态为运行态(Running、Active)。

停止定时器就是设置它的状态为冬眠(Dormant),让它不能运行。

涉及的函数原型如下:

/* 启动定时器* xTimer: 哪个定时器* xTicksToWait: 超时时间* 返回值: pdFAIL表示"启动命令"在xTicksToWait个Tick内无法写入队列*        pdPASS表示成功*/
BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );/* 启动定时器(ISR版本)* xTimer: 哪个定时器* pxHigherPriorityTaskWoken: 向队列发出命令使得守护任务被唤醒,*                            如果守护任务的优先级比当前任务的高,*                            则"*pxHigherPriorityTaskWoken = pdTRUE",*                            表示需要进行任务调度* 返回值: pdFAIL表示"启动命令"无法写入队列*        pdPASS表示成功*/
BaseType_t xTimerStartFromISR(   TimerHandle_t xTimer,BaseType_t *pxHigherPriorityTaskWoken );/* 停止定时器* xTimer: 哪个定时器* xTicksToWait: 超时时间* 返回值: pdFAIL表示"停止命令"在xTicksToWait个Tick内无法写入队列*        pdPASS表示成功*/
BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait );/* 停止定时器(ISR版本)* xTimer: 哪个定时器* pxHigherPriorityTaskWoken: 向队列发出命令使得守护任务被唤醒,*                            如果守护任务的优先级比当前任务的高,*                            则"*pxHigherPriorityTaskWoken = pdTRUE",*                            表示需要进行任务调度* 返回值: pdFAIL表示"停止命令"无法写入队列*        pdPASS表示成功*/
BaseType_t xTimerStopFromISR(    TimerHandle_t xTimer,BaseType_t *pxHigherPriorityTaskWoken );

注意,这些函数的 xTicksToWait 表示的是,把命令写入命令队列的超时时间。命令队列可能已经满了,无法马上把命令写入队列里,可以等待一会。

xTicksToWait 不是定时器本身的超时时间,不是定时器本身的"周期"。

创建定时器时,设置了它的周期(period)。xTimerStart() 函数是用来启动定时器。假设调用 xTimerStart() 的时刻是tX,定时器的周期是n,那么在tX+n时刻定时器的回调函数被调用。

如果定时器已经被启动,但是它的函数尚未被执行,再次执行 xTimerStart() 函数相当于执行 xTimerReset() ,重新设定它的启动时间。

还有一个更简单的函数,如果你是在CubeMX里创建的定时器

osTimerStart(任务句柄,定时时间ms)

16.3.4 复位

从定时器的状态转换图可以知道,使用 xTimerReset() 函数可以让定时器的状态从冬眠态转换为运行态,相当于使用 xTimerStart() 函数。

如果定时器已经处于运行态,使用 xTimerReset() 函数就相当于重新确定超时时间。假设调用 xTimerReset() 的时刻是tX,定时器的周期是n,那么tX+n就是重新确定的超时时间。

复位函数的原型如下:

/* 复位定时器* xTimer: 哪个定时器* xTicksToWait: 超时时间* 返回值: pdFAIL表示"复位命令"在xTicksToWait个Tick内无法写入队列*        pdPASS表示成功*/
BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait );/* 复位定时器(ISR版本)* xTimer: 哪个定时器* pxHigherPriorityTaskWoken: 向队列发出命令使得守护任务被唤醒,*                            如果守护任务的优先级比当前任务的高,*                            则"*pxHigherPriorityTaskWoken = pdTRUE",*                            表示需要进行任务调度* 返回值: pdFAIL表示"停止命令"无法写入队列*        pdPASS表示成功*/
BaseType_t xTimerResetFromISR(   TimerHandle_t xTimer,BaseType_t *pxHigherPriorityTaskWoken );

16.3.5 修改周期

从定时器的状态转换图可以知道,使用 xTimerChangePeriod() 函数,处理能修改它的周期外,还可以让定时器的状态从冬眠态转换为运行态。

修改定时器的周期时,会使用新的周期重新计算它的超时时间。假设调用 xTimerChangePeriod() 函数的时间tX,新的周期是n,则tX+n就是新的超时时间。

相关函数的原型如下:

/* 修改定时器的周期* xTimer: 哪个定时器* xNewPeriod: 新周期* xTicksToWait: 超时时间, 命令写入队列的超时时间 * 返回值: pdFAIL表示"修改周期命令"在xTicksToWait个Tick内无法写入队列*        pdPASS表示成功*/
BaseType_t xTimerChangePeriod(   TimerHandle_t xTimer,TickType_t xNewPeriod,TickType_t xTicksToWait );/* 修改定时器的周期* xTimer: 哪个定时器* xNewPeriod: 新周期* pxHigherPriorityTaskWoken: 向队列发出命令使得守护任务被唤醒,*                            如果守护任务的优先级比当前任务的高,*                            则"*pxHigherPriorityTaskWoken = pdTRUE",*                            表示需要进行任务调度* 返回值: pdFAIL表示"修改周期命令"在xTicksToWait个Tick内无法写入队列*        pdPASS表示成功*/
BaseType_t xTimerChangePeriodFromISR( TimerHandle_t xTimer,TickType_t xNewPeriod,BaseType_t *pxHigherPriorityTaskWoken );

16.3.6 定时器ID

定时器的结构体如下,里面有一项 pvTimerID ,它就是定时器ID:

怎么使用定时器ID,完全由程序来决定:

  • 可以用来标记定时器,表示自己是什么定时器
  • 可以用来保存参数,给回调函数使用

它的初始值在创建定时器时由 xTimerCreate() 这类函数传入,后续可以使用这些函数来操作:

  • 更新ID:使用 vTimerSetTimerID() 函数
  • 查询ID:查询 pvTimerGetTimerID() 函数

这两个函数不涉及命令队列,它们是直接操作定时器结构体。

函数原型如下:

/* 获得定时器的ID* xTimer: 哪个定时器* 返回值: 定时器的ID*/
void *pvTimerGetTimerID( TimerHandle_t xTimer );/* 设置定时器的ID* xTimer: 哪个定时器* pvNewID: 新ID* 返回值: 无*/
void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID );

相关文章:

FreeRTOS软件定时器

软件定时器就是"闹钟",你可以设置闹钟, 用软件定时器的话USE_TIMER要设置为1 在30分钟后让你起床工作每隔1小时让你例行检查机器运行情况 软件定时器也可以完成两类事情: 在"未来"某个时间点,运行函数周期…...

Selenium三大等待

一、强制等待 1.设置完等待后不管有没有找到元素,都会执行等待,等待结束后才会执行下一步 2.实例: driver webdriver.Chrome()driver.get("https://www.baidu.com")time.sleep(3) # 设置强制等待driver.quit() 二、隐性等待 …...

【Ansible自动化运维】一、初步了解,开启自动化运维之旅

在当今数字化时代,随着企业 IT 基础设施规模的不断扩大,传统的手工运维方式逐渐显得力不从心。自动化运维技术应运而生,其中 Ansible 凭借其简洁易用、功能强大的特点,成为众多运维工程师和开发人员的首选工具。本篇文章将从基础概…...

雪花算法、md5加密

雪花算法生成ID是一个64位长整型(但是也可以通过优化简短位数) 组成部分: 时间戳 机器ID 序列号 用途: 分布式系统唯一ID生成:解决数据库自增ID在分布式环境下的唯一性问题、避免UUID的无序性和性能问题 有序性…...

micro介绍

micro介绍 Micro 的首要特点是易于安装(它只是一个静态的二进制文件,没有任何依赖关系)和易于使用Micro 支持完整的插件系统。插件是用 Lua 编写的,插件管理器可自动为你下载和安装插件。使用简单的 json 格式配置选项&#xff0…...

电视盒子 刷armbian

参考 中兴电视盒子中兴B860AV3.2-M刷Armbian新手级教程-CSDN博客 1.刷安卓9 带root版本 a. 下载安卓线刷包 链接:https://pan.baidu.com/s/1hz87_ld2lJea0gYjeoHQ8A?pwdd7as 提取码:d7as b.拆机短接 3.安装usbburning工具 使用方法 ,…...

(七)lerobot开源项目so100新版本全流程操作(操作记录)

目录 《项目简介》 一、环境配置 1、创建虚拟环境 2、克隆项目并安装所需包 二、主从臂硬件准备 1、舵机配置 (1)分别查看主从臂的开发板端口号 (2)分别设置主从臂的舵机 2、组装主从臂 3、查看主从臂端口号和相机端…...

智慧景区能源管理解决方案,为旅游“升温”保驾护航

景区能源管理 当下痛点 1 高峰期用电负荷大 节假日和旅游旺季等高峰期用电需求增大,电力供应不足、电网负荷过大; 2 设备维护困难 景区内电力设备多且散,包括发电机组、变电站、配电设备等,维护和管理困难,特别是…...

LCR 056. 两数之和 IV - 输入二叉搜索树

文章目录 题意思路代码 题意 题目链接 思路 代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), …...

AI搜索+法律咨询:在「事实重构」与「程序正义」的博弈场‌

已经写了股票和医疗相关的内容,今天聊一下AI搜索和法律结合的应用场景。AI搜索不替用户做选择,却让我们握住了法律武器的说明书。 ​​​​​​​一、AI重构事实:技术理想与法律现实的碰撞 ‌ 1、案例切入:AI能否还原车祸责任比…...

多模态大模型重塑自动驾驶:技术融合与实践路径全解析

目录 1、 引言:AI与自动驾驶的革命性融合 2、五大领先多模态模型解析 2.1 Qwen2.5-Omni:全模态集大成者 2.2. LLaVA:视觉语言理解专家 2.3. Qwen2-VL:长视频理解能手 2.4. X-InstructBLIP:跨模态理解框架 2.5. …...

海阳科技IPO:业务独立性、业绩稳定性、财务规范性存致命缺陷

三角形是最稳定的结构,它既是完美的相互制衡,又是有力的彼此支撑。 ——佚名 引 言 IPO审议指标、要求、规定众多,有无一个直接简单的公式?该公式可以直接将造假等“低劣”IPO项目排除在外? 在《奕泽财经》看来…...

PyTorch 与 Python 装饰器及迭代器的比较与应用

在深度学习和 Stable Diffusion(SD)训练过程中,PyTorch 不仅依赖于 Python 的基础特性,而且通过扩展和封装这些特性,提供了更高效、便捷的训练和推理方式。本文将从装饰器和迭代器两个方面详细解释 Python 中的原生实现…...

大数据(5)(基础概念)Spark从入门到实战:核心原理与大数据处理实战案例

目录 一、背景介绍1‌. 为什么需要Spark?‌‌2. Spark的诞生‌: 二、Spark核心原理1. ‌四大核心特性‌2. ‌核心架构‌3. ‌执行流程‌ 三、Spark实战案例案例1:单词计数(WordCount)案例2:实时流处理&…...

Ubuntu小练习

文章目录 一、远程连接1、通过putty连接2、查看putty运行状态3、通过Puuty远程登录Ubuntu4、添加新用户查看是否添加成功 5、用新用户登录远程Ubuntu6、使用VNC远程登录树莓派 二、虚拟机上talk聊天三、Opencv1、简单安装版(适合新手安装)2、打开VScode特…...

运行Spark会出现恶问题

1. 依赖冲突问题:Spark依赖众多组件,如Scala、Hadoop等。不同版本的依赖之间可能存在兼容性问题,导致Spark无法正常运行。比如,特定版本的Spark可能要求与之匹配的Scala版本,若使用了不兼容的Scala版本,会在…...

uniapp大文件分包

1. 在pages.json中配置 "subPackages":[{"root":pagesUser,"pages":[{"path":mine/xxx,"style":xxx },{"path":mine/xxx,"style":xxx}]},{"root":pagesIndex,"pages":[{"p…...

Git 源码打包、迁移、恢复和备份

介绍 Git 项目打包方式,适用于源码交付、迁移、备份等场景。 一 Git 仓库的两种类型 在实际项目开发与交付中,常接触 的 两种 Git 仓库: 仓库类型是否包含源码适用场景普通仓库是本地开发、运行、构建裸仓库否代码托管、只读交付、备份 普…...

Linux 内核网络协议栈中的 struct packet_type:以 ip_packet_type 为例

在 Linux 内核的网络协议栈中,struct packet_type 是一个核心数据结构,用于注册特定协议类型的数据包处理逻辑。它定义了如何处理特定协议的数据包,并通过协议类型匹配机制实现协议分发。本文将通过分析 ip_packet_type 的定义和作用,深入探讨其在网络协议栈中的重要性。 …...

LeetCodeHot100-第三章:数学

面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台 目录 🎈1、双指针:9. 回文数 🎈2、逻辑题 :66. 加一 🎈3、逻辑题:172. 阶乘后的零 🎈4、…...

JavaScript 错误处理:理解和应对异常

在编程中,错误是不可避免的,特别是在进行复杂的逻辑操作、与外部系统交互或处理用户输入时。错误处理是软件开发中非常重要的一部分,它可以帮助开发者提高应用的稳定性和可用性。本文将深入探讨JavaScript中的错误处理机制,如何利…...

LangGraph异步化sqlite checkpoint

安装 pip install langgraph-checkpoint-sqlite异步checkpiont初始化: from langgraph.checkpoint.sqlite.aio import AsyncSqliteSaver conn aiosqlite.connect(":memory:", check_same_threadFalse) memory AsyncSqliteSaver(conn)如果使用异步流式…...

StarRocks 助力首汽约车精细化运营

作者:任智红,首汽约车大数据负责人 更多交流,联系我们:https://wx.focussend.com/weComLink/mobileQrCodeLink/334%201%202/ffbe5 导读: 本文整理自首汽约车大数据负责人任智红在 StarRocks 年度峰会上的演讲&#xf…...

Versatile-OCR-Program:可以从复杂的教育材料(如试卷)中提取结构化数据的开源多模态OCR工具

Versatile-OCR-Program 此 OCR 系统专门设计用于以针对机器学习 (ML) 训练优化的格式从复杂的教育材料(如试卷)中提取结构化数据。它支持多语言文本、数学公式、表格、图表和图表,非常适合创建高质量的训练数据集。 主…...

时序数据库 TDengine Cloud 私有连接实战指南:4步实现数据安全传输与成本优化

小T导读:在物联网和工业互联网场景下,企业对高并发、低延迟的数据处理需求愈发迫切。本文将带你深入了解 TDengineCloud 如何通过全托管服务与私有连接,帮助企业实现更安全、更高效、更低成本的数据采集与传输,从架构解析到实际配…...

vue项目本地调试使用https

由于测试环境远程接口,是采用https协议,为了能正常携带cookie访问接口,需要把本地项目也采用https协议访问。前提是后端的cookie设置在二级域名下,且允许固定其他子域名跨域访问(需要在后端设置) 项目框架…...

【学习笔记】文件上传漏洞--二次渲染、.htaccess、变异免杀

目录 第十二关 远程包含地址转换 第十三关 突破上传删除 条件竞争 第十四关 二次渲染 第十五关 第十六关 第十七关 .htaccess 第十八关 后门免杀 第十九关 日志包含 第十二关 远程包含地址转换 延续第十一关,加一个文件头,上传成功&#xff0c…...

探秘 MQTT 协议:物联网的 “隐形桥梁”

在当今数字化时代,物联网技术正以前所未有的速度改变着我们的生活。从智能家居到工业自动化,从远程医疗到智能交通,无数设备相互连接、交换信息,构建起一个庞大而复杂的智能世界。而在这背后,有一个关键的 “隐形桥梁”…...

[ctfshow web入门] web24

前置知识 isset:判断这个变量是否声明且不为NULL,否则返回False mt_srand:设置随机数种子,如果不手动设置,那么系统会自动进行一次随机种子的设置 mt_rand:生成一个随机数,这个随机数与种子有个…...

Unity 实现伤害跳字

核心组件: Dotween TextMeshPro 过程轨迹如下图: 代码如下: using System.Collections; using System.Collections.Generic; using DG.Tweening; using TMPro; using UnityEngine; using UnityEngine.Pool;public class …...

在SQLark 中快速生成测试数据

在软件开发与数据库管理过程中,高质量的测试数据是保障系统稳定性和性能优化的关键。然而,手动构造仿真数据不仅耗时耗力,还难以覆盖多样化的测试场景。现在,可以使用 SQLark 的数据生成功能,通过 8大类47子类的数据规…...

Postman接口测试详解

一、为何使用postman postman是一款简单高效的接口测试工具,能够很方便发送接口请求,易于保存接口请求脚本,postman提供接口响应数据比对功能,可以设置预期结果作断言,还能把测试用例放在一个集合中批量执行&#xff…...

[ctfshow web入门] web30

信息收集 题目将flag system php不区分大小写地过滤了 解题 前置知识 print_r:php中用于打印数组 scandir:php中用于获取指点目录下的所以文件目录名 getcwd:获取当前目录 目录获取 这里提供两种方法 print_r(scandir(getcwd())); pri…...

ElasticSearch迁移数据

一、查询索引 1、查询所有索引 curl --user elastic:123456 -XGET "http://localhost:19200/_cat/indices?v&sindex" 2、查询索引配置 以索引名称hello为例 curl --user elastic:123456 -XGET "http://localhost:19200/hello/_settings?pretty" 3…...

ES:账号、索引、ILM

目录 笔记1:账号权限查看、查看账号、创建账号等查看所有用户查看特定用户验证权限修改用户权限删除用户 笔记2:索引状态和内容的查看等查看所有索引查看特定索引内容查看索引映射查看索引设置查看索引统计信息查看ILM策略 笔记1:账号权限查看…...

Spring MVC 逻辑视图(JSP、Thymeleaf、FreeMarker)与非逻辑视图(JSON、Excel、PDF、XML)详解及示例

Spring MVC 逻辑视图与非逻辑视图详解及示例 一、逻辑视图与非逻辑视图的定义 类型定义逻辑视图通过视图解析器(ViewResolver)将逻辑名称(如 success)映射到具体视图实现。非逻辑视图直接返回具体视图对象(如 JsonVie…...

开发体育赛事直播系统:实现聊天交友的私聊功能技术实现全方案解析

基于“东莞梦幻网络科技”体育赛事直播系统,展示前后端技术(PHP ThinkPHP Vue.js Android Java iOS OC)实现的“用户与用户之间私聊”完整方案,包括功能描述、界面效果、技术实现、数据结构、接口设计及关键代码示例。 一、私…...

UTF-8和GBK编码的区别和详细解释

各位看官,大家早安午安晚安呀~~~ 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连,小编尽全力做到更好 欢迎您分享给更多人哦 今天我们来学习:一个小的知识点—UTF-8和GBK编码的解释 1.关于bite位和进制的关系 1 个比特(bit&am…...

java导入excel更新设备经纬度度数或者度分秒

文章目录 一、背景介绍二、页面效果三、代码0.pom.xml1.ImportDevice.vue2.ImportDeviceError.vue3.system.js4.DeviceManageControl5.DeviceManageUserControl6.Repeater7.FileUtils8.ResponseModel9.EnumLongitudeLatitude10.词条 四、注意点本人其他相关文章链接 一、背景介…...

使用python访问mindie部署的vl多模态模型

说明 今天使用mindie1.0部署了qwen2_7b_vl模型,测试过程出现一些问题,这里总结下。 问题1:transformers版本太低 报错信息: [ERROR] [model_deploy_config.cpp:159] Failed to get vocab size from tokenizer wrapper with ex…...

github发布个人中英文简历网站CaoYongshengcys.github.io

在GitHub上创建个人主页(也称为GitHub Pages)是一个展示个人项目、技能和经历的好方法。以下是详细步骤: 1. 创建GitHub账号 • 如果你还没有GitHub账号,先访问GitHub官网注册一个账号。 • 选择一个专业的用户名,因…...

动态规划算法深度解析:0-1背包问题(含完整流程)

简介: 0-1背包问题是经典的组合优化问题:给定一组物品(每个物品有重量和价值),在背包容量限制下选择物品装入背包,要求总价值最大化且每个物品不可重复选取。 动态规划核心思想 通过构建二维状态表dp[i]…...

QML面试笔记--UI设计篇04交互控件

1. QML中常用交互控件 1.1. Button1.2. Slider1.3. ProgressBar1.4. TextField1.5. TextArea1.6. ComboBox1.7. CheckBox1.8. RadioButton1.9. Menu1.10. Dialog 1. QML中常用交互控件 在万物互联的智能时代,QML凭借其‌声明式语法‌和‌跨平台能力‌&#xff0c…...

【数学】线性代数(Python)

参考:https://aibydoing.com/notebooks/appendix01-01-linear-algebra-with-python 目录 矩阵的定义矩阵的运算矩阵的属性矩阵的分解矩阵的本质遗留问题 矩阵的定义 通过数组的维度来区分向量(1 维数组)、矩阵(2 维数组&#xff0…...

ragflow开启https访问:添加证书后,使用浏览器还是有警告,如何解决?

如果在 Windows 系统中安装了 PEM 证书(使用方法一通过证书管理器 MMC 导入),但浏览器仍然提示安全警告,可能有以下几个原因及解决方法: 1. 证书未正确安装到受信任的存储位置 问题:如果证书被导入到错误的存储位置(如“个人”而非“受信任的根证书颁发机构”),浏览器…...

vue.config.js配置代理(输出代理前后的地址)

devServer: {host: 0.0.0.0,port: port,open: true,before(app) {app.use((req, res, next) > {// console.log(原始地址:, req.originalUrl) // 原始地址,如 /api/some-api/xxxxxnext()})},proxy: {[process.env.VUE_APP_BASE_API]: {target: http://192.168.50…...

【八股文】http1.0和1.1的区别

http1.0默认使用短连接,每次请求都需要建立TCP连接(三次握手),响应完成后立即关闭连接,导致资源浪费和延迟增加。 支持通过Connection:Keep-alive 手动开启长连接,但需客户端和服务端显式协商 …...

【Prompt实战】邮件分类专家

本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权&am…...

K8S核心技术点

Pod,Service和Deployment的关系 Pod:Kubernetes 中最小的部署单元,用于运行容器化应用。 Service:提供服务发现和负载均衡,为 Pod 提供稳定的网络端点,ClusterIP,NodePort,LoadBala…...

Python手写“随机森林”解决鸢尾花数据集分类问题

Python使用“随机森林”解决鸢尾花数据集分类问题 任务描述解题1. 导入必要的库2. 数据采样函数 sample3. 设置随机种子和超参数4. 定义随机森林类 random_forest5. 加载数据集并划分训练集和测试集6. 创建并训练随机森林模型7. 进行预测并计算准确率 代码 任务描述 您的任务是…...