ARM Cortex-M3内核详解
目录
一、ARM Cortex-M3内核基本介绍
(一)基本介绍
(二)主要组成部分
(三)调试系统
二、ARM Cortex-M3内核的内核架构
三、ARM Cortex-M3内核的寄存器
四、ARM Cortex-M3内核的存储结构
五、ARM Cortex-M3内核的中断与异常
(一)中断
(二)异常
(三)中断与异常的协同工作
一、ARM Cortex-M3内核基本介绍
(一)基本介绍
ARM Cortex - M3 内核是一款广泛应用于嵌入式系统的 32 位 RISC 处理器内核,以下是对其的简要介绍。
1、基本架构
采用哈佛架构,具有独立的指令总线和数据总线,能同时进行指令和数据的访问,提高了数据处理效率。
支持 Thumb - 2 指令集,它融合了 16 位 Thumb 指令和 32 位 ARM 指令的优点,既能保持代码的紧凑性,又能实现高效的处理性能。
2、性能特点
具有较高的性能和较低的功耗。其时钟频率通常可达几十MHz到上百MHz,能够满足多种实时应用的需求。
通过优化的流水线设计和硬件乘法器等部件,可快速执行各种算术和逻辑运算。
3、中断处理
具有强大的中断处理能力,支持嵌套向量中断控制器(NVIC)。
它可以对多个中断源进行优先级管理,能够快速响应外部事件,并且在中断处理过程中可以实现高效的上下文切换,确保实时任务的及时处理。
4、存储器管理
支持多种存储器类型,包括闪存、SRAM 等。具有灵活的存储器映射机制,允许开发人员根据具体应用需求合理分配内存空间。
还支持位带操作,能对特定的内存位进行单独访问和操作,提高了对寄存器等控制位的操作效率。
5、应用领域
由于其高性能、低功耗和丰富的外设接口,广泛应用于工业控制、汽车电子、消费电子、医疗设备、物联网等众多领域,如智能传感器、电机控制器、智能家居设备等。
(二)主要组成部分
1、处理器核心
这是内核的核心运算部分,包含 32 位的ALU(算术逻辑单元)、32 个通用寄存器以及控制单元。
ALU 负责执行各种算术和逻辑运算;
通用寄存器用于暂存数据和中间结果,方便处理器快速访问;
控制单元则负责指令的译码和执行控制,确保指令按照正确的顺序和方式执行。
2、嵌套向量中断控制器(NVIC)
它是 Cortex - M3 内核中断处理的核心部件。NVIC 能够管理多个中断源,为每个中断源分配优先级,支持中断嵌套功能。
当中断发生时,NVIC 会迅速响应,并根据中断优先级决定是否暂停当前正在执行的任务,转而处理中断服务程序,处理完成后再恢复原来的任务执行。
3、系统控制块(SCB)
主要用于配置和控制处理器的系统级功能。它包含了多个寄存器,可用于配置系统时钟、低功耗模式、异常处理等。
通过对 SCB 中寄存器的设置,开发人员可以根据具体应用需求优化系统性能和功耗。
4、调试系统
该部分为内核提供调试功能,支持硬件断点、单步执行等调试操作。开发人员可以利用调试系统来查找和解决程序中的错误,监控处理器的运行状态,提高开发效率。
5、总线接口
负责内核与外部存储器和外设之间的数据传输。它提供了与系统总线的连接,使处理器能够快速访问外部资源,确保数据在处理器、存储器和外设之间的高效流动。
(三)调试系统
ARM Cortex-M3 内核的调试系统是嵌入式开发中至关重要的组成部分,它为开发人员提供了强大的工具来诊断、调试和优化软件与硬件设计。以下是其核心功能和特点的简要介绍:
1、调试架构基础
Cortex-M3的调试系统基于ARM Debug Interface (ADI) 标准,支持多种调试方式:
①串行线调试(SWD):使用两线(时钟和数据)进行高效通信,占用引脚少,适合小型设备。
②JTAG 接口:标准的四线调试接口,兼容性强,但占用更多 GPIO 资源。
③跟踪功能:通过TPIU(Trace Port Interface Unit)输出指令和数据跟踪信息,用于实时分析。
2、主要调试特性
(1)断点与观察点
① 硬件断点:支持指令执行断点(最多 2 个),可在特定地址中断程序运行。
② 数据观察点:支持最多 4 个数据观察点,可监视内存地址的读写操作(如变量被修改时触发中断)。
(2)单步执行与寄存器访问
① 单步执行:支持单步执行指令,方便逐行调试代码。
② 寄存器访问:可实时读取和修改 CPU 寄存器(如 R0-R15、PSRs)及内存内容。
(3)低功耗调试
① 支持在系统进入睡眠或停机模式时保持调试连接,便于测试功耗敏感场景。
(4)系统调试寄存器
① 调试控制寄存器:配置调试接口和断点行为。
② 异常跟踪寄存器:记录异常和中断的发生过程。
3、调试组件
① 调试访问端口 (DAP):连接调试器与内核的物理接口,支持 SWD 或 JTAG 协议。
② 调试子系统 (DSU):管理调试会话,处理断点 / 观察点请求。
③ ITM (Instrumentation Trace Macrocell):支持 printf 类调试信息的输出,无需占用串口。
④ ETM (Embedded Trace Macrocell):提供指令执行跟踪,用于性能分析(部分型号支持)。
4、常用调试工具
① Keil MDK、GDB、OpenOCD:主流的调试工具链,支持 Cortex-M3。
② ST-Link、J-Link、CMSIS-DAP:常见的调试器硬件,通过SWD或JTAG连接目标设备。
5、应用场景
① 软件开发:定位程序崩溃、变量异常等问题。
② 性能优化:通过指令跟踪分析代码执行效率。
③ 硬件验证:测试外设驱动(如 ADC、SPI)的功能正确性。
6、限制与注意事项
① 调试接口会占用 GPIO 引脚,可能影响硬件设计。
② 某些低功耗模式下调试连接可能中断,需特殊配置。
③ 实时跟踪功能(如 ETM)可能需要额外的存储设备捕获数据。
二、ARM Cortex-M3内核的内核架构
ARM Cortex - M3 内核采用了哈佛架构,具有独立的指令总线和数据总线,能同时进行指令和数据的访问,提高了数据处理效率。其内核架构主要包括以下几个部分:
1、处理器核心
(1)寄存器组
包含 32 个 32 位通用寄存器,如R0-R15。
其中 R0 - R7 为低组通用寄存器,R8 - R15 为高组通用寄存器。
R13 通常用作堆栈指针(SP),R14 为链接寄存器(LR),用于保存函数调用的返回地址,R15 是程序计数器(PC),指示当前正在执行的指令地址。
(2)算术逻辑单元(ALU)
负责执行各种算术运算 (如加法、减法、乘法等) 和逻辑运算 (如与、或、非等) 。
并根据运算结果设置状态寄存器中的标志位,如进位标志 (C)、零标志 (Z)、负数标志 (N) 和溢出标志 (V) 。
(3)控制单元
负责指令的取指、译码和执行控制。
它从指令总线获取指令,对指令进行译码,然后根据指令的功能控制 ALU、寄存器组和其他相关部件进行相应的操作,确保指令按照正确的顺序和方式执行。
4、指令集架构
支持 Thumb - 2 指令集,它融合了 16 位 Thumb 指令和 32 位 ARM 指令的优点。
Thumb - 2 指令集在保持代码紧凑性的同时,能够实现高效的处理性能,使 Cortex - M3 内核在代码密度和执行效率方面取得了较好的平衡。
5、嵌套向量中断控制器(NVIC)
集成在内核中的中断控制器,支持多个中断源,并为每个中断源分配优先级。
它可以快速响应外部中断请求,实现中断的嵌套处理,即在处理一个中断的过程中,可以响应更高优先级的中断,从而确保实时任务的及时处理。
6、系统控制块(SCB)
包含多个用于配置和控制处理器系统级功能的寄存器,如系统时钟控制寄存器、低功耗控制寄存器、异常屏蔽寄存器等。
通过对 SCB 中寄存器的设置,开发人员可以根据具体应用需求来优化系统的性能和功耗。
7、总线接口
提供了与外部存储器和外设进行连接的接口,包括指令总线接口和数据总线接口。
通过这些接口,内核可以从外部存储器读取指令和数据,并将处理结果写回到外部存储器或发送到外设,实现与外部设备的通信和数据交互。
8、调试系统
支持硬件断点、单步执行、实时跟踪等调试功能,为开发人员提供了方便的调试手段,有助于快速定位和解决程序中的错误,提高开发效率。
9、存储器保护单元(MPU)(部分型号支持)
用于对存储器进行分区管理和保护,可将存储器划分为不同的区域,并为每个区域设置不同的访问权限(如只读、读写、禁止访问等),防止程序对未授权的存储器区域进行非法访问,提高系统的稳定性和安全性。
三、ARM Cortex-M3内核的寄存器
ARM Cortex - M3 内核的寄存器在处理器的运行和控制中起着关键作用,以下是对其主要寄存器的介绍:
1、通用寄存器
(1)R0 - R7:低组通用寄存器,用于存储操作数、中间结果和函数参数等,在指令执行过程中频繁使用,可快速访问以提高运算速度。
(2)R8 - R15:高组通用寄存器。
① 其中 R8 - R11 在一些情况下可用于特定的功能或优化,
② R12 通常作为子程序内部的临时寄存器。
③ R13 作为堆栈指针(SP),指向当前堆栈的顶部,用于管理函数调用和局部变量的存储。
④ R14 为链接寄存器(LR),在函数调用时保存返回地址,以便函数执行完毕后能正确返回调用处继续执行。
⑤ R15 是程序计数器(PC),存储着当前正在执行的指令地址,它会自动更新指向下一条要执行的指令,控制程序的执行流程。
2、特殊功能寄存器
(1)程序状态寄存器(PSRs)
包括应用程序程序状态寄存器(APSR)、中断程序状态寄存器(IPSR)和执行程序状态寄存器(EPSR)。
① APSR 包含了条件标志位,如进位标志(C)、零标志(Z)、负数标志(N)和溢出标志(V),这些标志位反映了指令执行的结果,常用于条件判断和分支指令中。
② IPSR 用于指示当前正在处理的中断号。
③ EPSR 主要用于存储一些与指令执行相关的状态信息。
(2)中断屏蔽寄存器
包括 PRIMASK、FAULTMASK、BASEPRI,用于控制中断的屏蔽。
PRIMASK 用于屏蔽除了 NMI(不可屏蔽中断)之外的所有中断;FAULTMASK 用于在处理故障时屏蔽其他可屏蔽中断;BASEPRI 用于设置一个基本的优先级阈值,低于该阈值的中断将被屏蔽。
(3)系统控制寄存器(SCB 中的部分寄存器)
① 系统时钟控制寄存器,用于配置系统时钟的源、分频系数等,以满足不同应用对时钟频率的需求;
② 低功耗控制寄存器,可设置处理器进入不同的低功耗模式,如睡眠模式、停机模式等,实现节能目的。
3、调试相关寄存器
(1)调试控制寄存器
用于配置调试接口的工作模式、断点和观察点的使能等。例如,可通过该寄存器设置断点的类型(指令断点或数据断点)、断点地址等参数。
(2)异常跟踪寄存器
记录异常和中断的发生过程,包括异常的类型、进入异常的时间等信息,帮助开发人员分析系统在异常情况下的运行状态,便于调试和故障排除。
4、存储器保护单元(MPU)相关寄存器(部分型号支持)
(1)MPU 类型寄存器(MPU_TYPER)
用于描述 MPU 的特性,如支持的区域数量、每个区域的大小等信息。
(2)MPU 区域设置寄存器(MPU_RASR)
用于配置每个存储器区域的属性,包括区域的起始地址、大小、访问权限(如只读、读写、禁止访问)以及是否缓存等。通过对这些寄存器的设置,可以实现对不同存储器区域的保护和管理,提高系统的稳定性和安全性。
四、ARM Cortex-M3内核的存储结构
ARM Cortex - M3 内核的存储结构采用冯・诺依曼架构,将程序和数据存储在同一个地址空间中,主要包括以下几个部分:
1、代码区(Flash)
通常用于存储程序代码和常量数据,如指令、函数、全局常量等。它是只读存储器,掉电后数据不会丢失。
代码区的大小根据具体的芯片型号和应用需求有所不同,一般从几十 KB 到数 MB 不等。由于代码在执行过程中通常不会被修改,所以存储在 Flash 中可以保证程序的稳定性和可靠性。
2、数据区(SRAM)
用于存储程序运行时的变量、堆栈、中间结果等数据。它是随机存取存储器,读写速度快,但掉电后数据会丢失。
SRAM 的大小也因芯片而异,一般在几 KB 到几十 KB 之间。数据区分为多个段,包括全局变量区、静态变量区、堆区和栈区。
全局变量和静态变量在程序启动时被分配固定的存储空间,堆区用于动态内存分配,栈区则主要用于函数调用和局部变量的存储。
3、外设寄存器区
映射到特定的地址范围,用于与各种外设进行交互。通过访问这些寄存器,可以配置外设的工作模式、控制外设的运行状态以及读写外设的数据。
例如,定时器、串口、GPIO 等外设都有各自对应的寄存器,开发人员可以通过对这些寄存器的操作来实现对外设的控制和数据传输。
4、系统控制空间(SCS)
包含了一些用于系统控制和状态监测的寄存器,如中断控制寄存器、系统时钟控制寄存器、低功耗控制寄存器等。
这些寄存器用于配置和管理整个系统的运行,包括中断的使能和屏蔽、时钟的设置、低功耗模式的选择等,对系统的性能和功耗管理起着关键作用。
5、位带区(Bit - Band Region)
Cortex - M3 内核提供了位带区功能,将特定的内存区域(包括 SRAM 和外设寄存器区的一部分)映射到一个位带别名区。
通过位带别名区,可以对内存中的每一位进行单独的读写操作,就像操作一个单独的位变量一样,大大提高了对单个位进行操作的效率,方便了对寄存器位和标志位的控制。
例如,在对 GPIO 引脚进行控制时,可以直接通过位带操作来设置或清除某个引脚的状态,而无需进行复杂的寄存器位掩码操作。
五、ARM Cortex-M3内核的中断与异常
ARM Cortex - M3 内核的中断与异常是其重要的功能特性,用于处理各种外部事件和内部错误,以保证系统的实时响应和可靠性。以下是相关介绍:
(一)中断
1、中断类型
Cortex - M3 支持多种外部中断,这些中断可以来自外设,如定时器、串口、外部中断引脚等。每个中断都有对应的中断号,用于在中断发生时识别和区分不同的中断源。
2、中断优先级
通过嵌套向量中断控制器(NVIC)对中断进行管理,每个中断都可以被分配一个优先级。
优先级的设置可以是静态的,也可以在运行时动态调整。数值越小,优先级越高。
高优先级的中断可以打断正在执行的低优先级中断,实现中断的嵌套处理,从而确保重要的实时任务能够得到及时响应。
3、中断处理过程
当中断发生时,处理器会暂停当前正在执行的任务,保存当前的上下文环境(包括寄存器的值等)到堆栈中。
然后根据中断向量表找到对应的中断服务程序(ISR)入口地址,并跳转到该地址执行 ISR。在 ISR 执行完毕后,会恢复之前保存的上下文环境,继续执行被中断的任务。
(二)异常
1、异常类型
(1)复位异常
在系统上电启动或复位操作时发生,用于初始化系统,将处理器和相关硬件设置为初始状态,然后开始执行复位向量指向的代码,通常是系统的启动代码。
(2)NMI(不可屏蔽中断)
具有最高的优先级,用于处理极其重要的紧急事件,如电源故障、硬件错误等。NMI 不能被软件屏蔽,一旦发生,处理器会立即响应并执行相应的处理程序。
(3)硬 fault
当发生各种硬件错误,如指令执行错误、存储器访问错误、总线错误等情况时触发。硬 fault 的处理相对复杂,需要开发人员仔细分析错误原因并进行相应的处理,以避免系统崩溃。
(4)其他异常
还包括内存管理 fault、总线 fault、用法 fault 等,分别对应不同类型的错误情况,为开发人员提供了详细的错误诊断信息,有助于定位和解决系统中的问题。
2、异常处理过程
与中断处理类似,异常发生时,处理器会保存当前上下文,根据异常向量表跳转到相应的异常处理程序执行。不同的异常具有不同的优先级和处理要求,例如硬 fault 通常需要进行紧急处理,以防止系统出现严重故障。
(三)中断与异常的协同工作
中断和异常在 Cortex - M3 内核中协同工作,共同构成了系统的事件处理机制。
中断主要用于处理外部异步事件,而异常则侧重于处理内部的错误和特殊情况。当多个中断和异常同时发生时,处理器会根据它们的优先级进行仲裁,优先处理优先级高的事件。
通过这种方式,Cortex - M3 内核能够快速响应各种外部和内部事件,保证系统的稳定性和实时性。
以上即为 ARM Cortex-M3内核详解 的全部内容,创作不易,麻烦三连支持一下呗~
相关文章:
ARM Cortex-M3内核详解
目录 一、ARM Cortex-M3内核基本介绍 (一)基本介绍 (二)主要组成部分 (三)调试系统 二、ARM Cortex-M3内核的内核架构 三、ARM Cortex-M3内核的寄存器 四、ARM Cortex-M3内核的存储结构 五、ARM Co…...
关于高并发GIS数据处理的一点经验分享
1、背景介绍 笔者过去几年在参与某个大型央企的项目开发过程中,遇到了十分棘手的难题。其与我们平常接触的项目性质完全不同。在一般的项目中,客户一般只要求我们能够通过桌面软件对原始数据进行加工处理,将各类地理信息数据加工处理成地图/场景和工作空间,然后再将工作空…...
vue3+flask+sqlite前后端项目实战
基础环境安装 pycharm 下载地址: https://www.jetbrains.com/zh-cn/pycharm/download/?sectionwindows vscode 下载地址 https://code.visualstudio.com/docs/?dvwin64user python 下载地址 https://www.python.org/downloads/windows/ Node.js(含npm…...
支付宝API-SKD-GO版
前言 支付宝api的sdk没有提供go版,这里自己封装了一个go版的sdk,有需要的朋友可以自取使用 支付宝 AliPay SDK for Go, 集成简单,功能完善,持续更新,支持公钥证书和普通公钥进行签名和验签。 安装 go get github.c…...
uniapp(微信小程序)>关于父子组件的样式传递问题(自定义组件样式穿透)
由于"微信小程序"存在【样式隔离机制】,且默认设置为isolated(启用样式隔离),因此这里给出以下两种解决方案: 注意: 这2种方案父子组件<style>标签不能添加"scoped" 1.CSS变量穿透(推荐: 此方案不受样…...
AI时代还需要目视解译吗?——目视解译详解
在遥感技术迅猛发展的今天,尽管计算机自动解译算法层出不穷,目视解译仍然保持着其基础性和权威性的地位。作为遥感信息提取的"黄金标准",目视解译凭借人类认知系统的独特优势,在多个专业领域持续发挥着不可替代的作用。…...
苹果电脑笔记本macos Mac安装mixly 米思齐软件详细指南
一、下载安装包 二、安装 1、解压下载的文件,然后将解压后文件夹中的中文名称部分删掉只保留英文名称,例如:mixly2.0-mac 2、将mixly2.0-mac文件夹移动到当前用户的Documents路径下,注意路径中不要有中文。 3、进入mixly2.0-mac文…...
slackware系统详解
Slackware 是最古老的活跃维护的 Linux 发行版之一,由 Patrick Volkerding 于 1993 年创建。它以简洁性、稳定性和遵循 Unix 哲学为核心理念,适合追求高度控制和手动配置的用户。以下是 Slackware 的详细介绍: 1. 核心特点 简洁性 (Simplici…...
力扣210(拓扑排序)
210. 课程表 II - 力扣(LeetCode) 这是一道拓扑排序的模板题。简单来说,给出一个有向图,把这个有向图转成线性的排序就叫拓扑排序。如果有向图中有环就没有办法进行拓扑排序了。因此,拓扑排序也是图论中判断有向无环图…...
Promise/A+ 规范中文解读
一、简介 Promise/A 是一个开放、健全且通用的JavaScript Promise标准,由开发者制定并供开发者参考。其核心目标是定义then方法的行为,确保不同Promise实现的互操作性。规范聚焦于异步操作的最终结果交互机制,而非Promise的创建、解决或拒绝…...
多媒体预研
主要包含h265 av1 等各种 多媒体的具体应用 svac_plugin ZLMediaKit/ext-codec at master cyf88/ZLMediaKit D:\java\xiachu\otherzlm\ZLMediaKit> sip-client GB28181-Service/SipClient at master Washington-DC/GB28181-Service yolo Jackson-Tan/wvp_pro_yolo: 小…...
动态网站 LNMP
一、名词解释: LNMP: L : 代表 Linux 操作系统,为网站提供了可靠的运行环境N : 代表 Nginx,它是一款轻量级的高性能 Web 服务器,能够快速处理大量并 发连接,有效提升网站的访问速度和性能 M : 代表…...
【Leetcode刷题随笔】349. 两个数组的交集
1. 题目描述 给定两个数组nums1和nums2,返回它们的交集。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。 示例1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出:[2] 题目条件: 1 < nums1.length, nums2.length < 10…...
如何优雅的使用CMake中的FindPkgConfig模块
背景 如果你遇到下面的场景,那么FindPkgConfig模块可以用来解决我们引用上游库的问题。 上游库没有提供CMake的配置文件。CMake没有提供相应的查找模块,即Find<PackageName>.cmake的文件。上游库提供了pkg-config使用的.pc文件。 如果上面三个条…...
Docker Volumes
Docker Volumes 是 Docker 提供的一种机制,用于持久化存储容器数据。与容器的生命周期不同,Volumes 可以独立存在,即使容器被删除,数据仍然保留。以下是关于 Docker Volumes 的详细说明: 1. 为什么需要 Volumes&#…...
[原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取当前用户主目录(即:~波浪符号目录)?
[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...
day23 机器学习管道 Pipeline
在机器学习中,数据预处理、特征提取、模型训练和评估等步骤通常是按顺序执行的。为了更高效地管理和复用这些步骤,我们可以使用 Pipeline(管道)来构建一个完整的机器学习流水线。本文将详细介绍 Pipeline 的基础概念,并…...
The Graph:区块链数据索引的技术架构与创新实践
作为Web3生态的核心基础设施,The Graph通过去中心化索引协议重塑了链上数据访问的范式。其技术设计不仅解决了传统区块链数据查询的效率瓶颈,还通过经济模型与多链兼容性构建了一个开放的开发者生态。本文从技术角度解析其架构、机制及创新实践。 一、技…...
nginx配置sse流传输问题:直到所有内容返回后才往下传输
一、禁用缓冲(如实时流传输): location /stream {proxy_buffering off; } 二、开启分块传输 location /your-path {proxy_chunked_transfer_encoding on; # 显式启用分块传输(默认已启用) }...
使用Daemonset部署日志收集守护进程
1.DaemonSet简介: 在Kubernetes(简称k8s)中,DaemonSet是一种控制器,用于确保集群中的每个(或部分)节点运行一个指定的Pod副本。DaemonSet非常适合需要全局部署、节点级运行的服务,如…...
在Mac环境下搭建Docker环境的全攻略
在Mac环境下搭建Docker环境的全攻略 在现代软件开发中,Docker已经成为不可或缺的工具之一。它不仅简化了应用的部署和管理,还极大地提升了开发效率。然而,在某些公司环境中,桌面版的Docker可能会被禁用,这给开发工作带…...
Go 语言 slice(切片) 的使用
序言 在许多开发语言中,动态数组是必不可少的一个组成部分。在实际的开发中很少会使用到数组,因为对于数组的大小大多数情况下我们是不能事先就确定好的,所以他不够灵活。动态数组通过提供自动扩容的机制,极大地提升了开发效率。这…...
C++ string比较、string随机访问、string字符插入、string数据删除
string的字符串进行比较,代码见下。 #include<iostream>using namespace std;int main() {// 1 comparestring s1 "aab";string t11 "aab";int r11 s1.compare(t11);cout << "1: " << r11 << endl;strin…...
web 自动化之 Unittest 应用:测试报告装饰器断言
文章目录 一、常见的第三方库结合 unittest 生产 html 格式测试报告1、HtmlTestRunner2、BeatifulReport 二、装饰器 unittest.skip 强制跳过&条件跳过三、unittest的常用断言方法 一、常见的第三方库结合 unittest 生产 html 格式测试报告 1、HtmlTestRunner 官网下载 …...
前端基础之《Vue(16)—Vue脚手架介绍》
一、脚手架环境 1、推荐windows10 Node vue/cli(webpack) 2、测试node安装成功 node -v npm -v 3、什么是脚手架 Vue CLI:CLI就是脚手架的意思 脚手架生成一套模板(入口文件、配置文件、目录结构) 4、常用的包管理器 npm:no…...
MySQL 事务(一)
文章目录 CURD不加控制,会有什么问题CURD满足什么属性,能解决上述问题?什么是事务为什么要有事务事务的版本支持了解事务的提交方式 事务常见操作方式研究并发场景事务的正常操作事务的非正常情况的案例结论事务操作的注意事项 CURD不加控制&…...
Dsp38335利用Bootloader实现在线升级的技术原理
1. Bootloader概述 Bootloader(引导加载程序)是嵌入式系统中负责在设备启动时加载和启动主程序的代码。它通常在系统的闪存或其他非易失性存储器中,并在系统上电时首先执行。Bootloader不仅完成启动操作,还能够提供后续的程序升级…...
【TVM 教程】microTVM PyTorch 教程
Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →https://tvm.hyper.ai/ 作者:Mehrdad Hessar 该教程展示了如何使用 PyTorch 模型进行 microTVM 主机驱动的 AOT 编译。此教程可以在使用…...
利用D435i相机进行SLAM实现建图的关键环节-----Kalibr标定工具以及常见的问题调试
在SLAM系统中,相机标定是获取准确的空间信息和三维重建的关键步骤。对于Intel RealSense D435i这类双目相机,正确的内参和外参不仅能提高位姿估计精度,还能显著改善重建效果。本文将详细介绍如何使用Kalibr对D435i进行双目标定,并…...
old kali网站下载链接爬取-Kali linux 全部版本镜像下载--Index of /kali-images
Kali linux 全部版本镜像下载 目的 出于该网站不稳定原因,故爬取下载链接,以便网友下载老版本kali from bs4 import BeautifulSoup import requests from urllib.parse import urljoinbase_url "http://old.kali.org/kali-images/" visite…...
基于千眼狼高速摄像机与三色掩模的体三维粒子图像测速PIV技术
研究背景 航空航天、能源动力领域,测量三维瞬态流场的速度场信息对于理解流体力学行为、优化系统设计非常关键。 传统三维粒子图像测速技术如Tomo层析PIV,因依赖多相机阵列,存在系统体积、操作复杂,在封闭空间测量存在困难&#…...
Tauri(2.5.1)+Leptos(0.7.8)开发桌面应用--程序启动界面
前期使用Tauri(2.5.1)Leptos(0.7.8)写了一个自用桌面小程序,详见:使用Tauri 2.3.1Leptos 0.7.8开发桌面小程序汇总_tauri 小程序-CSDN博客。 在此基础上,尝试给程序添加启动界面,效果如下图所示。 1. 添加启动画面设置 在src-ta…...
Gmsh划分网格|四点矩形
先看下面这段官方自带脚本 /*********************************************************************** Gmsh tutorial 1** Variables, elementary entities (points, curves, surfaces), physical* entities (points, curves, surfaces)********************************…...
I/O多路复用(select/poll/epoll)
通过一个进程来维护多个Socket,也就是I/O多路复用,是一种常见的并发编程技术,它允许单个线程或进程同时监视多个输入/输出(I/O)流(例如网络连接、文件描述符)。当任何一个I/O流准备好进行读写操…...
一键生成达梦、Oracle、MySQL 数据库 ER 图!解锁高效数据库设计!
从事企业软件项目开发的同学们一定对 ER 图很熟悉,可以帮助用户快速厘清数据库结构,方便后续维护和优化。但是在日常工作中,面对复杂的数据结构,整理表设计文档对于每一位DBA来说都很头大,需要将设计细节转化为条理清晰…...
学习黑客 windows 设置与控制面板详解
Windows 设置与控制面板详解:双剑合璧的系统配置工具 ⚙️🔧 学习目标:理解Windows设置和控制面板的异同、掌握系统配置的安全最佳实践 1. 引言:双界面的系统配置世界 🌐 在Windows操作系统中,有两个强大的…...
pytorch模型画质增强简单实现
使用数据增强技术可以增加数据集中图像的多样性,从而提高模型的性能和泛化能力,主要的图像增强技术包括。 亮度,对比度调节 在开始图像大小的调整之前我们需要导入数据(图像以眼底图像为例)。 from PIL import Image f…...
C++中的std::allocator
C中的std::allocator 文章目录 C中的std::allocator1.std::allocator1.1C中的placement new 和operator new1.2一个custom allocator的实现1.3使用std::allocator_traits实现allocator 1.std::allocator C中的std::allocator默默工作在CSTL中的所有容器的内存分配上࿰…...
Linux文件编程——read函数与lseek函数
一、read函数 在 Linux 文件编程中,read 函数是一个系统调用,用于从文件描述符(File Descriptor)指向的文件或设备中读取数据到缓冲区。它是 Unix/Linux 系统编程中实现底层 I/O 操作的核心函数之一。以下是 read 函数的详细使用…...
STM32 变量存储
一、存储区划分与变量分类 STM32的存储空间分为Flash(非易失性)和RAM(易失性)两大区域: Flash存储器 代码段(Code):存储程序指令和常量(如字符串、const变量&…...
解锁性能密码:Linux 环境下 Oracle 大页配置全攻略
在 Oracle 数据库运行过程中,内存管理是影响其性能的关键因素之一。大页内存(Large Pages)作为一种优化内存使用的技术,能够显著提升 Oracle 数据库的运行效率。本文将深入介绍大页内存的相关概念,并详细阐述 Oracle 在…...
HashMap中哈希值与数组坐标的关联
目录 1、哈希值的生成与处理 2、计算桶的索引 3、哈希值总结 4、哈希冲突解决方案 4.1. 拉链法(Separate Chaining) 4.2. 开放寻址法(Open Addressing) 1、线性探测(Linear Probing) 2、二次探测&a…...
GBK与UTF-8编码问题(1)
1. 问题现象 我们在编译.py的python代码时,有时会遇到如下图这种问题。提示说“SyntaxError: (unicode error) ‘utf-8’ codec can’t decode byte 0xc4 in position 0: invalid continuation byte”,代码中有中文字符,这似乎和文件的编码方…...
大模型的实践应用41-天气预测与分析决策系统:Qwen3(32B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法
大家好,我是微学AI,今天给大家介绍一下大模型的实践应用41-Qwen3(32B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法研发天气预测与分析决策系统。本项目构建一个基于大模型Qwen3(32B)、LangChain框架、MCP协议、RAG技术以及传统算法的天气预测与分析决策系统。该系统通…...
单片机学习Day08--相邻流水灯
一,题目:同时点亮相邻的两个灯,并实现流水设计。 亮的是0; 最前面是LED8. #include <REGX51.H> typedef unsigned int u16; typedef unsigned char u8; #define led P2 void delay_10us(u16 t) { while(t--); } void mai…...
邮件营销应对高退信率的策略
一、邮件列表管理 1. 使用专业工具验证 借助如 Geeksend 邮箱验证等专业工具,全面清洗邮件列表,剔除无效、过期或格式错误的邮箱地址,确保邮件精准送达有效收件人,从而降低退信率。 2. 定期清理无效地址 将定期清理邮件列表纳入…...
无线定位之 三 SX1302 网关源码 thread_gps 线程详解
前言 笔者计划通过无线定位系列文章、系统的描述 TDOA 无线定位和混合定位相关技术知识点, 并以实践来验证此定位系统精度。 笔者从实践出发、本篇直接走读无线定位系统关键节点、网关 SX1302 源码框架,并在源码走读过程 中、着重分析与无线定位相关的PPS时间的来龙去脉、并在…...
Kubernetes控制平面组件:Kubelet详解(一):API接口层介绍
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
Java项目层级介绍 java 层级 层次
java 层级 层次 实体层 控制器层 数据连接层 Service : 业务处理类 Repository :数据库访问类 Java项目层级介绍 https://blog.csdn.net/m0_67574906/article/details/145811846 在Java项目中,层级结构(Layered Architecture…...
【操作系统】零拷贝技术
1. DMA技术 DMA技术也就是直接内存访问技术。在进行I/O设备和内存的数据传输的时候,数据传输的工作全部交给DMA控制器,而不是CPU负责。 2. 传统的文件传输 传统的文件传输的代码如下: read(file, tmp_buf, len); write(socket, tmp_buf,…...