ARM Cortex-M处理器中的MSP和PSP
在ARM Cortex-M系列处理器中,MSP(主堆栈指针)和PSP(进程堆栈指针)是两种不同的堆栈指针,主要用于实现堆栈隔离和提升系统可靠性。以下是它们的核心区别和应用场景:
1. 基本定义
-
MSP(Main Stack Pointer)
- 用途:默认堆栈指针,主要用于处理模式(Handler Mode)(如中断、异常处理)。
- 特点:系统启动时自动初始化,所有异常处理(如中断服务例程)必须使用MSP。
- 权限:始终在特权模式下使用。
-
PSP(Process Stack Pointer)
- 用途:可选堆栈指针,用于**线程模式(Thread Mode)**下的应用程序代码(如用户任务)。
- 特点:需显式配置,常见于多任务系统(如RTOS)中,每个任务拥有独立的PSP以实现堆栈隔离。
- 权限:可在特权或非特权模式下使用(取决于配置)。
2. 操作模式与堆栈选择
Cortex-M处理器有两种执行模式:
-
处理模式(Handler Mode):
- 始终使用MSP。
- 触发场景:中断、异常(如SysTick、硬件错误)。
-
线程模式(Thread Mode):
- 可配置使用MSP或PSP,由
CONTROL
寄存器的SPSEL
位控制:SPSEL=0
→ 使用MSP(默认)。SPSEL=1
→ 使用PSP。
- 权限:
- 特权线程模式:可自由切换MSP/PSP。
- 非特权线程模式:无法修改
CONTROL
寄存器。
- 可配置使用MSP或PSP,由
3. 典型应用场景
-
单任务系统(无RTOS)
- 通常仅使用MSP,简单可靠。
- 中断直接使用MSP,用户代码在线程模式下默认也使用MSP。
-
多任务系统(RTOS)
- PSP核心作用:每个任务分配独立堆栈,任务切换时更新PSP指向当前任务堆栈。
- 优势:
- 任务堆栈溢出不会破坏系统关键数据(如中断上下文)。
- 实现任务间内存隔离,提升稳定性。
- 配置示例:
// RTOS任务切换时,更新PSP __set_PSP(new_task_stack_top); // 切换CONTROL寄存器使用PSP __set_CONTROL(0x03); // SPSEL=1, 切换到非特权模式(可选)
4. 关键寄存器与控制
-
CONTROL寄存器
SPSEL
位(Bit 1):0
→ 线程模式使用MSP。1
→ 线程模式使用PSP。
nPRIV
位(Bit 0):0
→ 特权模式。1
→ 非特权模式(限制某些操作)。
-
代码中操作堆栈指针
// 读取/设置MSP和PSP(需特权模式) uint32_t current_msp = __get_MSP(); uint32_t current_psp = __get_PSP(); __set_MSP(new_msp_value); __set_PSP(new_psp_value);
5. 总结对比
特性 | MSP | PSP |
---|---|---|
默认使用场景 | 处理模式(中断、异常) | 线程模式(用户任务) |
初始化 | 系统启动自动初始化 | 需手动配置 |
多任务隔离 | 不适用(全局共享) | 支持(每个任务独立堆栈) |
权限要求 | 始终特权模式 | 可配置特权或非特权模式 |
典型应用 | 裸机程序、中断服务 | RTOS任务、复杂多任务系统 |
6. 实践建议
- 裸机开发:优先使用MSP,简化设计。
- RTOS开发:为每个任务分配PSP,避免堆栈冲突。
- 安全性:在非特权模式下限制PSP修改,防止用户代码破坏系统。
- 调试:通过调试器观察MSP/PSP的值,确保任务切换时堆栈正确更新。
通过合理使用MSP和PSP,可以显著提升嵌入式系统的稳定性和可维护性,尤其是在资源受限且要求高可靠性的场景中。
好的!我尽量用「大白话」和比喻来解释,保证你一听就懂!
想象你是一个打工人
假设你有 两个记事本(堆栈):
-
「老板专用记事本」(MSP):
- 用途:专门用来记老板突然扔给你的急事(比如中断、系统崩溃)。
- 特点:必须随身携带,随时能用,而且只能你自己用(特权模式)。
- 举个栗子:
你正在写代码(普通任务),突然老板喊你修BUG(中断),你立刻放下手头工作,掏出「老板专用记事本」记录问题,修完再回去继续写代码。
-
「日常任务记事本」(PSP):
- 用途:记录你平时的工作任务(比如用户程序、普通函数)。
- 特点:可以灵活分配,比如每个项目(任务)单独用一个记事本,避免混乱。
- 举个栗子:
你同时做两个项目(多任务),给每个项目分配一个「日常记事本」。切换项目时,只需要换一个记事本,互相不干扰。
关键区别
-
「老板的事 vs 你的事」:
- MSP:处理老板的急事(中断、系统级操作),必须快速响应,优先级最高。
- PSP:处理你自己的日常工作(普通任务),可以慢慢来。
-
「记事本能不能共享」:
- MSP:全公司只有一个(全局共享),谁处理急事都用它。
- PSP:每个项目(任务)单独一个,互相隔离,一个项目搞砸了(比如堆栈溢出),不会影响其他项目。
-
「谁有权限用」:
- MSP:只有你(系统内核、特权模式)能修改。
- PSP:可以分权限,比如让实习生(非特权模式)也能用,但限制他乱改。
举个实际场景
假设你在写一个智能手表的程序:
-
MSP 的用途:
- 突然要处理「心率异常报警」(中断),系统立刻停下手表界面刷新(普通任务),用 MSP 快速保存现场,处理报警。
-
PSP 的用途:
- 平时同时运行「计步器」和「天气显示」两个任务,每个任务用自己的 PSP 堆栈。
- 如果计步器的代码写错了(堆栈溢出),只会搞坏自己的 PSP,不会影响天气显示和 MSP(系统不会崩溃)。
一句话总结
- MSP:系统「紧急专用通道」,处理中断和异常,全局唯一,必须可靠。
- PSP:你的「多任务分身术」,每个任务独立堆栈,互不干扰。
再打个比方:
- MSP 像医院的急诊室,随时处理紧急情况,全院只有一间。
- PSP 像普通门诊,每个科室(任务)一间,病人(数据)分开排队,不会挤爆急诊室。
在嵌入式开发中,是否要关心 MSP 和 PSP,取决于你的角色、开发场景和系统复杂度。用大白话分情况说明:
1. 如果你是写业务代码的「应用层开发人员」
-
大多数情况下不需要关心,尤其是:
- 用RTOS(如FreeRTOS、uCOS):
RTOS已经帮你管理好了任务堆栈(用PSP),你只需要写任务函数,分配堆栈大小,完全不用手动操作PSP/MSP。// 例子:在FreeRTOS中创建任务,你只需指定堆栈大小,不用碰PSP xTaskCreate(task_function, "Task1", 512, NULL, 1, NULL);
- 裸机开发但代码简单:
如果只是单任务循环(比如顺序执行初始化→采集数据→显示→延时
),系统默认用MSP,你甚至不知道PSP的存在。
- 用RTOS(如FreeRTOS、uCOS):
-
需要关心的例外情况:
- 调试堆栈溢出问题:
如果程序崩溃,可能需要查看MSP/PSP指向的堆栈区域是否被写爆。 - 写底层库或驱动:
如果你要写和中断、任务切换相关的底层代码(比如自定义调度器),需要理解MSP/PSP的切换逻辑。
- 调试堆栈溢出问题:
2. 如果你是「系统工程师」或「内核开发者」
- 必须深刻理解MSP/PSP,因为:
- 任务切换:
在RTOS中切换任务时,需要保存当前任务的PSP,并加载新任务的PSP。; 伪代码:任务切换的核心操作 Save当前任务的寄存器到它的PSP堆栈; Load新任务的PSP值到CPU; 从新任务的PSP堆栈恢复寄存器;
- 中断处理:
系统默认用MSP处理中断,但某些高性能场景可能优化为用PSP(需谨慎)。 - 安全隔离:
在需要权限隔离的系统(如非特权模式运行用户代码),需通过PSP限制任务对系统堆栈的访问。
- 任务切换:
3. 一句话总结
-
业务层开发人员:
不用直接操作MSP/PSP,就当它们不存在,除非你要解决某些“玄学”崩溃问题。
(就像开燃油车不用懂内燃机原理,但漏油了得知道去修) -
系统层开发人员:
必须掌握MSP/PSP,这是实现多任务、中断、内存隔离的核心机制。
(就像赛车工程师必须懂发动机每个零件)
4. 举个实际例子
场景:你正在用STM32和FreeRTOS写一个智能家居控制器
-
业务代码(你写的部分):
void TemperatureTask(void *pvParameters) {while(1) {float temp = read_sensor(); // 读传感器send_to_display(temp); // 发送到显示屏vTaskDelay(1000); // 等1秒} }
- 完全不用碰MSP/PSP,只需关注业务逻辑和任务堆栈大小(比如
configMINIMAL_STACK_SIZE
)。
- 完全不用碰MSP/PSP,只需关注业务逻辑和任务堆栈大小(比如
-
系统层(RTOS内部):
// RTOS内核在切换任务时的隐藏操作: void vTaskSwitchContext() {// 保存旧任务的PSP到它的任务控制块(TCB)old_task->psp = __get_PSP();// 从新任务的TCB加载PSP__set_PSP(new_task->psp); }
- 这里必须操作PSP,但你作为业务开发者看不到这些代码。
5. 什么情况下你会被迫了解MSP/PSP?
- 调试时发现神秘崩溃:
比如日志显示HardFault_Handler
,检查发现某个任务的PSP指向了非法地址。 - 优化特殊场景性能:
比如在高频中断中,为了减少堆栈切换开销,刻意让中断共享PSP(需极度小心!)。 - 自己造轮子写RTOS:
恭喜你,从此MSP/PSP会刻进你的DNA里。
6. 最终建议
-
新手:
先当MSP/PSP不存在,专注于业务逻辑。等遇到崩溃问题或学习RTOS原理时,再回头理解它们。 -
进阶:
通过调试器观察MSP/PSP的值(如下所示),加深对堆栈和任务切换的理解:
(图中:在Keil调试器中查看寄存器的MSP和PSP值) -
记住:
MSP/PSP是CPU的“幕后工作人员”,99%的时间它们默默工作,只有1%的时间(出问题时)需要你喊它们出来对质。 😉
相关文章:
ARM Cortex-M处理器中的MSP和PSP
在ARM Cortex-M系列处理器中,MSP(主堆栈指针)和PSP(进程堆栈指针)是两种不同的堆栈指针,主要用于实现堆栈隔离和提升系统可靠性。以下是它们的核心区别和应用场景: 1. 基本定义 MSP(…...
计算机网络:应用层 —— 电子邮件
文章目录 电子邮件的起源与发展电子邮件的组成电子邮件协议邮件发送和接收过程邮件发送协议SMTP协议多用途因特网邮件扩展MIME 电子邮件的信息格式 邮件读取协议邮局协议POP因特网邮件访问协议IMAP 基于万维网的电子邮件 电子邮件(E-mail)是因特网上最早…...
Vue3 + Spring WebMVC 验证码案例中的跨域问题与解决方法
最近在基于vue3 SpringWebMVC前后端分离的开发环境中实现一个验证码的案例,在开发过程中遇到了一些复杂的跨域问题,现已解决,故将解决方法分享,希望能帮到有需要的人。 出现的问题: 对于验证码的实现,我选…...
【Python爬虫(60)】解锁社交媒体数据宝藏:Python爬虫实战攻略
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
Comfy UI 快捷键
Comfy UI 页面的快捷键操作(记录下,以防忘记): 捷径命令Ctrl Enter将当前图表排队等待生成Ctrl Shift Enter将当前图表排成第一个生成图表Ctrl Z/Ctrl Y撤消/重做Ctrl S保存工作流程Ctrl O加载工作流Ctrl A选择所有节点A…...
【C++】Arrays
《C程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记 文章目录 1、一维数组的定义与初始化1.1、一维数组的定义1.2、一维数组的初始化 2、一维数组的使用3、一维数组与函数4、二维数组4.1、二维数组的定义4.2、二维数组的初始…...
EX_25/2/24
写一个三角形类,拥有私有成员 a,b,c 三条边 写好构造函数初始化 abc 以及 abc 的set get 接口 再写一个等腰三角形类,继承自三角形类 1:写好构造函数,初始化三条边 2:要求无论如何,等腰三角形类对象&#x…...
批量导出数据库表到Excel
这篇文章将介绍如何批量的将多个甚至成千上万的数据库表导出为Excel文件。 准备数据 如下图是数据库里的表,我们需要将它们全部导出为excel文件,这里以SQL Server数据库为例 新增导出 打开的卢导表工具,新建数据库连接,这里以S…...
代码随想录D52-53 图论 Python
目录 101. 孤岛的总面积 102. 沉没孤岛 103. 水流问题 104. 建造最大岛屿 101. 孤岛的总面积 要点: 整体来说是一个图着色的问题。 这道题目的思路符合直觉,但代码实现会和直觉有差别。如果仅使用visit记录不使用着色,会遇到非常多的…...
机器学习(部分算法、模型)
一、KNN 算法 原理 K-近邻算法(K-Nearest Neighbors,简称KNN),根据K个邻居样本的类别来判断当前样本的类别; 如果一个样本在特征空间中的k个最相似(最邻近)样本中的大多数属于某个类别,则该类本也属于这个类别 比如: 有10000个样…...
axios几种请求类型的格式
Axios 是一个基于 Promise 的 HTTP 客户端,广泛用于浏览器和 Node.js 中发送 HTTP 请求。它支持多种请求格式,包括 GET、POST、PUT、DELETE 等。也叫RESTful 目录 一、axios几种请求类型的格式 1、get请求 2、post请求 3、put请求 4、delete请求 二…...
SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)
SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密) 前言 在SpringBoot的项目开发中,大多数情况下 yml 配置文件中存储的密码均以明文形式展示,这种方式显然存在较大的安全隐患。一旦有开发人员离职&…...
【C语言】指针笔试题
前言:上期我们介绍了sizeof与strlen的辨析以及sizeof,strlen相关的一些笔试题,这期我们主要来讲指针运算相关的一些笔试题,以此来巩固我们之前所学的指针运算! 文章目录 一,指针笔试题1,题目一…...
力扣 下一个排列
交换位置,双指针,排序。 题目 下一个排列即在组成的排列中的下一个大的数,然后当这个排列为降序时即这个排列最大,因为大的数在前面,降序排列的下一个数即升序。所以,要是想找到当前排列的下一个排列&…...
Three.js 快速入门教程【八】常见材质类型
系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…...
python~http的请求参数中携带map
背景 调试 http GET请求的 map 参数,链路携带参数一直有问题,最终采用如下方式携带map 解决 user{"demo":"true","info":"王者"}url encode之后的效果如下所示 user%7B%22demo%22:%22true%22,%22info%22:%22…...
爬虫第九篇-结束爬虫循环
最近在学习Python爬虫的过程中,遇到了一个很有趣的问题:如何优雅地结束爬虫循环?今天,我想和大家分享一下我的发现和心得。 一、爬虫循环结束的常见问题 在写爬虫时,我们经常会遇到这样的情况:当爬取到的…...
考研/保研复试英语问答题库(华工建院)
华南理工大学建筑学院保研/考研 英语复试题库,由华工保研er和学硕笔试第一同学一起整理,覆盖面广,助力考研/保研上岸!需要👇载可到文章末尾见小🍠。 以下是主要内容: Part0 复试英语的方法论 Pa…...
《Effective Objective-C》阅读笔记(中)
目录 接口与API设计 用前缀避免命名空间冲突 提供“全能初始化方法” 实现description方法 尽量使用不可变对象 使用清晰而协调的命名方式 方法命名 编辑类与协议命名 为私有方法名加前缀 理解OC错误模型 理解NSCopying协议 协议与分类 通过委托与数据源协议进行…...
前端如何解决跨域
解决前端跨域问题有多种方法 JSONP:利用 <script> 标签的跨域能力,通过动态创建 script 标签并指定回调函数来获取数据。但只能处理 GET 请求,安全性较低。 JSONP 的原理是利用了 <script> 标签的跨域能力。因为浏览器允许 <…...
【HDLbits--Comb组合逻辑】
HDLbits--Comb组合逻辑 1.5 组合逻辑1.5 Demo 在 Verilog 中,组合逻辑(Combinational Logic)是指输出仅依赖于当前输入的逻辑电路,没有记忆功能(即没有状态存储)。组合逻辑的特点是: 无时钟信号…...
如何在 Linux 上安装和配置 Zsh
文章目录 如何在 Linux 上安装和配置 Zsh1. 安装 Zsh1.1 在 Ubuntu/Debian 上安装1.2 在 CentOS/RHEL/Fedora 上安装1.3 在 Arch Linux 上安装1.4 验证 Zsh 安装 2. 设置 Zsh 为默认 Shell2.1 验证默认 shell 3. 配置 Zsh3.1 使用 Oh My Zsh3.1.1 安装 Oh My Zsh3.1.2 启用插件…...
Chromedriver与Chrome版本映射表
Chromedriver与Chrome版本映射表如下: Chrome 71-73版本对应Chromedriver 2.46Chrome 70-72版本对应Chromedriver 2.45Chrome 69-71版本对应Chromedriver 2.44Chrome 68-70版本对应Chromedriver 2.43Chrome 67-69版本对应Chromedriver 2.42…...
HarmonyOS学习第7天: 文本组件点亮界面的文字魔法棒
一、引言 在 HarmonyOS 那丰富多彩的系统界面中,从简洁直观的应用图标,到交互流畅的操作菜单,再到生动形象的图文展示,每一处细节都经过精心雕琢,为用户带来了独特而美妙的视觉与交互体验。而在这琳琅满目的界面元素中…...
06C语言——指针
一、指针入门 (1)、准备知识 0、图解: 1、内存地址 字节:字节是内存的容量单位,英文称为 byte,一个字节有8位,即 1byte(0000 0000 --- 1111 1111) 8bits(0 --- 1) 地址:系统为了便于区分每一个字节而对…...
Ubuntu DeepSeek磁盘空间不够解决办法
标签: Ubuntu; DeepSeek磁盘空间不够解决办法;Ubuntu 22, DeepSeek R1 671 B, solution for Insufficient Disk Space 问题:Ubuntu 22, DeepSeek R1 671B 磁盘空间不够解决办法 Ubuntu 22.04操作系统,台式…...
东信营销科技巨额补贴仍由盈转亏:毛利率大幅下滑,现金流告急
《港湾商业观察》施子夫 近期,东信营销科技有限公司(以下简称,东信营销科技)递表港交所,联席保荐机构为海通国际和中银国际。 东信营销科技的国内运营主体为深圳市东信时代信息技术有限公司。尽管期内收入规模有所提…...
Qt layout
文章目录 Qt layout**关键机制****验证示例****常见误区****最佳实践****总结**关键点总结:示例代码说明:结论: Qt layout 在 Qt 中,当调用 widget->setLayout(layout) 时,layout 的父对象会被自动设置为该 widget…...
本地部署轻量级web开发框架Flask并实现无公网ip远程访问开发界面
文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask,以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架,采用Python编程…...
基于YOLO11深度学习的苹果叶片病害检测识别系统【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
Android MMKV集成指南
首先简单介绍一下MMKV当下Android Studio最版本及Gradle8.7 MMKV集成根据官方文档重新对mmkv重新包了一次(便于开发)总结首先简单介绍一下MMKV MMKV 是腾讯开源的一款专为移动端设计的高性能键值存储组件,旨在替代传统的 SharedPreferences 和 SQLite,尤其在频繁读写和数据…...
React七Formik
Formik是一个专为React构建的开源表单库。它提供了一个易于使用的API来处理表单状态管理,表单验证以及表单提交。Formik支持React中的所有表单元素和事件,可以很好地与React生态系统中的其他库集成。同时,Formik还提供了一些高级功能…...
5分钟使用Docker部署Paint Board快速打造专属在线画板应用
文章目录 前言1.关于Paint Board2.本地部署paint-board3.使用Paint Board4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定Paint Board公网地址 💡 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住…...
可狱可囚的爬虫系列课程 14:10 秒钟编写一个 requests 爬虫
一、前言 当重复性的工作频繁发生时,各种奇奇怪怪提高效率的想法就开始萌芽了。当重复代码的模块化封装已经不能满足要求的时候,更高效的方式就被揭开了神秘的面纱。本文基于这样的想法,来和大家探讨如何 10 秒钟编写一个 requests 爬虫程序。…...
【深度学习神经网络学习笔记(三)】向量化编程
向量化编程 向量化编程前言1、向量化编程2、向量化优势3、正向传播和反向传播 向量化编程 前言 向量化编程是一种利用专门的指令集或并行算法来提高数据处理效率的技术,尤其在科学计算、数据分析和机器学习领域中非常常见。它允许通过一次操作处理整个数组或矩阵的…...
PHP入门基础学习四(PHP基本语法)
运算符 运算符,专门用于告诉程序执行特定运算或逻辑操作的符号。根据运算符的作用,可以将PHP语言中常见的运算符分为9类 算数运算符: 是用来处理加减乘除运算的符号 也是最简单和最常用的运算符号 赋值运算符 1. 是一个二元运算符&#x…...
【十二】Golang 映射
💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 映射映射的定义映射初始化make 函数使用字面量 源…...
简单理解Oracle中的latch
可以用一个小卖部抢购的例子来理解 Oracle 数据库中的 Latch: 1、 什么是 Latch? 打个比方,假设数据库的某个内存区域(比如缓存的数据块)是小卖部货架上的最后一包辣条,Latch 就像是货架前的一个狭窄通道&a…...
hbase集群部署
1.hbase集群的搭建(以及内部逻辑) 虽然Hmaster有多个,但是属于热备,起作用的就active上的这个。 部署流程: 因为我配置的hadoop是一个非HA的,所以修改为以下 如果是HA的hadoop一定要做以下这一步。 在启动…...
塔能物联运维保障智慧地下停车场安全与高效
一、智慧地下停车场安全在城市升级改造中的关键地位 随着城市的不断发展和升级改造,智慧地下停车场的重要性日益凸显。在现代城市中,土地资源愈发珍贵,地下停车场成为解决停车难题的关键设施。然而,停车场的安全问题是其正常运行和…...
面试八股文--数据库基础知识总结(2) MySQL
本文介绍关于MySQL的相关面试知识 一、关系型数据库 1、定义 关系型数据库(Relational Database)是一种基于关系模型的数据库管理系统(DBMS),它将数据存储在表格(表)中,并通过表格…...
深入理解指针2
深入理解指针2 数组名的理解 数组名就是首元素的地址 int arr[]{1,3,2}; printf("%p\n",arr); printf("%p\n",&arr[0]);但是有两种情况除外, 1.sizeof(数组名),sizeof操作符统计的是整个数组的大小,并不是第一个元素…...
QT各种版本下载安装
参考链接: 【Qt】超详细!Qt4.8.6和VS2010的配置及使用 由于QT官网一般现在进不去,所以下载一些QT版本只能通过镜像或者以前下载存储的安装包来进行,现在推荐两种方法 从参考链接中搬过来: 方案一:国内镜…...
java进阶学习脑图
今天开始分享我的第一篇博客,先放上我自己花费一个月完成的java进阶学习脑图吧! 谁都想像R大一样对JVM可以知无不言,言无不尽; 谁都想像Doug Lea一样可以参与JUC这种核心模块的开发; 但是,不能只停留在想…...
Spring 原始注解详解与实战指南
📝 1. 前言 在 Spring 框架的发展过程中,注解的引入大大简化了配置,提升了开发效率 本文将详细介绍 Spring 最初引入的核心注解,包括 Component、Controller、Service、Repository、Autowired、Qualifier 和 Value 等,…...
uniapp封装请求
在uniapp中封装HTTP请求,通常我们会使用uni.request方法。uni.request是uni-app提供的一个网络请求API,可以用来发送各种类型的HTTP请求(GET、POST、PUT、DELETE等)。下面是如何在uniapp中封装一个通用的HTTP请求方法,…...
YOLOv10 解析与地平线 征程 6 模型量化
一,YOLOv10 解析 1.简介 近些年来,研究人员对 YOLO 的架构设计、优化目标、数据增强策略等进行了探索,取得了显著进展。然而,后处理对非极大值抑制(NMS)的依赖阻碍了 YOLO 的端到端部署,并对推…...
基本网络安全的实现
基本网络安全的实现 一 :AAA AAA 是Authentication,Authorization and Accounting(认证、授权和计费)的简 称,它提供了一个用来对认证、授权和计费这三种安全功能进行配置的一致性框架, 它是对网络安全…...
ROS2 强化学习:案例与代码实战
一、引言 在机器人技术不断发展的今天,强化学习(RL)作为一种强大的机器学习范式,为机器人的智能决策和自主控制提供了新的途径。ROS2(Robot Operating System 2)作为新一代机器人操作系统,具有…...
Java数据结构第十四期:走进二叉树的奇妙世界(三)
专栏:数据结构(Java版) 个人主页:手握风云 目录 一、二叉树OJ练习题 1.1. 相同的树 1.2. 另一棵树的子树 1.3. 翻转二叉树 1.4. 平衡二叉树 1.5. 对称二叉树 一、二叉树OJ练习题 1.1. 相同的树 判断两棵树是否相同,我们是否只能遍历一…...