关于堆栈指针的那些事 | bootloader 如何跳转app
问题描述
堆栈指针的值通常存储在 App 的向量表(Vector Table)的第一个位置(0x08002000),为什么?
在嵌入式系统中,堆栈指针(SP)的值存储在应用程序(App)的向量表(Vector Table)的第一个位置,这是由 ARM Cortex-M 架构的设计和启动过程决定的。以下是对这一设计的详细解释:
1. ARM Cortex-M 架构的启动过程
ARM Cortex-M 架构(如 Cortex-M3、Cortex-M4 等)在启动时会执行一系列初始化操作。这些操作的目的是将硬件和软件环境设置到一个已知的、一致的状态,以便程序能够正确运行。
(1) 启动时的硬件行为
当系统复位(Reset)时,Cortex-M 处理器会执行以下操作:
- 加载初始堆栈指针:处理器会从地址
0x00000000
(即 Flash 的起始地址)读取一个 32 位的值,并将其加载到主堆栈指针(MSP)中。这个值就是初始堆栈指针的值。 - 跳转到复位处理函数:处理器会从地址
0x00000004
读取一个 32 位的值,并将其加载到程序计数器(PC)中,从而跳转到复位处理函数(Reset_Handler)。
这种设计使得硬件能够在启动时自动加载堆栈指针和程序入口地址,而无需额外的初始化代码。
2. 向量表(Vector Table)的作用
向量表是 ARM Cortex-M 架构中一个特殊的内存区域,它包含了堆栈指针的初始值和中断处理函数的地址。向量表的结构如下:
地址 | 内容 | 描述 |
---|---|---|
0x00000000 | 初始堆栈指针(SP) | 堆栈指针的初始值 |
0x00000004 | 复位处理函数(Reset_Handler) | 系统复位时的入口地址 |
0x00000008 | NMI 处理函数(NMI_Handler) | 非屏蔽中断处理函数 |
0x0000000C | 硬件故障处理函数(HardFault_Handler) | 硬件故障处理函数 |
… | … | … |
(1) 堆栈指针的初始值
- 地址
0x00000000
:存储堆栈指针的初始值。- 这个值是程序启动时堆栈指针(SP)的初始位置,通常指向 RAM 的最高地址(因为堆栈是向下生长的)。
- 例如,在 STM32F103 中,如果 RAM 的地址范围是
0x20000000
到0x20005000
,堆栈指针的初始值可能是0x20005000
。
(2) 复位处理函数
- 地址
0x00000004
:存储复位处理函数的地址。- 当系统复位时,处理器会从这个地址读取值,并将其加载到程序计数器(PC)中,从而跳转到复位处理函数。
- 复位处理函数通常负责初始化硬件和软件环境,然后跳转到主程序(
main
函数)。
3. 为什么堆栈指针的值存储在向量表的第一个位置
将堆栈指针的值存储在向量表的第一个位置(0x00000000
),是 ARM Cortex-M 架构设计的一部分,主要有以下原因:
(1) 硬件自动加载
- 简化启动过程:在系统复位时,硬件会自动从
0x00000000
读取堆栈指针的值,并将其加载到主堆栈指针(MSP)中。这种设计使得硬件能够在启动时自动完成堆栈指针的初始化,而无需额外的初始化代码。 - 提高启动效率:这种设计减少了启动时的指令数量,提高了启动效率。
(2) 一致性
- 统一的向量表结构:向量表的第一个位置始终用于存储堆栈指针的初始值,这种设计使得向量表的结构更加统一和规范,便于开发和调试。
- 兼容性:这种设计在所有 ARM Cortex-M 架构的微控制器中保持一致,提高了代码的可移植性和兼容性。
4. 示例
以下是一个典型的启动文件(如 startup_stm32f10x_md.s
)的示例,展示了堆栈指针的初始值和复位处理函数的定义:
.section .isr_vector.word _estack /* 堆栈指针的初始值 */.word Reset_Handler /* 复位处理函数 */.word NMI_Handler /* NMI 处理函数 */.word HardFault_Handler /* 硬件故障处理函数 */....section .text.globl Reset_Handler
Reset_Handler:/* 初始化硬件和软件环境 *//* 跳转到主程序 */bl mainb .
在这个示例中:
_estack
是堆栈指针的初始值,通常指向 RAM 的最高地址。Reset_Handler
是复位处理函数,负责初始化硬件和软件环境,并跳转到主程序(main
函数)。
5. 总结
将堆栈指针的值存储在向量表的第一个位置(0x00000000
),是 ARM Cortex-M 架构设计的一部分,主要目的是简化启动过程、提高启动效率,并保持向量表结构的一致性和兼容性。这种设计使得硬件能够在系统复位时自动加载堆栈指针,从而简化了启动代码的编写。
希望这些解释能帮助你更好地理解为什么堆栈指针的值存储在向量表的第一个位置。如果有任何问题,欢迎随时提问!
问题描述: bootloader 跳转app
在嵌入式开发中,bottloader如何跳转到app中的,需要设置什么东西
在嵌入式开发中,Bootloader 是一个特殊的程序,它在设备启动时首先运行,用于初始化硬件、加载和启动应用程序(App)。Bootloader 的主要功能之一是将控制权从 Bootloader 跳转到应用程序。以下是 Bootloader 跳转到 App 的过程以及需要设置的事项。
1. Bootloader 和 App 的内存布局
在设计 Bootloader 和 App 时,必须明确它们在内存中的布局。通常,Bootloader 和 App 会占用不同的内存区域,例如:
- Bootloader:位于 Flash 的起始地址(如 0x08000000)。
- App:位于 Bootloader 之后的某个地址(如 0x08002000)。
这种布局需要在链接脚本(Linker Script)中明确指定。例如,对于 STM32,链接脚本可能如下所示:
/* Bootloader 链接脚本 */
MEMORY
{FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 8KRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
}/* App 链接脚本 */
MEMORY
{FLASH (rx) : ORIGIN = 0x08002000, LENGTH = 128KRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
}
2. Bootloader 跳转到 App 的步骤
Bootloader 跳转到 App 的过程通常包括以下步骤:
(1) 检查是否需要跳转
Bootloader 启动后,首先检查是否需要跳转到 App。这可以通过以下方式实现:
- 检查标志位:在 Flash 或 RAM 中设置一个标志位,表示 App 是否准备好运行。
- 检查按键或引脚状态:通过外部按键或引脚状态决定是否跳转到 Bootloader。
(2) 配置堆栈指针
在跳转到 App 之前,Bootloader 需要设置堆栈指针(SP)。堆栈指针的值通常存储在 App 的向量表(Vector Table)的第一个位置(0x08002000)。例如:
void jump_to_app(uint32_t app_start_address) {// 获取堆栈指针uint32_t *app_stack = (uint32_t *)app_start_address;uint32_t sp = app_stack[0]; // 堆栈指针在向量表的第一个位置// 设置堆栈指针__set_MSP(sp); // CMSIS 内联函数,设置主堆栈指针
}
(3) 跳转到 App 的入口地址
App 的入口地址通常存储在向量表的第二个位置(0x08002004)。Bootloader 需要将程序计数器(PC)设置为该地址,从而跳转到 App 的入口点。例如:
void jump_to_app(uint32_t app_start_address) {// 获取堆栈指针uint32_t *app_stack = (uint32_t *)app_start_address;uint32_t sp = app_stack[0]; // 堆栈指针在向量表的第一个位置uint32_t pc = app_stack[1]; // 入口地址在向量表的第二个位置// 设置堆栈指针__set_MSP(sp); // CMSIS 内联函数,设置主堆栈指针// 跳转到 App 的入口地址void (*app_entry)() = (void (*)())pc;app_entry(); // 调用 App 的入口函数
}
3. 需要设置的事项
为了确保 Bootloader 能够正确跳转到 App,需要设置以下内容:
(1) 向量表重定向(可选)
如果 App 的向量表不在默认的地址(0x08000000),需要在跳转之前将向量表重定向到 App 的向量表地址。这可以通过写入 SCB(System Control Block)的 VTOR(Vector Table Offset Register)寄存器来实现。例如:
void jump_to_app(uint32_t app_start_address) {// 获取堆栈指针uint32_t *app_stack = (uint32_t *)app_start_address;uint32_t sp = app_stack[0]; // 堆栈指针在向量表的第一个位置uint32_t pc = app_stack[1]; // 入口地址在向量表的第二个位置// 设置堆栈指针__set_MSP(sp); // CMSIS 内联函数,设置主堆栈指针// 重定向向量表到 App 的向量表地址SCB->VTOR = app_start_address;// 跳转到 App 的入口地址void (*app_entry)() = (void (*)())pc;app_entry(); // 调用 App 的入口函数
}
(2) 硬件初始化
在跳转到 App 之前,Bootloader 可能需要进行一些硬件初始化操作,例如:
- 配置时钟系统。
- 初始化外设(如 GPIO、USART 等)。
- 清除 RAM 区域(如果 App 需要)。
这些初始化操作应确保与 App 的运行环境一致。
(3) 禁用中断
在跳转到 App 之前,建议禁用所有中断,以避免在跳转过程中发生意外中断。可以通过设置 PRIMASK 寄存器来禁用中断,例如:
__disable_irq(); // 禁用中断
4. 示例代码
以下是一个完整的示例代码,展示 Bootloader 如何跳转到 App:
#include "stm32f10x.h"void jump_to_app(uint32_t app_start_address) {// 获取堆栈指针uint32_t *app_stack = (uint32_t *)app_start_address;uint32_t sp = app_stack[0]; // 堆栈指针在向量表的第一个位置uint32_t pc = app_stack[1]; // 入口地址在向量表的第二个位置// 设置堆栈指针__set_MSP(sp); // CMSIS 内联函数,设置主堆栈指针// 重定向向量表到 App 的向量表地址SCB->VTOR = app_start_address;// 禁用中断__disable_irq();// 跳转到 App 的入口地址void (*app_entry)() = (void (*)())pc;app_entry(); // 调用 App 的入口函数
}int main() {// 检查是否需要跳转到 Appuint32_t app_start_address = 0x08002000; // App 的起始地址jump_to_app(app_start_address);// 如果没有跳转,Bootloader 继续运行while (1) {// Bootloader 功能代码}
}
5. 注意事项
- Flash 保护:在跳转到 App 之前,确保 Bootloader 区域的 Flash 不会被意外擦除或写入。
- 调试支持:如果需要在 App 中进行调试,确保调试接口(如 SWD)在跳转后仍然可用。
- 电源管理:在跳转到 App 之前,确保设备的电源管理设置与 App 的运行需求一致。
通过以上步骤和设置,Bootloader 可以安全地将控制权交给 App。希望这些内容对你理解 Bootloader 跳转到 App 的过程有所帮助!如果有任何问题,欢迎随时提问。
相关文章:
关于堆栈指针的那些事 | bootloader 如何跳转app
问题描述 堆栈指针的值通常存储在 App 的向量表(Vector Table)的第一个位置(0x08002000),为什么? 在嵌入式系统中,堆栈指针(SP)的值存储在应用程序(App&…...
如何在 iPhone 上恢复已删除的联系人:简短指南
从 iPhone 中删除联系人相当容易,但如果您不小心删除了错误的联系人或丢失了所有联系人怎么办?这可能是任何智能手机用户都可能发生的最糟糕的噩梦之一。 如何在 iPhone 上恢复已删除的联系人 我个人在我的列表上看到几个用户发布关于他们如何丢失所有联…...
使用Aspose.Words将Word转换为HTML时,字体样式丢失问题及解决方法
使用Aspose.Words将Word转换为HTML时,字体样式丢失问题及解决方法 引言 ✨一、问题描述 📉二、问题分析 🔍三、解决方案 🛠️四、总结 🏁 引言 ✨ 在实际开发中,使用Aspose.Words将Word文档转换为HTML格式…...
更快的图像局部修改与可控生成:Flex.2-preview
Flex.2-preview 文本生成图像扩散模型介绍 一、模型简介 Flex.2-preview 是一种 开源的 80 亿参数文本生成图像扩散模型,具备通用控制和修复支持功能,是 Flex.1alpha 的下一代版本。该模型由社区开发并为社区服务,采用 Apache 2.0 许可证&a…...
汽车制造行业如何在数字化转型中抓住机遇?
近年来,随着新一轮科技革命和产业变革的深入推进,汽车制造行业正迎来一场前所未有的数字化转型浪潮。无论是传统车企还是新势力品牌,都在积极探索如何通过数字化技术提升竞争力、开拓新市场。那么,在这场变革中,汽车制…...
数据可视化 —— 直方图
一、前言 直方图(Histogram)是一种用柱状图形表示数据分布的统计图表,它将数据划分为连续的区间(称为“分箱”或“区间”),统计每个区间内的数据频数(或频率),并用柱形的…...
1、Linux操作系统下,ubuntu22.04版本切换中英文界面
切换中英文界面的方法很多,我也是按照一个能用的方法弄过来并且记录, 1.如果刚开始使用Ubuntu环境,桌面的语言环境为英文,需要安装中文简体的字体包 打开桌面终端,输入 sudo apt install language-pack-zh-hans lan…...
《MySQL 技术内幕-innoDB 存储引擎》笔记
💡 根据 遗忘曲线:如果没有记录和回顾,6天后便会忘记75%的内容 读书笔记正是帮助你记录和回顾的工具,不必拘泥于形式,其核心是:记录、翻看、思考::: 书名MySQL 技术内幕-innoDB 存储引擎作者姜承尧状态已读…...
C++ AVL树的实现
在上一篇博客我们学习了二叉搜索树的实现,现在我们开始手动实现AVL树。 二叉搜索树-CSDN博客 1.AVL树的概念 AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的左右⼦树都是AVL树,…...
多视觉编码器协同与高低分辨率特征融合技术综述
本文主要介绍(论文发表时间:24.03-25.01)在多模态中使用多个视觉编码器如何进行特征融合操作(之所以用多视觉编码器,主要用途在于:有些视觉编码器可能只能提取到部分信息,就想通过另外一个编码器…...
力扣4-最长公共前缀
一.题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入:strs ["flower","flow","flight"] 输出:"fl"示例 2&…...
贪心算法-860.柠檬水找零-力扣(LeetCode)
一、题目解析 我们需要注意我们是没有初始零钱的,所以当第一个顾客支付10或20时,无法找零此时返回false。 二、算法解析 根据贪心算法的解决方式,我们需要先把解决该问题分解为若干步。 首先对于顾客支付的钱共有三种,5…...
Kubernetes学习笔记-配置Service对接第三方访问
在Kubernetes中配置Service对接第三方访问,可以选择以下方案实现: ExternalName Service(基于DNS别名) 适用场景:外部服务必须有固定域名Service配置文件如下: apiVersion: v1 kind: Service metadata…...
pikachu靶场-敏感信息泄露
一、敏感信息泄露的危害 1. 个人隐私与数据安全 身份盗窃:泄露个人身份信息(如姓名、身份证号、手机号)可被用于诈骗、冒名开户等犯罪活动。账户劫持:暴露用户账号密码、邮箱等凭证,导致社交媒体、银行账户被非法登录。…...
ppt章节页怎么做好看?ppt章节页模板
ppt章节页怎么做好看?ppt章节页怎么排版?ppt章节页模板: PPT章节_模板素材_PPT模板_ppt素材_免抠图片_AiPPTer...
ubuntu扩展逻辑卷并调整文件系统大小步骤
安装好ubuntu如果没有调整磁盘空间,一般默认给你100G的空间,在用完时再调整也还来得及,下面是 ubuntu扩展逻辑卷并调整文件系统大小步骤: 1. 扩展逻辑卷 运行以下命令来扩展逻辑卷 /dev/ubuntu-vg/ubuntu-lv,使其使用卷组中所有未分配的空间ÿ…...
2.脚本文件初识
—>1.Makefile—自动化构建和管理项目的文件见这篇<— 1.编程语言 编程语言分为2类,一类是编译型语言,将源文件经过编译得到可执行文件,该执行文件可以在特定平台上运行,其他平台则不行,因此是不跨平台的编程语…...
FastAPI + Redis Pub/Sub + WebSocket 组合解决方案的详细介绍
以下是对 FastAPI Redis Pub/Sub WebSocket 组合解决方案的详细介绍,涵盖技术原理、实现步骤、协作流程和适用场景。 1. 技术概述 1.1 FastAPI 特性:基于 Python 的现代异步框架,支持 async/await,性能高效,适合高…...
泛型的诗意——深入C++模板的艺术与科学(模版进阶)
前言: 在之前,小编讲述了模版的初阶内容,当时小编讲述了模版的书写,方便之后容器的讲解以及模拟实现,现在小编已经带领各位学习了很多容器,模版初阶的知识已经用的很多了,今天小编讲述一下全新的…...
【极致版】华为云Astro轻应用抽取IoTDA影子设备参数生成表格页面全流程
做份极致详细Astro调取iotda影子设备数据的操作手册,每一步都分成: 要进入哪个界面 点哪个按钮 要填什么内容(样例) 如果出错怎么办 填写示例 完全对应你这个需求:Astro轻应用抽取IoTDA影子设备数据,…...
业务中台与数据中台:企业数字化转型的核心引擎
前言:在当今数字化浪潮下,企业为了提升运营效率、加速创新步伐并更好地适应市场变化,业务中台与数据中台应运而生,成为企业架构中的关键组成部分。本文将深入探讨业务中台和数据中台的简介、发展史、技术流环节以及在实际生产中的…...
前端分页与瀑布流最佳实践笔记 - React Antd 版
前端分页与瀑布流最佳实践笔记 - React Antd 版 1. 分页与瀑布流对比 分页(Pagination)瀑布流(Infinite Scroll)展示方式按页分批加载,有明确页码控件滚动到底部时自动加载更多内容,无明显分页用户控制用…...
【网络原理】从零开始深入理解TCP的各项特性和机制.(三)
上篇介绍了网络原理传输层TCP协议的知识,本篇博客给大家带来的是网络原理剩余的内容, 总体来说,这部分内容没有上两篇文章那么重要,本篇知识有一个印象即可. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分…...
MySQL:13.用户管理
13. 用户管理 如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。 13.1 用户 13.1.1 用户信息 MySQL中的用户,都存储在系统数据库mysql的user表中 mysql> use mysql; Database changed mysql> select h…...
leetcode0103. 二叉树的锯齿形层序遍历-medium
1 题目:二叉树的锯齿形层序遍历 官方标定难度:中 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行…...
【Go语言】ORM(对象关系映射)库
github.com/jinzhu/gorm 是 Go 语言中一个非常流行的 ORM(对象关系映射)库,用于简化与关系型数据库的交互。以下是关于它的关键信息: 核心特点 全功能 ORM 支持主流数据库:MySQL、PostgreSQL、SQLite、SQL Server 等。…...
Java : GUI
AWT 初始化界面 直接封装起来: panel 的添加 布局 流式布局,控制按钮的位置 东西南北中布局 网格布局 frame.pack();java函数,会自动选择最优的布局 事件监听 给按钮添加 添加文本 画笔 鼠标监听 键盘监听 JDialog”弹窗 默认有关闭事件 标签&#…...
ipa包安装到apple手机上
获ipa包的方式 ipatool 下载appStore的ipa包-CSDN博客 方式一:巨魔商店 原理是利用apple的漏洞,但是有低版本的系统要求 TrollStore - Always Sideload Any IPAs For FreeTrollStore - The ultimate jailbreak app for iOS. Permanently install any …...
JavaScript输出数据的方法
1. console.log() console.log()是最常用的方法之一,用于在浏览器的控制台(Console)中输出信息。这对于调试和查看变量的值非常有用。 console.log("Hello, world!");2. alert() alert()方法会弹出一个带有指定消息和确定按钮的警告…...
操作系统:计算机世界的基石与演进
一、操作系统的本质与核心功能 操作系统如同计算机系统的"总管家",在硬件与应用之间架起关键桥梁。从不同视角观察,其核心功能呈现多维价值: 硬件视角的双重使命: 硬件管理者:通过内存管理、进程调度和设…...
FFmpeg之三 录制音频并保存, API编解码从理论到实战
在学习FFmpeg的时候,想拿demo来练习,官方虽有示例,但更像是工具演示,新手不好掌握,在网上找不到有文章,能给出完整的示例和关键点的分析说明,一步一个错误,慢慢啃过来的,…...
幂等性处理解决方案实战示例
幂等性处理解决方案实战示例 幂等性是指对同一个操作执行一次或多次,产生的结果是相同的。在分布式系统、网络请求和金融交易等场景中,幂等性设计至关重要。下面我将介绍几种常见的幂等性处理方案及其实战示例。 1. 唯一标识符方案 原理:为…...
华为仓颉编程语言的实际用法与使用领域详解
华为仓颉编程语言的实际用法与使用领域详解 一、语言概述与核心特性 华为仓颉编程语言是面向万物智联时代的系统级编程语言,其核心特性包括: 三重内存安全机制:所有权系统 + 引用检查 + 硬件辅助防护零成本抽象:高级语法不牺牲底层性能全场景支持:从嵌入式设备到量子计算…...
JavaEE-多线程实战01
Java 多线程入门:第一个多线程程序 在 Java 中,多线程编程是非常重要的一部分。本篇文章将通过示例,带你快速了解如何创建第一个多线程程序,并深入分析其运行机制。 1. 创建一个线程类并继承 Thread 在 Java 中,我们…...
当AI浏览器和AI搜索替代掉传统搜索份额时,老牌的搜索引擎市场何去何从。
AI搜索与传统搜索优劣势分析 AI搜索优势 理解和处理查询方式更智能:利用自然语言处理(NLP)和机器学习技术,能够更好地理解用户的意图和上下文,处理复杂的问答、长尾问题以及多轮对话,提供更为精准和相关的…...
大模型——Spring.new快速构建AI驱动的定制化商业应用
大模型——Spring.new快速构建AI驱动的定制化商业应用 Spring.new 是一个基于人工智能的在线平台,专注于帮助营销经理和产品经理快速构建定制化工作流和小型应用。它通过自然语言输入,让用户描述需求,自动生成连接 Notion、Airtable、Slack 等工具的工作流或应用,例如将 F…...
django admin 中更新表数据 之后再将数据返回管理界面
在Django中,更新数据库中的数据并将其重新显示在Django Admin界面上通常涉及到几个步骤。这里我将详细说明如何在Django Admin中更新表数据,并确保更新后的数据能够立即在管理界面上显示。 定义模型 首先,确保你的模型(Model&…...
深度理解linux系统—— 进程概念
一、进程 进程,什么是进程? 在课本,教材中是这样描述的:程序的一个执行示例,正在执行的程序; 从内核角度来说,进程就是担当分配系统资源(CPU时间,内存)的实体…...
【如何使用solidwork编辑结构导入到simscope】
这里写自定义目录标题 欢迎使用Markdown编辑器 欢迎使用Markdown编辑器 To use Simscape Multibody Link, you must install MATLAB and the CAD applications on the same computer. To ensure the successful installation of Simscape Multibody Link, before launching yo…...
Flink 时态维度表 Join 与缓存机制实战
一、引言:为什么需要时态维度表? 在实时数仓建设中,维度表是不可或缺的一环,例如: 风控系统中,用户的风险等级在不同时间可能变化; 营销体系中,商品的促销标签会动态调整ÿ…...
Apache Tomcat 漏洞(CVE-2025-24813)导致服务器面临 RCE 风险
CVE-2025-24813Apache Tomcat 中发现了一个严重安全漏洞,标识为,该漏洞可能导致服务器面临远程代码执行 (RCE)、信息泄露和数据损坏的风险。 此缺陷影响以下版本: Apache Tomcat11.0.0-M1通过11.0.2Apache Tomcat10.1.0-M1通过10.1.34Apache Tomcat9.0.0-M1通过9.0.98了解 …...
来自B站-AI匠的“RAG的prompt设计指南“的部分截图
来自B站-AI匠的“RAG的prompt设计指南“的部分截图 0. 引言1. RAG提示词 - 部分视频截图2. 总结 - 部分视频截图3. 举例 - 部分视频截图 0. 引言 这个文章记录的是B站Up主AI匠关于RAG的prompt设计指南的视频截图。 1. RAG提示词 - 部分视频截图 笔记: Up主推荐Fa…...
【Linux】Centos7 在 Docker 上安装 Redis7.0(最新详细教程)
一、拉取 Redis 镜像 1. 从 阿里云加速器(docker hub)拉取 redis镜像,选择镜像标签为 7.2.4 docker pull redis:7.2.4 2. 准备 Redis 的配置文件(便于后期对配置文件进行修改) 3.在服务器上创建需要挂载的文件夹 mk…...
Java使用微信云服务HTTP API操作微信云开发数据库
可以直接用的工具类代码 package com.kstc.qgy.util;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.kstc.qgy.model.exception.WxException; import com.kstc.qgy.model.service.Limit; imp…...
Linux的权限
目录 1、用户分类 1.1 超级用户(root)和普通用户 1.2 普通<->超级 1.3 sudo 2、文件和目录的权限 2.1 chown&&chgrp 2.1.1 chown 2.1.2 chgrp 2.2 chmod 总结一下: 3、文件和目录的默认权限 4、共享文件 4.1 理解多用户隔离 4.2 /tmp/ 1…...
ACT游戏和MMORPG经济形态区别以及对经济循环的思考
对于原神的明日之后经济形态的不同解析 对于MMORPG游戏来说,如果采用开放市场经济的设计,以明日之后为例,系统产出端为采集、运营活动投放;玩家产出端为交易;消耗端为武器耐久的减少。但我好奇,在ACT游戏里…...
zynq7035的arm一秒钟最多可以支持触发多少次中断
一、概述 1.关于zynq7035的ARM处理器一秒能够支持多少次中断触发,需要综合来考虑。需要确定ARM处理器的参数,目前zynq7000系列,使用的双核Cortex-A9处理器。其中主频大概在500MHZ~1GHZ左右,不同的用户配置的主频可能稍微有差别。 …...
Spring MVC 拦截器教程
一、拦截器核心概念 1.1 拦截器 vs 过滤器 特性过滤器 (Filter)拦截器 (Interceptor)依赖关系Servlet容器Spring MVC框架作用范围所有Web请求Controller请求实现机制Java EE标准Java反射AOP生命周期服务器启动时初始化随Spring容器初始化功能场景字符编码、安全过滤权限校验、…...
【HPC存储性能测试】02-ior带宽性能测试
文章目录 一、前言二、软件安装1、安装依赖2、安装软件 三、参数说明1、mpirun参数2、ior参数 四、测试说明 一、前言 ior introduction | github hpc ior IOR 测试工具使用 POSIX、 MPIIO 或 HDF5接口对并行文件系统进行基准测试 通常使用IOR测试工具时,一般会配合…...
【RabbitMQ】保证消息不丢失
要确保 RabbitMQ 在消费者(Python 服务)重启或挂掉时消息不丢失,需结合 消息持久化、确认机制(ACK) 和 死信队列(DLX) 实现高可靠性: 1. 消息持久化(Durabilityÿ…...