电控---CMSIS概览
1. CMSIS库简介
CMSIS(Cortex Microcontroller Software Interface Standard,Cortex微控制器软件接口标准)是由ARM公司开发的一套标准化软件接口,旨在为基于ARM Cortex-M系列处理器(如Cortex-M0/M0+/M3/M4/M7/M33等)的微控制器提供统一的软件编程接口,简化跨厂商芯片的软件开发,提高代码复用率和移植性。
核心作用
- 统一硬件抽象层
屏蔽不同厂商Cortex-M芯片的底层差异,提供一致的寄存器访问、中断管理、系统控制(如SysTick、NVIC)等接口,开发者无需为不同品牌的芯片重写底层代码。 - 加速开发效率
提供标准化的外设驱动模板、示例代码和工具链支持,降低学习成本,缩短产品开发周期。 - 促进生态兼容
支持主流IDE(如Keil、IAR、GCC)和实时操作系统(RTOS,如FreeRTOS、uCOS),便于整合第三方中间件(如DSP库、安全模块)。
主要组成部分
1. 核心层(CMSIS Core)
- 内核访问接口:提供对Cortex-M内核寄存器(如NVIC、SysTick、MPU)的标准化访问函数和头文件,确保不同厂商芯片的内核功能调用一致。
- 设备启动代码:包含启动文件(如
startup.s
)和系统初始化函数(SystemInit()
),用于芯片上电后的初始配置。
2. 设备外设访问层(CMSIS Device)
- 厂商特定外设驱动:由芯片厂商实现,定义外设寄存器地址、结构体和操作函数(如GPIO、UART、SPI等),遵循统一的命名和使用规范。
- 片上资源描述:通过头文件(如
stm32f4xx.h
)声明芯片型号、外设基地址和寄存器位定义,确保跨厂商代码的兼容性。
3. 中间件接口层(CMSIS Middleware)
- DSP与数学库(CMSIS-DSP):提供优化的数字信号处理函数(FFT、滤波、矩阵运算等),支持定点/浮点运算,充分利用Cortex-M的SIMD和浮点单元(FPU)。
- RTOS接口(CMSIS-RTOS):定义与RTOS交互的统一API(如线程管理、信号量、消息队列),便于在不同RTOS间移植应用代码。
- 安全与存储接口(CMSIS-SVD、CMSIS-Security):支持外设寄存器描述文件(SVD)解析、安全启动和加密功能。
优势与特点
- 跨厂商兼容性
同一套代码可在不同品牌的Cortex-M芯片(如STM32、NXP LPC、瑞萨RX、TI Tiva等)上复用,只需替换设备相关的头文件和启动代码。 - 工具链无关性
支持Keil、IAR、GCC等主流开发工具,编译配置统一,减少工具链适配成本。 - 丰富的生态支持
- CMSIS-Pack:ARM提供的软件包管理系统,整合了设备支持包、中间件和示例代码,可通过工具(如Keil Pack Installer)快速安装。
- 开源与标准化:接口规范公开,厂商和开发者可共同维护,降低技术锁定风险。
2 组成部分
2.1 CMSIS - Core
这是CMSIS库的核心部分,它为Cortex - M内核提供了统一的访问接口,主要包含以下几个方面:
2.1.1 内核寄存器访问
通过定义一系列的结构体和宏,开发者可以方便地访问Cortex - M内核的寄存器,如NVIC(Nested Vectored Interrupt Controller)、SysTick(系统定时器)、SCB(System Control Block)等。例如,在访问NVIC寄存器时,可以使用如下代码示例:
// 使能中断号为5的中断
NVIC_EnableIRQ(5);
这里的NVIC_EnableIRQ
函数是CMSIS - Core提供的标准函数,用于使能指定中断号的中断。
2.1.2 系统初始化
提供了SystemInit
函数,用于对系统时钟、复位和中断向量表等进行初始化。这个函数通常在启动代码中被调用,为后续的程序运行做好准备。以下是一个简化的SystemInit
函数调用示例:
int main(void)
{SystemInit();// 后续代码while(1){// 主循环}
}
2.1.3 异常和中断处理
定义了异常和中断处理的通用接口。开发者可以通过编写特定的中断处理函数,并在中断向量表中进行注册,来处理各种中断事件。例如,对于外部中断处理函数的定义:
void EXTI0_IRQHandler(void)
{// 处理外部中断0的代码// 清除中断标志等操作
}
2.2 CMSIS - Device
这部分由芯片厂商实现,针对特定的微控制器提供外设的访问接口。
2.2.1 外设寄存器定义
厂商会根据芯片的硬件特性,定义每个外设的寄存器结构体和地址。例如,对于GPIO(通用输入输出)外设,会定义GPIO寄存器结构体,包含数据寄存器、控制寄存器等。以下是一个简单的GPIO寄存器结构体示例:
typedef struct
{__IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */__IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */__IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */__IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */__IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */// 其他寄存器...
} GPIO_TypeDef;
2.2.2 外设驱动函数
厂商会提供一系列的外设驱动函数,方便开发者对各种外设进行配置和操作。例如,对于UART(通用异步收发传输器)外设,会有初始化函数、发送数据函数和接收数据函数等。以下是一个UART初始化函数的示例:
void UART_Init(UART_HandleTypeDef *huart)
{// 配置UART寄存器// 波特率、数据位、停止位等huart->Instance->BRR = 0x0000; // 示例代码,实际需要根据波特率计算// 使能UARThuart->Instance->CR1 |= USART_CR1_UE;
}
2.3 CMSIS - DSP
CMSIS - DSP库提供了一系列优化的数字信号处理函数,用于在Cortex - M微控制器上进行高效的信号处理。
2.3.1 基本数学函数
包括三角函数、指数函数、对数函数等。这些函数针对Cortex - M内核进行了优化,能够在有限的资源下实现较高的计算性能。例如,计算正弦函数:
#include "arm_math.h"float32_t angle = 0.5f;
float32_t result;
arm_sin_f32(angle, &result);
2.3.2 滤波函数
提供了各种滤波器的实现,如FIR(有限长单位冲激响应)滤波器、IIR(无限长单位冲激响应)滤波器等。以下是一个简单的FIR滤波器初始化和使用示例:
#include "arm_math.h"#define NUM_TAPS 10
float32_t firCoeffs[NUM_TAPS] = {0.1, 0.2, 0.3, 0.2, 0.1, 0.1, 0.2, 0.3, 0.2, 0.1};
float32_t firStateF32[NUM_TAPS + BLOCK_SIZE - 1];
arm_fir_instance_f32 S;// 初始化FIR滤波器
arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs[0], &firStateF32[0], BLOCK_SIZE);// 处理输入数据
float32_t input[BLOCK_SIZE];
float32_t output[BLOCK_SIZE];
arm_fir_f32(&S, input, output, BLOCK_SIZE);
2.3.3 矩阵运算函数
支持矩阵的加法、乘法、求逆等运算。以下是一个矩阵乘法的示例:
#include "arm_math.h"#define ROWS_A 2
#define COLS_A 3
#define COLS_B 2float32_t A[ROWS_A * COLS_A] = {1, 2, 3, 4, 5, 6};
float32_t B[COLS_A * COLS_B] = {7, 8, 9, 10, 11, 12};
float32_t C[ROWS_A * COLS_B];arm_matrix_instance_f32 matA, matB, matC;
arm_mat_init_f32(&matA, ROWS_A, COLS_A, A);
arm_mat_init_f32(&matB, COLS_A, COLS_B, B);
arm_mat_init_f32(&matC, ROWS_A, COLS_B, C);arm_mat_mult_f32(&matA, &matB, &matC);
2.4 CMSIS - RTOS
CMSIS - RTOS提供了一套统一的实时操作系统(RTOS)接口,使得开发者可以在不同的RTOS之间进行切换,而不需要对应用代码进行大量修改。
2.4.1 任务管理
提供了创建、删除、挂起和恢复任务的接口。以下是一个简单的任务创建示例:
#include "cmsis_os.h"void task1(void const * argument)
{while(1){// 任务1的代码}
}osThreadDef(task1, osPriorityNormal, 1, 0);
osThreadId task1_id = osThreadCreate(osThread(task1), NULL);
2.4.2 同步与通信
支持信号量、互斥锁、消息队列等同步和通信机制。以下是一个信号量的使用示例:
#include "cmsis_os.h"osSemaphoreId semaphore_id;
osSemaphoreDef(semaphore);// 创建信号量
semaphore_id = osSemaphoreCreate(osSemaphore(semaphore), 1);// 等待信号量
osSemaphoreWait(semaphore_id, osWaitForever);// 释放信号量
osSemaphoreRelease(semaphore_id);
3. 版本与兼容性
CMSIS有不同的版本,每个版本在功能和兼容性上可能会有所差异。目前,CMSIS 5是比较新的版本,它在CMSIS 4的基础上进行了改进,支持更多的Cortex - M内核型号,并且对一些功能进行了优化和扩展。
4. 开发流程
4.1 环境搭建
首先需要选择合适的开发工具,如Keil MDK、IAR Embedded Workbench等。然后根据芯片型号下载对应的CMSIS设备支持包,并将其添加到开发环境中。
4.2 代码编写
根据需求选择使用CMSIS的不同部分。如果是进行系统初始化和中断处理,主要使用CMSIS - Core;如果是操作外设,使用CMSIS - Device;如果需要进行数字信号处理,使用CMSIS - DSP;如果要实现多任务管理,使用CMSIS - RTOS。
4.3 编译和调试
使用开发工具对代码进行编译和链接,生成可执行文件。然后通过调试器(如JTAG、SWD)将程序下载到目标芯片中进行调试。
5. 应用场景
- 嵌入式系统开发:适用于物联网(IoT)、工业控制、消费电子、汽车电子等领域的Cortex-M芯片项目。
- 底层驱动开发:编写与硬件无关的上层应用逻辑,或基于现有驱动快速构建复杂系统。
- 中间件集成:通过CMSIS-DSP优化信号处理算法,或利用CMSIS-RTOS接口实现多任务管理。
5.1 工业控制
在工业自动化领域,CMSIS库可以用于实现电机控制、传感器数据采集和处理等功能。例如,使用CMSIS - DSP库对传感器采集到的信号进行滤波和分析,使用CMSIS - Device库对电机驱动外设进行控制。
5.2 消费电子
在智能手表、智能家居等消费电子产品中,CMSIS库可以帮助开发者快速实现各种功能。例如,使用CMSIS - RTOS实现多任务管理,使设备能够同时处理多个任务,如显示界面更新、传感器数据采集等。
5.3 物联网
在物联网设备中,CMSIS库可以用于实现低功耗通信、数据处理等功能。例如,使用CMSIS - Core对系统进行低功耗管理,使用CMSIS - DSP库对采集到的环境数据进行处理和分析。
6. 局限性
虽然CMSIS库提供了很多便利,但也存在一些局限性。例如,对于一些特殊的硬件特性,CMSIS库可能没有提供相应的接口,开发者需要自己编写底层代码来实现。此外,CMSIS - RTOS接口只是一个标准,不同的RTOS在实现上可能会有一些差异,在实际使用中可能需要进行一些适配工作。
7.版本与获取
- 版本演进:当前主流版本为CMSIS 5,新增了对Cortex-M33/M55等新型号的支持,强化了安全特性和包管理机制。
- 资源获取:
- ARM官网提供CMSIS核心库和工具链文档(ARM CMSIS官网)。
- 芯片厂商(如ST、NXP)在官网提供针对其产品的CMSIS设备支持包。
总结
CMSIS库是Cortex-M生态的重要基础设施,通过标准化接口降低了嵌入式开发的复杂度,推动了跨厂商、跨工具链的代码复用,是现代嵌入式系统开发中提高效率和可维护性的关键技术之一。无论是底层驱动开发还是上层应用设计,CMSIS都为开发者提供了统一且高效的编程框架。
高低灯火,鼎沸笙箫。
一年三百六十日,
愿长似今宵。 —杨无咎
相关文章:
电控---CMSIS概览
1. CMSIS库简介 CMSIS(Cortex Microcontroller Software Interface Standard,Cortex微控制器软件接口标准)是由ARM公司开发的一套标准化软件接口,旨在为基于ARM Cortex-M系列处理器(如Cortex-M0/M0/M3/M4/M7/M33等&am…...
2025.04.17【Stacked area】| 生信数据可视化:堆叠区域图深度解析
文章目录 生信数据可视化:堆叠区域图深度解析堆叠面积图简介为什么使用堆叠面积图如何使用R语言创建堆叠面积图安装和加载ggplot2包创建堆叠面积图的基本步骤示例代码 解读堆叠面积图堆叠面积图的局限性实际应用案例示例:基因表达量随时间变化 结论 生信…...
XSS之同源、跨域、内容安全策略
一、什么是同源策略 HTML的同源策略是浏览器的一个重要的安全机制,它用于限制一个源的网页如何与另一个源的资源进行交互,以此来减少夸站脚本攻击(XSS)和跨站请求伪造(CSRF)等安全风险。 同源的定义 若两个URL的协议(protocol)、…...
十三、系统设计
一、前言 二、架构设计概念 三、架构风格 四、面向服务的架构 五、微服务 六、MDA 七、软件界面设计 八、软件设计的构成 九、结构化设计 十、面向对象设计内容提要 十一、面向对象设计原则 十二、架构模式、设计模式与惯用法...
HTTP 2.0 协议特性详解
1. 使用二进制协议,简化传输的复杂性,提高了效率 2. 支持一个 TCP 链接发起多请求,移除 pipeline HTTP/2 移除了 HTTP/1.1中的管道化(pipeline)机制,转而采用多路复用(Multiplexing࿰…...
MySQL数据备份
一,为什么要进行数据备份 备份:能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方。冗余: 数据有多份冗余,但不等备份,只能防止机械故障带来的数据丢失,例如…...
【Ai】CherryStudio 详细使用:本地知识库、MCP服务器
一、CherryStudio 介绍 Cherry Studio 是一款集多模型对话、知识库管理、AI 绘画、翻译等功能于一体的全能 AI 助手平台。 Cherry Studio 高度自定义的设计、强大的扩展能力和友好的用户体验,使其成为专业用户和 AI 爱好者的理想选择。无论是零基础用户还是开发者&…...
STM32F103_HAL库+寄存器学习笔记17 - CAN中断接收 + 接收CAN总线所有报文
导言 如上所示,本实验的目的是使能CAN接收FIFO1的挂号中断,使用CAN过滤器0与CAN接收FIFO1的组合,接收CAN总线上所有的CAN报文。 如上所示,STM32F103有两个3级深度的接收FIFO。外设CAN想要正常接收CAN报文,必须配置接收…...
kafka报错:The Cluster ID doesn‘t match stored clusterId Some in meta.properties
kafka启动报错: ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer) kafka.common.InconsistentClusterIdException: The Cluster ID kVSgfurUQFGGpHMTBqBPiw doesnt match stored clusterId Some(0Qftv9yBTAmf2iDPSl…...
QML 信号与槽
QML 信号与槽 QML 是 Qt 框架中用于构建现代化、流畅用户界面的声明式语言,其信号与槽(Signals and Slots)机制是实现组件间通信和交互的核心特性。与 C 的信号与槽类似,QML 的信号与槽提供了一种松耦合的方式,允许界…...
数据结构-栈
大家好,今天带来的是关于数据结构初阶中的栈和队列的内容,一起来看看吧!!! 1.栈的概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为…...
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
摘要 本文以原理与示例结合的形式讲解 Java 开发者如何基于 Spring AI Alibaba 框架玩转 MCP,主要包含以下内容。 1. 一些 MCP 基础与快速体验(熟悉的读者可以跳过此部分) 2. 如何将自己开发的 Spring 应用发布为 MCP Server,验…...
CSS核心笔记001
目录 杂七杂八知识点样式优先级风格基本选择器通配符元素类ID 复合选择器交集选择器并集后代-孙子儿子兄弟属性各种属性选择器的应用 伪类动态伪类结构伪类否定伪类目标为类语言伪类UI伪类 伪元素 杂七杂八知识点 样式优先级 行内 > 内部 > 外部风格 紧凑风格基本选择…...
Windows快速切换屏幕/桌面
windows自带的切屏 需要winctrl 小键盘左右键 但是! Windows使用还是键盘加鼠标舒服! 教程 安装autohotkey 代码 ~LWin & LButton::{SendInput "^#{Left}" ; 发送 Win Ctrl Left (切换到左侧虚拟桌面) } ; 使用花括号包裹命令&a…...
ESP32- 开发笔记- 硬件设计-ESP32-C3基本电路
ESP32的最小电路 1 ESP32固件下载 ESP32 有多种下载(烧录)固件的方式,具体选择取决于开发环境和硬件连接。以下是常见的几种下载方式: 1.1 USB 串口下载(最常用) 适用场景:通过 USB 转串口芯片(如 CP2102、CH340)连接电脑,使用 esptool 或其他工具烧录固件。这里…...
webgl入门实例-09索引缓冲区示例
实现效果 实现代码 <!doctype html> <html lang"en"><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport"content"widthdevi…...
STM32 串口中断接收方式笔记:HAL_UART_Receive_IT vs __HAL_UART_ENABLE_IT
📘 STM32 串口中断接收方式笔记:HAL_UART_Receive_IT vs __HAL_UART_ENABLE_IT 🧠 1. 两者作用简述 函数/宏作用是否配置HAL状态是否调用Rx回调HAL_UART_Receive_IT()启动一次基于中断的串口接收任务✅ 是✅ 是__HAL_UART_ENABLE_IT()手动使…...
ubuntu 向右拖动窗口后消失了、找不到了
这是目前单显示器的设置,因为实际只有1个显示器,之前的设置如下图所示,有2个显示器,一个主显示器,一个23寸的显示器 ubuntu 22.04 系统 今天在操作窗口时,向右一滑,发现这个窗口再也不显示了、找…...
Selenium 获取 Web 页面信息的全指南
Selenium 获取 Web 页面信息的全指南 Selenium 是一个功能强大的自动化测试工具,但它也可以用于 web 页面信息的抓取和分析。本文将详细介绍如何使用 Selenium 来获取网页信息,并涵盖从环境搭建到高级技巧的各个方面。 目录 简介环境搭建Selenium 的基…...
stm32-lm75、SPI
一、lm75--温度传感器 LM75 是一种数字温度传感器和带有 2 线接口的热监视器(热看门狗),以下是其详细介绍: 一、核心功能与特点 温度检测与转换 内置带隙温度传感器和 Sigma-Delta 模数转换器,可实现 -55℃ 至 125℃ 温…...
介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
Docker 是一种开源的容器化平台,可以帮助开发人员打包、部署和运行应用程序。Docker 的基本概念是利用容器来封装应用程序及其所有依赖项,使其能够在任何环境中快速、可靠地运行。 Docker 的优势包括: 轻量级和灵活性:Docker 容…...
如何判断单片机性能极限?
目录 1、CPU 负载 2、内存使用情况 3、实时性能 4、外设带宽 5、功耗与温度 在嵌入式系统设计中,当系统变得复杂、功能增加时,单片机可能会逐渐逼近其性能极限。及时识别这些极限点对于保证产品质量、稳定性和用户体验至关重要。 当你的嵌入式系统…...
LeetCode 2919 使数组变美的最小增量运算数
动态规划解题:最小操作次数使数组变为美丽数组 问题描述 给定一个下标从0开始、长度为n的整数数组nums和一个整数k。你可以对数组中的任意一个元素进行加1操作,操作次数不限。如果数组中任意长度大于或等于3的子数组的最大值都大于或等于k,…...
5.VTK 相机
文章目录 概念示例 概念 在VTK(VisualizationToolkit)中,相机(vtkCamera)用于定义场景的观察视角。以下是关于VTK相机的主要概念和设置方法的总结: 相机位置:通过vtkCamera::SetPosition()方法设…...
基于Flask的网络安全渗透知识库系统架构解析
基于Flask的网络安全渗透知识库系统架构解析 一、系统架构概述 本系统采用经典的三层Flask架构设计,通过模块化的方式实现渗透技术知识库的展示与管理。整体架构包含以下核心组件: 路由控制层:app.py作为入口文件模板展示层:Ji…...
Flutter BigInt 是用于处理任意精度整数的特殊数字类型,专为解决超大整数运算需求而设计
在Flutter/Dart中,BigInt 是用于处理任意精度整数的特殊数字类型,专为解决超大整数运算需求而设计。以下是从原理到实践的全面解析: 一、核心特性 特性说明任意精度突破普通int的64位限制(-2^63 ~ 2^63-1),…...
绿幕抠图直播软件-蓝松抠图插件--使用相机直播,灯光需要怎么打?
使用SONY相机进行绿幕抠图直播时,灯光布置是关键,直接影响抠图效果和直播画质。以下是详细的灯光方案和注意事项: 一、绿幕灯光布置核心原则 均匀照明:绿幕表面光线需均匀,避免阴影和反光(亮度差控制在0.5…...
DeepSeek在数据仓库的10大应用场景
一、智能数据集成与清洗 多源数据整合:DeepSeek能够从多种数据源中提取、转换和加载数据,实现跨系统数据的高效整合。 数据清洗与标准化:通过智能算法自动识别并纠正数据中的错误、不一致性和缺失值,提升数据质量。 二、数据仓…...
Java 工厂设计模式详解:用统一入口打造灵活可扩展的登录系统----掌握 Spring 源码的基础第一步
一、前言 在实际开发中,我们经常面临以下场景: 系统支持多种登录方式(用户名密码、管理员登录、OAuth 登录、短信登录等) 每种登录方式的认证逻辑不同 我们希望对外提供一个统一的接口调用,而不暴露具体实现 这个…...
算法备案和大模型备案能否同时申请?
最近收到很多小伙伴咨询说“算法备案和大模型备案能不能同时申请?”也有一些小伙伴们还分不清算法备案和大模型备案的区别,纷纷询问做了大模型备案还需要做算法备案吗?今天一篇文章带大家了解一下,算法备案和大模型备案究竟是怎么…...
【2025“华中杯”大学生数学建模挑战赛】C题:就业状态分析与预测 详细解题思路
目录 2025“华中杯”大学生数学建模挑战赛C题 详细解题思路一、问题一1.1 问题分析1.2 数学模型 1.3 Python代码1.4 Matlab代码 二、问题二2.1 问题分析2.2 数学模型 2.3 Python代码2.4 Matlab代码 三、问题三3.1 问题分析 四、问题四4.1 问题分析与数学模型 2025“华中杯”大学…...
纷析云开源财务软件:助力企业财务管理数字化转型
在当今数字化时代,企业对财务管理工具的需求日益增长,而开源软件以其透明性、灵活性和成本优势成为越来越多企业的选择。纷析云开源财务软件作为一款专注于企业财务数字化的开源解决方案,不仅提供了强大的功能支持,还通过开源生态…...
APang网联科技项目报告(服务器域管理篇)
APang网联科技:连接未来,智能领航 公司简介 APang网联科技成立于 [2005年],总部位于 [广东深圳],是一家集网络技术研发、系统集成、项目实施与运维服务为一体的高新技术企业。我们致力于为客户提供全方位、定制化的网络部署解决…...
制作Unoconv项目的Docker镜像
制作Unoconv项目的Docker镜像 1 介绍 1.1 Unoconv 在Linux下将Office转换为pdf的很多包仅支持Windows,Unoconv是一个用LibreOffice转化文档的项目,已经归档(2025-3-31)。迁移后的新版本是unoserver,unoserver不太好…...
神经网络--拓扑排序+思维
1.c<0的点赋0,不然会影响后面的入度 2.最后输出层是出度为0的,且题干要求输出c大于0的 3.有q0的情况,所以输的事后就会有答案 https://www.luogu.com.cn/problem/P1038 #include<bits/stdc.h> #include<string> using nam…...
更强的视觉 AI!更智能的多模态助手!Qwen2.5-VL-32B-Instruct-AWQ 来袭
Qwen2.5-VL-32B-Instruct 是阿里巴巴通义千问团队于 2025 年 3 月 24 日开源的多模态大模型,基于 Apache 2.0 协议发布。该模型在 Qwen2.5-VL 系列的基础上,通过强化学习技术优化,以 32B 参数规模实现了多模态能力的突破。 核心特性升级&…...
逻辑过期怎么设计
设计“逻辑过期”通常用于缓存、令牌管理、数据有效性验证等场景,其核心是通过业务逻辑判断数据是否过期(而非单纯依赖物理时间)。以下是设计逻辑过期的关键思路和实现方案: 1. 核心思想 物理过期:基于固定的时间&…...
EMIF详解
一、EMIF的基本定义 EMIF(External Memory Interface,外部存储器接口) 是嵌入式处理器(如DSP、FPGA、SoC)用于连接外部存储器的专用硬件接口模块,负责管理处理器与存储器之间的地址/数据总线、控制信号及时…...
Kubernetes》》K8S》》Pod调度机制
nodeName 、nodeSelector nodeName 是强绑定,nodeSelector是弱绑定 强绑定,如果Node失效时,则会导致Pod也无法调度 apiVersion: v1 kind: Pod metadata:name: example-pod spec:# nodeName Pod应该被调度到哪个具体的节点上 强绑定nodeNam…...
具身智能机器人学习路线全解析
一、引言 具身智能机器人作为融合了机器人学、人工智能、认知科学等多领域知识的前沿技术,正逐渐改变着我们的生活和工作方式。从工业制造到家庭服务,从医疗护理到太空探索,具身智能机器人都展现出了巨大的潜力。对于想要深入了解和学习这一…...
【PGCCC】Postgres MVCC 内部:更新与插入的隐性成本
为什么 Postgres 中的更新操作有时感觉比插入操作慢?答案在于 Postgres 如何在后台管理数据版本。 Postgres 高效处理并发事务能力的核心是多版本并发控制(MVCC)。 在本文中,我将探讨 MVCC 在 Postgres 中的工作原理以及它如何影响…...
ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(输入类外设之触摸屏 Touch)
目录 ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(输入类外设之触摸屏 Touch)简介模块概述功能定义架构位置核心特性 触摸(Touch)外设触摸外设概述触摸外设API和数据结构外设层API(periph_touch.h/periph_touch…...
Python高级爬虫之JS逆向+安卓逆向1.5节: 控制结构
目录 引言: 1.5.1 Python中的控制结构 1.5.2 条件控制 1.5.3 循环控制 1.5.4 跳转控制 1.5.5 爬虫不要接学生单 引言: 大神薯条老师的高级爬虫安卓逆向教程: 这套爬虫教程会系统讲解爬虫的初级,中级,高级知识&a…...
Spine-Leaf 与 传统三层架构:全面对比与解析
本文将详细介绍Spine-Leaf架构,深入对比传统三层架构(Core、Aggre、Access),并探讨其与Full-mesh网络和软件定义网络(SDN)的关联。通过通俗易懂的示例和数据中心网络分析,我将帮助您理解Spine-L…...
微信小程序文字混合、填充动画有效果图
效果图 .wxml <view class"text" style"--deg:{{deg}}deg;"><view>混合父级颜色</view> </view> <view class"fill {{status?action:}}">文字颜色填充</view> <button bind:tap"setStatus"…...
山东大学软件学院创新项目实训开发日志(15)之中医知识问答历史对话查看bug处理后端信息响应成功但前端未获取到
在开发中医知识问答历史对话查看功能的时候,出现了前后端信息获取异同的问题,在经过非常非常非常艰难的查询之后终于解决了这一问题,而这一问题的罪魁祸首就是后端没有setter和getter方法!!!!&a…...
HttpSessionBindingListener 的用法笔记250417
HttpSessionBindingListener 的用法笔记250417 HttpSessionBindingListener 是 Java Servlet 规范中 唯一 由 被存储对象自身实现 的会话监听接口, 1. 核心功能 HttpSessionBindingListener 是一个由 会话属性对象自身实现 的接口,用于监听该对象被绑定…...
EuroCropsML:首个面向少样本时间序列作物分类的多国基准数据集
2025-04-15,由慕尼黑工业大学等机构创建的 EuroCropsML 数据集,这是一个结合了农民报告的作物数据与 Sentinel-2 卫星观测的时间序列数据集,覆盖了爱沙尼亚、拉脱维亚和葡萄牙。该数据集为解决遥感应用中作物类型数据空间不平衡问题提供了新的…...
《如何用 Function 实现动态配置驱动的处理器注册机制?》
大家好呀!👋 今天我们来聊聊一个超实用的技术话题 - 如何用Java的Function接口实现动态配置驱动的处理器注册机制。听起来很高大上?别担心,我会用最简单的方式讲清楚!😊 一、为什么要用Function实现处理器…...
PyTorch:学习 CIFAR-10 分类
🔍 开始你的图像分类之旅:一步一步学习 CIFAR-10 分类 图像分类是计算机视觉中最基础的任务之一,如果你是初学者,那么以 CIFAR-10 为训练场是一个不错的选择。本文一步一步带你从零开始,学习如何用深度学习模型实现图…...