FreeRTOS低功耗总结
前言
Cortex-M核的MCU一般支持以下三种低功耗方式:
● 睡眠(Sleep)模式
● 停止(Stop)模式
● 待机(Standby)模式
睡眠模式
进入睡眠模式有两种指令:WFI(等待中断)和WFE(等待事件),
WFI进入睡眠模式后,任意中断都可唤醒。
WFE进入睡眠模式后,任意唤醒事件都可唤醒
FreeRTOS 使用 WFI 指令进入实现低功耗控制。
停止模式
在特定的条件下执行WFI(等待中断)或者WFE(等待事件)指令,保留SRAM数据,调压器正常工作或者低功耗,大部分时钟关闭。
由外部中断唤醒
待机模式
相比于停止,待机模式的功耗更低。在停止模式基础上,SRAM数据丢失,调压器也关闭,大部分寄存器内容也丢失
由wakeup引进,复位引脚,看门狗或者RTC退出
由于停止/待机模式下软件的正常运行功能都将无法使用,并且其实现需要特定的硬件设计及系统方案,不在本次总结的讨论范围内。
本次总结仅对FreeRTOS系统功能正常运行情况下的低功耗总结,即睡眠模式。
任务运行状态
FreeRTOS作为多任务实时操作系统,开发过程中研发难免需要对软件任务的状态进行查看,FreeRTOS提供了相关的接口用来查询相关状态,
void vTaskList( char *pcWriteBuffer ); | 获取当前所有任务状态 |
void vTaskGetRunTimeStats( char *pcWriteBuffer ); | 获取当前所有任务占用率 |
size_t xPortGetFreeHeapSize( void ) | 获取当前堆剩余字节数 |
size_t xPortGetMinimumEverFreeHeapSize( void ) | 获取历史堆最小剩余字节数 |
任务状态
void vTaskList( char *pcWriteBuffer )
FreeRTOSConfig.h 中 必须定义才能使用vTaskList
#define configUSE_TRACE_FACILITY 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
任务占用率
void vTaskGetRunTimeStats( char *pcWriteBuffer )
Abs time : 任务占用的tick数
% time : 占用率
FreeRTOSConfig.h 中 必须定义才能使用vTaskList
#define configGENERATE_RUN_TIME_STATS 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
configGENERATE_RUN_TIME_STATS 定义为1 后 还需要定义以下宏
统计定时器配置函数
portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
portGET_RUN_TIME_COUNTER_VALUE()/portALT_GET_RUN_TIME_COUNTER_VALUE(Time)
统计定时器值获取函数
方式1:高精度定时器
用户实现自己实现高精度定时器
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() configureTimeStats()//初始化硬件定时器#define portGET_RUN_TIME_COUNTER_VALUE() getRunTime()//获取定时器的计数值
优点:占用率计算准确
缺点:多使用硬件资源,多了个更高频率的定时器,影响性能
方式2:直接使用系统ticks
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() xTaskGetTickCount() //初始化执行一次
#define portGET_RUN_TIME_COUNTER_VALUE() xTaskGetTickCount()
优点:不占用额外任何资源,不影响性能
缺点:占用率计算精度不高
堆使用状态
size_t xPortGetFreeHeapSize( void ) //当前堆剩余字节数
size_t xPortGetMinimumEverFreeHeapSize( void ) //获取历史堆最小剩余字节数
关系到 FreeRTOSConfig.h 中的 configTOTAL_HEAP_SIZE 大小设置
#define configTOTAL_HEAP_SIZE ((size_t)(64 * 1024))
空闲任务
空闲任务是 FreeRTOS 必不可少的一个任务,因此,空闲任务的优先级肯定是最低的,FreeRTOS 在空闲任务中也会执行一些其他的处理。
vTaskStartScheduler()启动任务调度器的时候FreeRTOS会自动创建空闲任务,如果某个任务要调用函数 vTaskDelete()删除自身,那么这个任务的资源需要在空闲任务中释放掉。因此,空闲任务也需要一定的时间片执行。
对于系统而言,一般软件都不会CPU满额运行,大部分时间都处于空闲状态,若用户需要在空闲状态下做一些特殊处理,如低功耗模式、关闭某些外设、降低系统主频等。
FreeRTOS 提供了相关的功能,即钩子函数,可简单理解为回调函数
常见钩子函数如下
FreeRTOSConfig.h 宏定义 | 钩子函数 | 说明 |
configUSE_IDLE_HOOK | void vApplicationIdleHook(void) | 空闲回调 |
configUSE_TICK_HOOK | void vApplicationTickHook(void); | tick自加回调 |
configCHECK_FOR_STACK_OVERFLOW | void vApplicationStackOverflowHook(TaskHandle_t pxTask, char *pcTaskName) | 任务栈溢出回调 |
configUSE_MALLOC_FAILED_HOOK | void vApplicationMallocFailedHook(void) | 内存申请失败回调 |
configUSE_DAEMON_TASK_STARTUP_HOOK | void vApplicationDaemonTaskStartupHook( void ); | 定时器任务启动回调 |
定义举例
void vApplicationIdleHook(void)
{/* Enter sleep-mode */Cy_SysPm_Sleep(CY_SYSPM_WAIT_FOR_INTERRUPT);
}void vApplicationStackOverflowHook(TaskHandle_t *pxTask, signed char *pcTaskName)
{/* Remove warning for unused parameters */(void)pxTask;(void)pcTaskName;/* Print the error message with task name if debug is enabled in uart_debug.h file */DebugPrintf("Error! : RTOS - stack overflow in %s \r\n", pcTaskName);/* Halt the CPU */CY_ASSERT(0);
}void vApplicationMallocFailedHook(void)
{/* Print the error message if debug is enabled in uart_debug.h file */DebugPrintf("Error! : RTOS - Memory allocation failed \r\n");/* Halt the CPU */CY_ASSERT(0);
}
Idle低功耗
最简单的低功耗方式即:在空闲任务钩子函数中将处理器设置为低功耗模式
void vApplicationIdleHook(void)
{/* Enter sleep-mode */Cy_SysPm_Sleep(CY_SYSPM_WAIT_FOR_INTERRUPT);
}
几乎所有支持 RTOS 系统的MCU都可以使用这种方法实现低功耗,该方式有以下特点:
大多数场景下,系统时钟是由滴答定时器中断来提供的,系统时钟频率越高,那么滴答定时器中断频率也就越高,但中断MCU从睡眠模式中唤醒, 使得MCU周期性的进入和退出睡眠模式。因此,如果滴答定时器中断频率太高的话会导致大量的能量和时间消耗在进出睡眠模式中,这样导致的结果就是低功耗模式的作用被大大的削弱。
Tickless 低功耗
针对通用低功耗的问题,FreeRTOS提供了另一种低功耗方式,该方式不同MCU的支持可能存在不同,即为 Tickless 模式:
当处理器进入空闲任务周期以后就关闭系统节拍中断(滴答定时器中断),只有当其他中断发生或者其他任务需要处理的时候处理器才会被从低功耗模式中唤醒。
由此需要解决两个问题:
问题1:关闭系统节拍中断会导致系统节拍计数器停止,系统tick就会停止
FreeRTOS解决方法:
FreeRTOS 可通过另一定时器记录下系统节拍中断的关闭时间,当恢复的时候补上这段时间,如果是专用的低功耗处理器,该定时器一般都是用专用的低功耗定时器。
问题2:如何保证下一个要运行的任务能被准确的唤醒。即使处理器进入了低功耗模式,但是中断和应用层任务也要保证及时的响应和处理。 中断不用说,本身就可以唤醒。但是应用层任务就不行了,它无法将处理器从低功耗模式唤醒,无法唤醒就无法运行。
FreeRTOS解决方法:
计算在进入低功耗模式之前能够获取到还有多长时间切换到下一任务,借助新增的定时器,将其中断周期修改为低功耗运行时间,其中断到来后即可唤醒处理器。
以apollo为例,其官方支持Tickless模式并且提供相应文档说明,但cypress不支持
#define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 1 // Enable non-SysTick based Tick
#define configUSE_TICKLESS_IDLE 2 // Ambiq specific implementation for Tickless#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__))
extern uint32_t am_freertos_sleep(uint32_t);
extern void am_freertos_wakeup(uint32_t);#define configPRE_SLEEP_PROCESSING( time ) \do { \(time) = am_freertos_sleep(time); \} while (0);#define configPOST_SLEEP_PROCESSING(time) am_freertos_wakeup(time)
#endif
/*-----------------------------------------------------------*/
#ifndef AM_PART_APOLLO
#define AM_FREERTOS_USE_STIMER_FOR_TICK
#endif#ifdef AM_FREERTOS_USE_STIMER_FOR_TICK
#ifdef APOLLO4_FPGA
#define configSTIMER_CLOCK_HZ 1500000
#define configSTIMER_CLOCK AM_HAL_STIMER_HFRC_6MHZ
#else
#define configSTIMER_CLOCK_HZ 32768
#define configSTIMER_CLOCK AM_HAL_STIMER_XTAL_32KHZ
#endif
#else // Use CTimer
#define configCTIMER_NUM 3
#define configCTIMER_CLOCK_HZ 32768
#define configCTIMER_CLOCK AM_HAL_CTIMER_XT_32_768KHZ
#endif
两种模式对比分析
图中有三个任务,它们分别为一个空闲任务(Idle),两个用户任务(Task1 和 Task2), 其中空闲任务一共有运行了三次,分别为(1) 、(2) 、(3),其中 T1 到 T12 是 12 个时刻,下面我们分别从这两种低功耗的实现方法去分析一下整个过程。
1、Idle低功耗模式
如果使用通用低功耗模式的话每个滴答定时器中断都会将处理器从低功耗模式中唤醒,以 (1)为例,再 T2 时刻处理器从低功耗模式中唤醒,但是接下来由于没有就绪的其他任务所以处理器又再一次进入低功耗模式。T2、T3 和 T4 这三个时刻都一样,反复的进入低功耗、退出低功耗,最理想的情况应该是从 T1 时刻就进入低功耗,然后在 T5 时刻退出。
在(2)中空闲任务只工作了两个时钟节拍,但是也执行了低功耗模式的进入和退出,显然这个意义不大,因为进出低功耗也是需要时间的。
(3)中空闲任务在 T12 时刻被某个外部中断唤醒,中断的具体处理过程在任务 2(使用信号量实现中断与任务之间的同步)。
2 、 Tickless 低功耗模式
在(1)中的 T1 时刻处理器进入低功耗模式,在 T5 时刻退出低功耗模式。相比通用低功耗模式少了 3 次进出低功耗模式的操作。
在(2)中由于空闲任务只运行了两个时钟节拍, 所以就没必要进入低功耗模式。说明在 Tickless 模式中只有空闲任务要运行时间的超过某个最小阈值的时候才会进入低功耗模式,此阈值通过 configEXPECTED_IDLE_TIME_BEFORE_SLEEP 来设置,上一章已经讲过了。
(3)中的情况和通用低功耗模式一样。
总结
1、可以看出相对与通用低功耗模式, Tickless 模式更加合理有效,所以如果有低功耗设计需求的话大家尽量使用 Tickless 模式。
2、几乎所有支持FreeRTOS的MCU都支持Idle低功耗模式,但不一定支持Tickless 模式,Tickless 模式的支持需要依赖于MCU厂家对该功能的支持,具体实现方式一般在对应的FreeRTOS的port.c文件中。
参考资料:
FreeRTOS的低功耗Tickless模式与空闲函数_freertos 空闲任务进入低功耗模式-CSDN博客
FreeRTOS_Reference_Manual_V10.0.0.pdf
FreeRTOS™ - FreeRTOS™
相关文章:
FreeRTOS低功耗总结
前言 Cortex-M核的MCU一般支持以下三种低功耗方式: ● 睡眠(Sleep)模式 ● 停止(Stop)模式 ● 待机(Standby)模式 睡眠模式 进入睡眠模式有两种指令:WFI(等待中断)和WFE(等待事件), WFI进入睡眠模式后,任意中断都可唤醒。 WFE进…...
UniApp 实现炫酷导航栏:选中图标上移并隐藏文字
在移动应用开发中,导航栏是用户与应用交互的重要组成部分,一个美观且交互性强的导航栏能大大提升用户体验。本文将详细介绍如何使用 UniApp 实现一个独特的导航栏,当用户选中某个导航项时,对应的图标会上移并隐藏文字,…...
Django 操作表中的数据(增删改查)
1.新建数据 我之前已经在数据库中创建了两张表,如下 在urls.py文件中添加一行代码,然后再在views.py文件中编写函数 (将 URL 路径 orm/ 映射到 Django 视图函数 views.orm,当用户访问 orm/ 时,Django 会调用 orm 视图…...
优选驾考小程序
第2章 系统分析 2.1系统使用相关技术分析 2.1.1Java语言介绍 Java语言是一种分布式的简单的 开发语言,有很好的特征,在安全方面、性能方面等。非常适合在Internet环境中使用,也是目前企业级运用中最常用的一个编程语言,具有很大…...
vue开发06:前端通过webpack配置代理处理跨域问题
1.定义 在浏览器尝试请求不同源(域名、协议、端口号不同)的资源时,浏览器的同源策略会阻止这种跨域请求。(比如前端端口15500,后端端口5050,前端界面不可以直接调用5050端口) 2.解决方案 使用前…...
C++基础 | 线程`std::thread`
什么是std::thread? std::thread是C11中引入的一个类,用于表示和管理线程。通过std::thread,我们可以创建一个新的线程来执行指定的任务。线程是操作系统调度的基本单位,多个线程可以并发执行,从而提高程序的效率。 创…...
体验 DeepSeek-R1:解密 1.5B、7B、8B 版本的强大性能与应用
文章目录 🍋引言🍋DeepSeek 模型简介🍋版本更新:1.5B、7B、8B 的区别与特点🍋模型评估🍋体验 DeepSeek 的过程🍋总结 🍋引言 随着大规模语言模型的持续发展,许多模型在性…...
2024年认证杯SPSSPRO杯数学建模A题(第二阶段)保暖纤维的保暖能力全过程文档及程序
2024年认证杯SPSSPRO杯数学建模 A题 保暖纤维的保暖能力 原题再现: 冬装最重要的作用是保暖,也就是阻挡温暖的人体与寒冷环境之间的热量传递。人们在不同款式的棉衣中会填充保暖材料,从古已有之的棉花、羽绒到近年来各种各样的人造纤维。不…...
P1878 舞蹈课(详解)c++
题目链接:P1878 舞蹈课 - 洛谷 | 计算机科学教育新生态 1.题目解析 1:我们可以发现任意两个相邻的都是异性,所以他们的舞蹈技术差值我们都要考虑,4和2的差值是2,2和4的差值是2,4和3的差值是1,根…...
或非门组成的SR锁存器真值表相关问题
PS:主要是给大家抛砖引玉,不喜勿喷。 问题描述:或非门组成的SR锁存器,为什么当SD和RD等于0时候的真值表一个是Q0,Q0.一个结果是Q1,Q1?...
机器学习算法 - 随机森林之决策树初探(1)
随机森林是基于集体智慧的一个机器学习算法,也是目前最好的机器学习算法之一。 随机森林实际是一堆决策树的组合(正如其名,树多了就是森林了)。在用于分类一个新变量时,相关的检测数据提交给构建好的每个分类树。每个…...
webpack构建流程
文章目录 [TOC](文章目录) 运行流程初始化流程编译构建流程compile编译make 编译模块build module 完成模块编译 输出流程seal输出资源emit输出完成 小结 运行流程 是一个串行的过程,它的工作流程就是将各个插件串联起来 在运行过程中会广播事件,插件只…...
服务器之连接简介(Detailed Explanation of Server Connection)
一台服务器最大能支持多少连接?一台客户端机器最多能发起多少条连接?? 我们知道TCP连接,从根本上看其实就是client和server端在内存中维护的一组【socket内核对象】(这里也对应着TCP四元组:源IP、源端口、…...
第1章大型互联网公司的基础架构——1.5 服务发现
讲到这里,我们已经对一个客户端请求进入业务HTTP服务的过程有了较为详细的了解。业务HTTP服务在处理请求的过程中免不了与其他下游服务通信——可能会调用其他业务服务,可能需要访问数据库,可能会向消息中间件投递消息等,所以业务…...
uniapp PDF 预览和下载
创建 index.vue <template><view><view class"box"><view class"item" ><view class"title"><span></span><text>文件</text></view><view class"list" v-for"(…...
ubuntu服务器部署
关闭欢迎消息 服务器安装好 ubuntu 系统后,进行终端登录,会显示出很多的欢迎消息 通过在用户的根目录下执行 touch .hushlogin 命令,再次登录终端就不会出现欢迎消息 修改hostname显示 修改 /etc/hostname 文件内容为主机名,保…...
Deepseek 本地部署
准备环境 设备:家用笔记本电脑,8核/16G/1Tb SSD/无独显 系统:windows10 软件环境(非源码部署不需要):conda 4.8.5、python3.7、git2.13 步骤 下载安装Ollama 下载地址:OllamaGet up and r…...
[Linux][问题处理]修改密码报You must wait longer to change your password
一、问题描述 在Linux控制台中修改密码,键入旧密码,设置并确认新密码后,却提示You must wait longer to change your password(您必须等待更长时间才能更改密码) 二、原因 当前修改时间 < Minimum number of da…...
《刚刚问世》系列初窥篇-Java+Playwright自动化测试-22- 操作鼠标拖拽 - 下篇(详细教程)
1.简介 上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,其次有人私信宏哥说是有那种…...
SpringBoot3使用Swagger3
版本 springboot3.4.2 JAVA 17 一、引入Swagger3依赖 <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.0.4</version> </dependency> 二、快速启…...
HCIA综合项目之多技术的综合应用实验
十五 HCIA综合实验 15.1 IP规划 #内网分配网段192.168.1.0 24#内网包括骨干链路和两个用户网段,素以需要划分三个,借两位就够用了192.168.1.0 26--骨干192.168.1.64 26---R1下网络192.168.1.128 26---R2下网络192.168.1.192 26--备用192.168.1.64 26--…...
燕千云ITSM已支持DeepSeek对接!AI能力持续升级
春节期间,DeepSeek火爆全网,引发热议,作为国产AI大模型的黑马,DeepSeek凭借独特的训练方法、先进的模型架构和强大的联网推理能力,正不断拓展AI技术的应用边界。其“快思考”能力,可在极短时间内完成复杂决…...
Windows 自动主题:Windows AutoTheme
Windows 自动主题:Windows AutoTheme 链接:https://pan.xunlei.com/s/VOJ2ZG5t8QjL7_fGVIBgyxJQA1?pwdgbie# 自动切换:根据日出、日落时间自动切换 Windows 主题模式。高效轻量:使用 Rust 提供高效的系统调用,保证运…...
自定义Spring Cloud Gateway过滤器:记录慢请求
在构建微服务架构时,API网关是一个关键组件,它负责路由、负载均衡、安全验证等多种功能。Spring Cloud Gateway提供了强大的扩展能力,允许开发者通过自定义过滤器来增强其功能。本文将详细介绍如何实现一个自定义过滤器,用于记录响…...
python 浅拷贝和深拷贝
浅拷贝(Shallow Copy)语法示例代码 1示例代码 2 深拷贝(Deep Copy)语法示例代码 浅拷贝与深拷贝的区别示例:浅拷贝与深拷贝的对比 浅拷贝:只复制外层容器,内层嵌套对象仍然是共享的,…...
uni-app 学习(一)
一、环境搭建和运行 (一)创建项目 直接进行创建 (二)项目结构理解 pages 是页面 静态资源 打包文件,看我们想输出成什么格式 app.vue 页面的入口文件 main.js 是项目的入口文件 存放对打包文件的配置 pages 存放整…...
unity学习37:新版的动画器:动画状态机 Animator
目录 1 给游戏物体添加,新版的动画器 Animator 2 关于 Animator 3 创建 动画器的控制器 Animator Controller 4 打开动画编辑器 Animator 5 动画编辑器 还是Animation 5.1 创建新的动画 5.2 创建第2个动画 5.3 测试2个动画均可用 6 再次打开动画编辑器 A…...
FFmpeg+SDL实现简易视频播放器
参考链接 https://blog.csdn.net/qq_26611129/article/details/98732561 https://www.cnblogs.com/Azion/p/17756274.html https://avmedia.0voice.com/?id49050 https://blog.csdn.net/qq_44825209/article/details/133760652 https://www.cnblogs.com/Azion/p/17525955.htm…...
Vue3实现优雅的前端版本更新提示
背景 在前端项目开发中,当我们发布了新版本后,需要及时通知用户刷新页面以获取最新代码。本文将介绍一种优雅的实现方案。 实现原理 在项目根目录维护一个version.json文件,记录当前版本号前端定期请求version.json检查版本对比本地存储的版本号,如有更新则提示用户 核心代…...
vim常用快捷键
正常模式 在打开文件进入 Vim 后,默认处于正常模式,该模式下的快捷键主要用于光标移动、文本操作等。 光标移动 基本移动:h(左移)、j(下移)、k(上移)、l(右移…...
P1226 【模板】快速幂
P1226 【模板】快速幂 题目描述 给你三个整数 a , b , p a,b,p a,b,p,求 a b m o d p a^b \bmod p abmodp。 输入格式 输入只有一行三个整数,分别代表 a , b , p a,b,p a,b,p。 输出格式 输出一行一个字符串 a^b mod ps,其中 a , b…...
【gRPC-gateway】是否有拦截器的情况添加健康检查的细节,与多路复用runtime.NewServeMux和gRPC区别讲解,与跨域功能,go案例
健康检查详解 什么是健康检查? 健康检查(Health Checking)是一种机制,用于监控服务的状态,确保服务在运行时是健康的、可用的。通过健康检查,系统可以自动检测服务是否正常工作,并在出现问题时…...
vue开发时,用localStorage常用方法及存储数组方法。
localStorage 可以让你在浏览器中存储键值对,并且在页面关闭后数据依然保留。localStorage 中存储的数据会一直保存在客户端,直到被手动删除或者清除浏览器缓存。 localStorage 中存储的数据在同一浏览器的不同窗口之间是共享的,而 sessionSt…...
HashMap详解+简单手写实现(哈希表)
1. 什么是 HashMap? HashMap是Java集合框架中的一种数据结构,它实现了Map接口,用于存储键值对(Key-Value Pair)。HashMap允许null键和null值,并且不保证元素的顺序。 --- 2. HashMap 的工作原理 2.1 内…...
解决Did not find dashscope_api_key问题——jupyter设置环境变量
jupyter中使用通义千文langchain 报错 Value error, Did not find dashscope_api_key, please add an environment variable DASHSCOPE_API_KEY which contains it, or pass dashscope_api_key as a named parameter.我本来以为这样就是已经加上了: #导入相关包 i…...
尚硅谷爬虫note003
一、函数 1. 函数的定义 def 函数名(): 代码 2.函数的调用 函数名() 3. 定义参数(不调用函数不执行) def sum(a,b) #形参 c a b print(c&…...
算法兵法全略(译文)
目录 始计篇 谋攻篇 军形篇 兵势篇 虚实篇 军争篇 九变篇 行军篇 地形篇 九地篇 火攻篇 用间篇 始计篇 算法,在当今时代,犹如国家关键的战略武器,也是处理各类事务的核心枢纽。算法的世界神秘且变化万千,不够贤能聪慧…...
NO.17十六届蓝桥杯备战|do-while循环|break和continue语句|三道练习(C++)
do-while循环 do-while语法形式 在循环语句中 do while 语句的使⽤最少,它的语法如下: //形式1 do 语句; while( 表达式 );//形式2 do { 语句1; 语句2; ... } while( 表达式 );while 和 for 这两种循环都是先判断,条件如果…...
【广州大学主办,发表有保障 | IEEE出版,稳定EI检索,往届见刊后快至1个月检索】第二届电气技术与自动化工程国际学术会议 (ETAE 2025)
第二届电气技术与自动化工程国际学术会议 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大会官网:http://www.icetae.com/【更多详情】 会议时间:2025年4月25-27日 会议地点:…...
Spring Cache 详细讲解
Spring Cache 是 Spring 框架提供的缓存抽象层,通过统一的 API 和注解简化缓存操作,支持多种缓存实现(如 Redis、EhCache、Caffeine 等)。其核心目标是减少重复计算,提升系统性能,同时保持代码简洁性。 1. …...
CPT205 计算机图形学 OpenGL 3D实践(CW2)
文章目录 1. 介绍2. 设计3. 准备阶段4. 角色构建5. 场景构建6. 交互部分6.1 键盘交互6.2 鼠标交互6.3 鼠标点击出多级菜单进行交互 7. 缺点与问题7.1 程序bug7.2 游戏乐趣不足7.3 画面不够好看 8. 完整代码 1. 介绍 前面已经分享过了关于CPT205的CW1的2D作业,这次C…...
Netty的基本架构详解
EventLoopGroup基本认识 我们需要了解的 EventLoopGroup, Netty对EventLoopGroup做了很多的扩展实现,下图是他的家族图谱: 我们上一节课使用的案例,使用的是NioEventLoopGroup,他是NIO的实现,可以看出来他是Multithre…...
2025前端面试题超全面解析(附答案与深度扩展)
文章目录 一、HTML篇(扩展版)1. **HTML5语义化标签的实际应用场景**2. **Web Components实战:如何封装一个自定义按钮组件?**3. **Web Worker的用途与限制** 二、CSS篇(扩展版)1. **CSS盒模型详解ÿ…...
自己搭建可以和deepseek对话的WEB应用
第一步 下载安装anaconda,地址:https://repo.anaconda.com/ 第二步 打开anaconda客户端,打开conda命令行窗口 第三步 创建一个open-webui专属的python专属的虚拟环境,并且指定python具体的版本 conda create --name open…...
Linux系统运行模式和链接
一、系统运行模式 centos6 0 关机模式 1 单用户模式 2 字符模式,无网络连接 3 字符模式 4 预留 5 图形模式 6 重启模式 查看系统当前处于的运行模式 切换为图形模式 init 5 centos7 字符模式 multi-user…...
.NET 9.0 的 Blazor Web App 项目,进度条 <progress> 组件使用注意事项
一、执行过程中,要刷新 进度条 的显示,需要 延时、释放,否则进度条不 实时 更新,最后一下到 100% // 延时,释放给前端:【必须】,否则进度条不 实时 更新,最后一下到 100await Task.D…...
头歌实验--面向对象程序设计
目录 实验五 类的继承与派生 第1关:简易商品系统 任务描述 答案代码 第2关:公司支出计算 任务描述 答案代码 第3关:棱柱体问题 任务描述 答案代码 实验五 类的继承与派生 第1关:简易商品系统 任务描述 答案代码 #incl…...
IoTDB 断电后无法启动 DataNode,日志提示 Meet error while starting up
问题 IoTDB 1.3.2 版本,断电后 IoTDB 的 DataNode 无法启动,日志如下: 2024-12-16 14:45:41,350 [main] ERROR o.a.i.db.service.DataNode:562 - Meet error while starting up. org.apache.iotdb.commons.exception.StartupException: Fo…...
2024华为OD机试真题-最大报酬(C++)-E卷B卷-100分
2024华为OD机试最新题库-(C卷+D卷+E卷)-(JAVA、Python、C++) 目录 题目描述 输入描述 输出描述 示例一 解题思路 考点 代码 c++ 题目描述 小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作, 每项工作都有对应的耗时时间(单位h)和报酬, 工作的总报酬为…...
jenkins war Windows安装
Windows安装Jenkins 需求1.下载jenkins.war2.编写快速运行脚本3.启动Jenkins4.Jenkins使用 需求 1.支持在Windows下便捷运行Jenkins; 2.支持自定义启动参数; 3.有快速运行的脚步样板。 1.下载jenkins.war Jenkins下载地址:https://get.j…...