【ARM】CMSIS 软件标准接口

LuckiBit

目录

  • CMSIS:Cortex Microcontroller Software Interface Standard
    • 1. 概述
    • 2. CMSIS-Core
      • 2.1 概述
      • 2.2 关键组件
      • 2.3 示例代码
      • 2.4 详细解释
    • 3. CMSIS-DSP
      • 3.1 概述
      • 3.2 关键组件
      • 3.3 示例代码
      • 3.4 详细解释
    • 4. CMSIS-RTOS
      • 4.1 概述
      • 4.2 关键组件
      • 4.3 示例代码
      • 4.4 详细解释
    • 5. CMSIS-Driver
      • 5.1 概述
      • 5.2 关键组件
      • 5.3 示例代码
      • 5.4 详细解释
    • 6. CMSIS-Pack
      • 6.1 概述
      • 6.2 关键功能
      • 6.3 示例
      • 6.4 详细解释
    • 7. CMSIS-NN
      • 7.1 概述
      • 7.2 关键组件
      • 7.3 示例代码
      • 7.4 详细解释
    • 8. CMSIS-Zone
      • 8.1 概述
      • 8.2 关键功能
      • 8.3 示例
      • 8.4 详细解释
    • 9. CMSIS-RTOS API的详细解析
      • 9.1 概述
      • 9.2 关键接口
      • 9.3 示例代码
      • 9.4 详细解释
    • 10. CMSIS的应用场景
      • 10.1 嵌入式系统
      • 10.2 实时操作系统
      • 10.3 神经网络
      • 10.4 设备驱动
      • 10.5 软件包管理
    • 11. 结论
    • 12. 参考文献
    • 13. 结束语
    • 相关文章:

CMSIS:Cortex Microcontroller Software Interface Standard

在这里插入图片描述

1. 概述

CMSIS(Cortex Microcontroller Software Interface Standard)是由ARM公司开发的一套软件标准接口,旨在为基于ARM Cortex-M处理器的微控制器提供一致的开发接口。CMSIS通过定义一组标准化的API和库函数,极大地简化了嵌入式软件开发的复杂性,提高了代码的移植性和重用性。

CMSIS的主要目标是:

  • 提供一致的开发环境,减少开发时间和成本。
  • 促进代码的重用和移植,提高软件质量和维护性。
  • 支持软件组件的标准化管理和分发。

2. CMSIS-Core

2.1 概述

CMSIS-Core是CMSIS的核心部分,定义了访问Cortex-M处理器核心及其外设的一组标准化接口。这些接口提供了对处理器中断系统、系统控制和配置、系统定时器等的访问。

2.2 关键组件

  • NVIC(Nested Vectored Interrupt Controller):管理中断的优先级和响应。
  • SCB(System Control Block):提供系统控制和配置功能,如异常向量表的基地址、系统重置等。
  • SysTick(System Timer):一个简单的24位递减计数定时器,用于产生系统节拍。
  • MPU(Memory Protection Unit):用于设置和管理内存保护区域。
  • FPU(Floating Point Unit):提供浮点运算功能。

2.3 示例代码

#include "cmsis.h"// 初始化SysTick定时器
void SysTick_Init(void) {SysTick_Config(SystemCoreClock / 1000); // 每1ms产生一次中断
}// SysTick中断服务函数
void SysTick_Handler(void) {// 处理代码
}

2.4 详细解释

NVIC(Nested Vectored Interrupt Controller):NVIC是Cortex-M处理器的核心组件之一,负责管理和处理中断。它允许对中断进行分组、嵌套和优先级管理,使得系统能够高效地响应外部和内部事件。

SCB(System Control Block):SCB提供了一组系统控制和配置寄存器,用于管理系统复位、异常向量表和其他系统配置。SCB还包含系统状态寄存器,用于指示当前的系统状态和异常信息。

SysTick(System Timer):SysTick是一个24位递减计数定时器,通常用于实现操作系统的节拍时钟。SysTick定时器可以配置为在达到零时产生中断,使得系统可以定期执行任务。

MPU(Memory Protection Unit):MPU用于设置和管理内存保护区域,防止未经授权的内存访问。通过配置MPU,开发者可以保护关键数据和代码,提高系统的安全性和可靠性。

FPU(Floating Point Unit):FPU提供硬件浮点运算支持,使得浮点运算可以更高效地执行。对于需要大量浮点运算的应用,如DSP(数字信号处理)和图形处理,FPU显著提高了运算速度。

3. CMSIS-DSP

3.1 概述

CMSIS-DSP库是CMSIS的一部分,提供了一组高度优化的数字信号处理(DSP)函数库。这些函数库涵盖了常见的DSP算法,如滤波器、变换、矩阵运算和统计函数。通过使用CMSIS-DSP库,开发者可以快速实现复杂的DSP算法,并充分利用Cortex-M处理器的硬件能力。

3.2 关键组件

  • 基本数学函数:加减乘除、平方根、倒数等。
  • 复杂数学函数:复数加减乘除等。
  • 过滤器函数:FIR、IIR等。
  • 变换函数:FFT、DCT等。
  • 统计函数:均值、方差、最大值、最小值等。
  • 矩阵运算:矩阵加减乘、转置等。

3.3 示例代码

#include "arm_math.h"void DSP_Example(void) {float32_t input[1024];float32_t output[1024];arm_rfft_fast_instance_f32 S;// 初始化RFFT实例arm_rfft_fast_init_f32(&S, 1024);// 进行FFT变换arm_rfft_fast_f32(&S, input, output, 0);
}

3.4 详细解释

基本数学函数:CMSIS-DSP库提供了一组基本数学运算函数,包括加减乘除、平方根、倒数等。这些函数经过优化,能够高效地在Cortex-M处理器上执行。

复杂数学函数:CMSIS-DSP库还提供了复数运算函数,用于处理复数的加减乘除等运算。复数运算在许多信号处理和通信应用中非常重要。

过滤器函数:CMSIS-DSP库提供了FIR(有限脉冲响应)和IIR(无限脉冲响应)滤波器函数,用于信号滤波和处理。FIR滤波器具有线性相位响应,而IIR滤波器则具有更高的效率和较少的延迟。

变换函数:CMSIS-DSP库提供了FFT(快速傅里叶变换)和DCT(离散余弦变换)函数,用于信号的频域分析和处理。FFT是最常用的变换函数,用于将时域信号转换为频域信号。

统计函数:CMSIS-DSP库提供了一组统计函数,用于计算信号的均值、方差、最大值、最小值等。这些函数对于信号分析和处理非常有用。

矩阵运算:CMSIS-DSP库提供了矩阵加减乘、转置等运算函数,用于线性代数和矩阵计算。矩阵运算在图像处理、机器学习和控制系统中非常常见。

4. CMSIS-RTOS

4.1 概述

CMSIS-RTOS定义了一组标准的实时操作系统(RTOS)API,使得应用程序可以在不同的RTOS上运行,而无需修改代码。CMSIS-RTOS API提供了一些基本的RTOS功能,如任务管理、时间管理、信号量、互斥量等。

4.2 关键组件

  • 线程管理:创建、删除、启动和调度线程。
  • 定时器:软件定时器的创建和管理。
  • 信号量:同步线程间的操作。
  • 互斥量:保护共享资源。
  • 消息队列:线程间的消息传递。
  • 事件标志:用于线程间的事件同步。

4.3 示例代码

#include "cmsis_os2.h"// 线程函数
void thread1(void *argument) {while (1) {// 线程处理代码}
}// 主函数
int main(void) {osKernelInitialize(); // 初始化RTOS内核osThreadNew(thread1, NULL, NULL); // 创建线程osKernelStart(); // 启动RTOS调度器while (1) {// 主循环}
}

4.4 详细解释

线程管理:CMSIS-RTOS API提供了一组函数用于创建、删除、启动和调度线程。每个线程都有自己的栈空间和优先级,RTOS调度器根据线程的优先级和状态来决定哪个线程应该运行。

定时器:CMSIS-RTOS API提供了软件定时器功能,允许开发者创建和管理定时器事件。定时器可以用于周期性任务、延时操作等。

信号量:信号量用于在线程之间同步操作,保证多个线程之间的协调。信号量有两种类型:计数信号量和二进制信号量。计数信号量用于资源管理,而二进制信号量用于简单的同步。

互斥量:互斥量用于保护共享资源,防止多个线程同时访问共享资源而引发竞态条件。互斥量确保在任何时刻只有一个线程可以访问共享资源。

消息队列:消息队列用于在线程之间传递消息,支持多线程间的通信。消息队列可以存储多个消息,并按照先进先出的顺序传递消息。

事件标志:事件标志用于线程间的事件同步,允许一个线程等待另一个线程的事件发生。事件标志可以组合使用,以实现复杂的事件同步机制。

5. CMSIS-Driver

5.1 概述

CMSIS-Driver定义了一组标准化的外设驱动接口,用于访问微控制器的各种外设,如UART、SPI、I2C等。CMSIS-Driver通过提供标准化的驱动接口,使得软件可以方便地移植到不同的硬件平台上,而不需要针对每种硬件重新编写驱动代码。

5.2 关键组件

  • USART驱动:提供串行通信功能。
  • SPI驱动:提供同步串行通信功能。
  • I2C驱动:提供I2C通信功能。
  • CAN驱动:提供控制器局域网通信功能。
  • Ethernet驱动:提供以太网通信功能。
  • USB驱动:提供USB主机和设备功能。
  • 存储驱动:提供对SD卡、NAND Flash等存储设备的访问。

5.3 示例代码

#include "Driver_USART.h"extern ARM_DRIVER_USART Driver_USART1;void USART_Init(void) {Driver_USART1.Initialize(NULL);Driver_USART1.PowerControl(ARM_POWER_FULL);Driver_USART1.Control(ARM_USART_MODE_ASYNCHRONOUS, 115200);Driver_USART1.Control(ARM_USART_CONTROL_TX, 1);Driver_USART1.Control(ARM_USART_CONTROL_RX, 1);
}void USART_Send(char *data, uint32_t len) {Driver_USART1.Send(data, len);
}

5.4 详细解释

USART驱动:CMSIS-Driver中的USART驱动提供了一组标准化的函数,用于初始化、配置和控制USART外设。开发者可以通过这些接口实现串行通信,而不需要关注底层硬件的具体实现。

SPI驱动:SPI驱动提供了同步串行通信功能,用于与各种外设(如传感器、显示器等)进行通信。CMSIS-Driver定义了SPI的标准接口,使得不同硬件平台上的SPI通信代码可以保持一致。

I2C驱动:I2C驱动用于实现I2C总线通信,支持主机和从机模式。CMSIS-Driver中的I2C接口提供了初始化、数据传输和错误处理等功能,简化了I2C外设的使用。

CAN驱动:CAN驱动用于控制器局域网(CAN)的通信,广泛应用于汽车电子、工业控制等领域。CMSIS-Driver中的CAN接口提供了标准化的API,用于消息发送、接收和错误管理。

Ethernet驱动:以太网驱动提供了网络通信功能,支持TCP/IP协议栈的实现。CMSIS-Driver中的Ethernet接口定义了以太网外设的标准操作,使得网络应用程序可以轻松移植到不同的硬件平台上。

USB驱动:USB驱动支持USB主机和设备功能,包括标准的USB协议和各种设备类(如HID、MSC等)。CMSIS-Driver中的USB接口提供了标准化的API,用于实现USB通信和设备管理。

存储驱动:存储驱动用于访问各种存储设备,如SD卡、NAND Flash等。CMSIS-Driver中的存储接口提供了标准化的读写操作,简化了文件系统和存储设备的集成。

6. CMSIS-Pack

6.1 概述

CMSIS-Pack定义了一种软件包描述格式,用于管理和分发软件组件,特别适用于集成开发环境(IDE)。CMSIS-Pack使得软件组件可以方便地安装、更新和移除,简化了软件开发和维护过程。

6.2 关键功能

  • 组件描述:描述组件的内容、依赖关系和版本信息。
  • 设备描述:描述微控制器的特性和外设信息。
  • 环境集成:与IDE集成,便于软件组件的安装、更新和移除。

6.3 示例

<package><vendor>ARM</vendor><name>CMSIS</name><version>5.6.0</version><description>ARM Cortex Microcontroller Software Interface Standard</description><components><component Cclass="Core"><files><file>Include/cmsis_core.h</file><file>Source/cmsis_core.c</file></files></component></components><devices><device Dfamily="Cortex-M4"><file>Device/ARM/Cortex-M4.svd</file></device></devices>
</package>

6.4 详细解释

组件描述:CMSIS-Pack中的组件描述部分定义了软件包的基本信息,包括名称、版本、描述和依赖关系。通过组件描述,开发者可以清晰地了解软件包的内容和功能。

设备描述:设备描述部分定义了微控制器的特性和外设信息,包括寄存器定义、内存映射和外设地址。设备描述文件通常采用SVD(System View Description)格式,可以在IDE中用于生成寄存器和外设的访问代码。

环境集成:CMSIS-Pack与集成开发环境(IDE)紧密集成,便于软件组件的安装、更新和移除。IDE可以通过解析CMSIS-Pack文件,自动配置项目环境,简化开发过程。

7. CMSIS-NN

7.1 概述

CMSIS-NN库是CMSIS的一部分,提供了一组用于神经网络的函数库,优化了Cortex-M处理器上的神经网络算法的执行效率。CMSIS-NN特别适用于机器学习和人工智能应用,通过提供高效的计算内核,实现低功耗和高性能的神经网络推理。

7.2 关键组件

  • 卷积层:提供卷积操作。
  • 全连接层:提供全连接层操作。
  • 激活函数:如ReLU、Sigmoid等。
  • 池化层:如最大池化、平均池化等。
  • 量化函数:支持神经网络模型的量化操作。

7.3 示例代码

#include "arm_nnfunctions.h"// 卷积层示例
void NN_Example(void) {q7_t input_data[32*32*3];q7_t output_data[32*32*16];q7_t kernel[3*3*3*16];q7_t bias[16];arm_convolve_HWC_q7_basic(input_data, 32, 32, 3, kernel, 3, 16, 1, 1, bias, 0, output_data, 32, NULL, NULL);
}

7.4 详细解释

卷积层:卷积层是神经网络中的基本组成部分,用于提取输入数据中的特征。CMSIS-NN库提供了优化的卷积操作函数,通过利用Cortex-M处理器的SIMD指令集,实现高效的卷积计算。

全连接层:全连接层将输入数据与权重矩阵相乘,并加上偏置,得到输出结果。CMSIS-NN库中的全连接层函数经过优化,能够高效地执行矩阵乘法和加法运算。

激活函数:激活函数用于引入非线性,使得神经网络能够学习复杂的映射关系。CMSIS-NN库提供了常见的激活函数,如ReLU(修正线性单元)、Sigmoid(S形函数)等。

池化层:池化层用于对特征图进行降采样,减少数据量和计算量。CMSIS-NN库提供了最大池化和平均池化函数,能够高效地实现特征图的降采样。

量化函数:量化函数用于将浮点数值转换为定点数值,降低神经网络模型的存储和计算成本。CMSIS-NN库中的量化函数支持模型的量化操作,使得神经网络能够在资源受限的嵌入式系统上高效运行。

8. CMSIS-Zone

8.1 概述

CMSIS-Zone是CMSIS的一个组件,提供了多核处理器和多域应用的内存保护和管理功能。通过CMSIS-Zone,开发者可以将系统划分为多个保护域,每个保护域具有独立的访问权限和资源分配。

8.2 关键功能

  • 内存分区:定义内存区域及其访问权限。
  • 多域支持:支持多域应用的资源隔离和管理。
  • 安全扩展:支持TrustZone-M等安全扩展功能。

8.3 示例

#include "cmsis_zone.h"// 定义内存分区
void Zone_Init(void) {ZONE_Setup(0, 0x20000000, 0x20001000, ZONE_ACCESS_READWRITE);ZONE_Setup(1, 0x20001000, 0x20002000, ZONE_ACCESS_READONLY);
}

8.4 详细解释

内存分区:CMSIS-Zone允许开发者将内存划分为多个保护区域,每个区域可以定义不同的访问权限。这种机制可以有效隔离系统的不同部分,确保关键数据和代码的安全性。例如,可以将敏感数据区域设置为只读,而将其他区域设置为读写,以防止未经授权的访问或修改。

多域支持:多域支持使得系统能够在多个保护域之间实现资源隔离和管理。这对于复杂的嵌入式系统尤其重要,尤其是在需要同时运行多个应用程序或服务的场景中。通过多域支持,系统可以确保各个域之间不会相互干扰,提升了系统的可靠性和安全性。

安全扩展:CMSIS-Zone支持与TrustZone-M等安全扩展的集成,使得系统能够在硬件层面提供增强的安全性。TrustZone-M技术允许处理器将内存和外设分为安全域和非安全域,从而实现更高水平的保护和隔离。通过利用这些安全扩展,开发者可以实现更加安全的嵌入式系统设计。

9. CMSIS-RTOS API的详细解析

9.1 概述

CMSIS-RTOS API是一组用于实时操作系统(RTOS)的标准接口,定义了任务、定时器、信号量、互斥量等基本RTOS功能的操作。通过CMSIS-RTOS API,开发者可以在不同的RTOS上编写可移植的应用程序,而无需修改代码。

9.2 关键接口

  • 任务管理:包括任务创建、删除、启动和管理。
  • 定时器管理:包括软件定时器的创建、启动、停止和回调处理。
  • 信号量:用于线程间同步和互斥。
  • 互斥量:保护共享资源,避免竞态条件。
  • 消息队列:线程间的消息传递和管理。
  • 事件标志:线程间的事件同步和管理。

9.3 示例代码

#include "cmsis_os2.h"#define THREAD_STACK_SIZE 256// 线程1函数
void Thread1(void *argument) {while (1) {// 线程处理代码osDelay(1000); // 延时1秒}
}// 线程2函数
void Thread2(void *argument) {while (1) {// 线程处理代码osDelay(500); // 延时0.5秒}
}int main(void) {osKernelInitialize(); // 初始化RTOS内核// 创建线程1osThreadNew(Thread1, NULL, &(const osThreadAttr_t) {.name = "Thread1",.stack_size = THREAD_STACK_SIZE,.priority = osPriorityNormal});// 创建线程2osThreadNew(Thread2, NULL, &(const osThreadAttr_t) {.name = "Thread2",.stack_size = THREAD_STACK_SIZE,.priority = osPriorityNormal});osKernelStart(); // 启动RTOS调度器while (1) {// 主循环}
}

9.4 详细解释

任务管理:CMSIS-RTOS API提供了一组函数用于管理任务的创建、删除、启动和调度。通过定义任务优先级、堆栈大小和任务属性,开发者可以控制任务的行为和资源分配。任务调度由RTOS调度器根据任务的优先级和状态来决定哪个任务应该运行。

定时器管理:软件定时器用于周期性任务的执行和时间延迟操作。CMSIS-RTOS API允许开发者创建、启动、停止和管理软件定时器。定时器可以在到达设定时间后触发回调函数,用于执行定时操作或定期检查。

信号量:信号量用于线程间的同步和互斥,确保多个线程之间的协调。CMSIS-RTOS API提供了创建、获取、释放和删除信号量的功能。信号量有两种类型:计数信号量和二进制信号量,分别用于资源管理和简单的同步。

互斥量:互斥量用于保护共享资源,避免多个线程同时访问共享资源而引发竞态条件。CMSIS-RTOS API提供了创建、获取、释放和删除互斥量的功能。通过使用互斥量,开发者可以确保在任何时刻只有一个线程可以访问共享资源。

消息队列:消息队列用于线程间的消息传递和管理。CMSIS-RTOS API提供了创建、发送、接收和删除消息队列的功能。消息队列可以存储多个消息,并按照先进先出的顺序传递消息,支持线程间的通信和数据交换。

事件标志:事件标志用于线程间的事件同步和管理。CMSIS-RTOS API提供了创建、设置、清除和等待事件标志的功能。事件标志可以用于线程间的同步和协调,使得一个线程可以等待另一个线程的事件发生。

10. CMSIS的应用场景

10.1 嵌入式系统

CMSIS广泛应用于各种嵌入式系统,包括消费电子产品、工业控制、汽车电子和医疗设备等。通过提供标准化的接口和库,CMSIS简化了嵌入式系统的开发过程,提高了代码的移植性和重用性。

10.2 实时操作系统

CMSIS-RTOS API被广泛应用于实时操作系统中,用于管理任务、定时器、信号量和互斥量等功能。通过CMSIS-RTOS API,开发者可以在不同的RTOS平台上编写可移植的应用程序,简化了RTOS的使用和集成。

10.3 神经网络

CMSIS-NN库在机器学习和人工智能应用中得到了广泛应用。通过提供高效的神经网络计算内核,CMSIS-NN库使得Cortex-M处理器能够高效地执行神经网络推理,适用于低功耗和高性能的嵌入式应用。

10.4 设备驱动

CMSIS-Driver库提供了一组标准化的外设驱动接口,使得开发者可以方便地访问微控制器的各种外设,如UART、SPI、I2C等。通过CMSIS-Driver,驱动代码可以在不同的硬件平台上保持一致,简化了外设驱动的开发和维护。

10.5 软件包管理

CMSIS-Pack定义了一种软件包描述格式,用于管理和分发软件组件。通过CMSIS-Pack,开发者可以方便地安装、更新和移除软件组件,简化了软件开发和维护过程。

11. 结论

CMSIS作为ARM公司开发的一套软件标准接口,提供了统一的开发环境和标准化的API,极大地简化了嵌入式软件开发的复杂性。通过CMSIS-Core、CMSIS-DSP、CMSIS-RTOS、CMSIS-Driver、CMSIS-Pack、CMSIS-NN、CMSIS-Zone等组件,开发者可以高效地实现各种嵌入式应用,包括实时操作系统、神经网络、外设驱动等。CMSIS的标准化接口和库函数使得代码的移植性和重用性大大提高,推动了嵌入式系统的发展和创新。

CMSIS的应用场景非常广泛,从消费电子产品到工业控制,从实时操作系统到神经网络推理,CMSIS都发挥了重要的作用。随着技术的不断发展,CMSIS将继续为嵌入式软件开发提供强大的支持和便利,推动嵌入式系统的进步和创新。

12. 参考文献

  1. ARM官方CMSIS页面

    • ARM CMSIS
      提供了CMSIS的最新文档、下载链接和相关资源。
  2. ARM CMSIS-RTOS API文档

    • CMSIS-RTOS API Documentation
      包含详细的CMSIS-RTOS API说明和使用指南。
  3. ARM CMSIS-DSP库

    • CMSIS-DSP Library
      提供了CMSIS-DSP库的功能说明、示例代码和优化信息。
  4. CMSIS-Pack

    • CMSIS-Pack
      介绍了CMSIS-Pack的使用和软件包管理的详细信息。
  5. CMSIS-NN库

    • CMSIS-NN
      提供了CMSIS-NN库的功能、接口和优化信息。
  6. ARM CMSIS-Zone

    • CMSIS-Zone
      介绍了CMSIS-Zone的功能和应用场景。
  7. Keil MDK

    • Keil MDK
      提供了Keil MDK集成开发环境的详细信息,支持CMSIS的开发和调试。
  8. Github - CMSIS库

    • CMSIS GitHub Repository
      提供了CMSIS库的源码、示例和更新信息。
  9. CMSIS文档下载

    • CMSIS Documentation Downloads
      包含CMSIS的各类文档、开发指南和工具链的下载链接。

13. 结束语

  1. 本节内容已经全部介绍完毕,希望通过这篇文章,大家对 CMSIS 有了更深入的理解和认识。
  2. 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持!点我关注❤️

相关文章:

  • 指针的神秘探险:从入门到精通的奇幻之旅 !

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/394529.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【案例40】Apache中mod_proxy模块的使用

NC中间件 应用场景&#xff1a;配置了apache的情况&#xff0c;包括uap集群&#xff0c;配置https等场景下均适用&#xff1b;如果是单机&#xff08;NC单结点情况不存在问题&#xff0c;则不用配置这项; was环境也不用配置此项。&#xff09; 解决方案&#xff1a;按如下两…

Spring Boot 3.x Rest API最佳实践之API设计

本系列教程将会以企业中API基础功能封装为目标&#xff0c;用最新的Spring Boot 3.x版本来逐步搭建和完善Rest API项目基础架构&#xff0c;并结合实际电商项目中API的实现需求来进行最佳实践。如果觉得对你有帮助&#xff0c;记得点赞收藏&#xff0c;关注小卷&#xff0c;后续…

React性能之--如何避免组件重复渲染?

在react中&#xff0c;我们会发现存在组件会重复渲染&#xff0c;虽然说如果项目不大的话&#xff0c;这点影响不大&#xff0c;但是我们还是尽量避免组件渲染比较好&#xff0c;养成好习惯&#xff0c;尽可能让不管是大小项目&#xff0c;都让性能尽可能优化 。那我们如何避免…

Linux/C 高级——Linux命令

从这里开始&#xff0c;我们展开对Linux/c 高级的学习&#xff0c;首先介绍的是在Linux/c高级中&#xff0c;Linux的部分 目录 1.Linux简介 1.1Linux起源 1.2查看系统版本命令 1.3分层结构 1.4系统关机重启命令 2.Linux安装工具 2.1软件包安装 2.1.1软件包的管理机制 …

计算机基础(Windows 10+Office 2016)教程 —— 第6章 电子表格软件Excel 2016(上)

第6章 电子表格软件Excel 2016 6.1 Excel 2016入门6.1.1 Excel 2016 简介6.1.2 Excel 2016 的操作界面组成6.1.3 Excel 2016 的视图方式6.1.4 Excel 2016 的工作簿及其操作6.1.5 Excel 2016 的工作表及其操作6.1.5 Excel 2016 的工作表及其操作6.1.6 Excel 2016 的单元格及其操…

Typora+PicGo-Core(command line)+Gitee 实现上传图片到图床(看这一文就够)

前言 ​ 对于喜欢写Markdown文档的人来说&#xff0c;Typora无疑是一个写作利器&#xff0c;它有别于其他的Markdown软件&#xff0c;不是一边编辑一边渲染&#xff0c;而是即写即渲染&#xff0c;这样对于浏览md文件也非常友好。此外Typora还支持更换主题&#xff0c;在其官网…

【QT】Qt中Websocket的使用

一、WebSocket的定义 WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455&#xff0c;并由RFC7936补充规范。WebSocket API也被W3C定为标准。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;…

arcgis(shp)注记转CAD(dwg)文字

arcgis&#xff08;shp&#xff09;注记转CAD&#xff08;dwg&#xff09;文字方法如下&#xff1a; 1、添加shp文件&#xff0c;标注要素&#xff0c;然后选标注转注记 2、 点击文件夹图标打开文件夹&#xff0c;选择保存路径。&#xff08;提前需新建好文件地理数据库、数据…

#java学习笔记(面向对象)----(未完结)

一基础相关知识点&#xff1a; 1. 一个对象的调用 首先我们创建一个Phone类 public class Phone {//成员变量String name;int age;String favourite;//成员方法public void myName(){System.out.println(name);}public void myAge(){System.out.println(age);}public void m…

Flink实时数仓(六)【DWD 层搭建(四)交易域、互动域、用户域实现】

前言 今天的任务是完成 DWD 层剩余的事实表&#xff1b;今年的秋招开得比往年早&#xff0c;所以要抓紧时间了&#xff0c;据了解&#xff0c;今年的 hc 还是不多&#xff0c;要是晚点投铁定寄中寄了&#xff1b; 今天还是个周末&#xff0c;不过记忆里我好像整个大学都没有好好…

山姆.奥特尔曼发文暗示:新模型“草莓“即将发布?

山姆.奥特尔曼发文 山姆.奥特尔曼在今天发布了一条推特,图片中所展示的是已经成熟的几颗草莓。要知道之前的"草莓"事件闹的可是沸沸扬扬,而恰巧山姆.奥特尔曼在此时又发出了一条这样的文章。会不会是刻意的在暗示什么呢? 新的模型即将发布&#xff1f; 山姆.奥特尔曼…

视频编辑SDK解决方案,提升了视频内容的趣味性和观赏性

美摄科技&#xff0c;作为视频编辑技术的领航者&#xff0c;凭借其前沿的视频编辑SDK解决方案&#xff0c;正以前所未有的方式&#xff0c;重新定义着互联网泛娱乐、硬件大屏、匿名社交等多个行业场景的体验边界。我们不仅仅是在编辑视频&#xff0c;更是在编织一个充满想象与互…

GIt最新教程通俗易懂

Git学习笔记 一、Git版本控制分类1.1 本地版本控制1.2 集中版本1.3 分布式版本控制系统1.5 Git和SVN的区别二、Git的历史 三、Gti基础学习3.1 Git的基础学习3.2 启动Git 3.3 Git基本的配置3.3.1 配置文件相关位置 四、Git基本理论&#xff08;核心&#xff09;4.1 Git 的工作流…

自驾畅游保定:参观总督署,品美食文化

这是学习笔记的第 2490篇文章 前几天跟孩子聊天&#xff0c;孩子说暑假都没出去玩了&#xff0c;暑假旅行的作业咋写&#xff1f;让我有满满的负疚感&#xff0c;去附近的公园、吃点美食不算旅游&#xff0c;得了&#xff0c;得安排一下一日游。 几个月前心心念的去保定&#x…

Vue 3+Vite+Eectron从入门到实战系列之(四)一Electron热身运动(二)

在electron里面能不呢实现暗黑模式和明亮模式的切换&#xff1f;我们怎么读取主进程里面的数据和系统数据。这篇就是来实现这几个效果的 实现效果 更改系统的主题色 在 App.vue 中添加代码。 <el-button type"warning" click"changeTheme">更改系…

红豆0感舒适衬衫2.0,让这个七夕节变得有点不一样

七夕节又到了&#xff0c;在这个佳人相约的传统节日&#xff0c;红豆舒适男装以“七夕穿红豆 爱人更舒适”为主题带来了24届红豆七夕节。 这是红豆集团连续24年举办红豆七夕节&#xff0c;红豆七夕节也不仅是广受年轻人喜爱的传统节日盛典&#xff0c;同样也是红豆集团打造的特…

CV党福音:YOLOv8实现分类

YOLO作为目标检测领域的常青树&#xff0c;如今以及更新到了YOLOv10&#xff0c;并且还有YOLOX、YOLOS等变体&#xff0c;可以说该系列已经在目标检测领域占据了半壁江山&#xff0c;如今&#xff0c;YOLOv8的发行者ultralytics竟有一统江山之意&#xff0c;其在提出的框架中不…

【书生大模型实战营(暑假场)】入门任务二 Git 关卡

入门任务二 Git 关卡 参考&#xff1a; 教程任务 注意&#xff1a; 项目Github链接 1 闯关任务 1.1 使用 Git 完成破冰介绍 本任务将基于开发机实现&#xff0c;重点在于熟悉Git操作。首先要了解 Git操作的常见四部曲&#xff0c;即&#xff1a;舔 Add&#xff0c;提 Co…

计算机毕业设计选题推荐-电缆行业生产管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Gradle 入门指南:从安装到基础用法详解

文章目录 Gradle 简介安装 Gradle创建和配置 Gradle 项目将 Gradle 项目打成jar包多项目聚合示例项目结构步骤详解 Gradle 简介 Gradle 是一个基于 Groovy 和 Kotlin 的构建工具&#xff0c;用于自动化构建、依赖管理和项目管理。它结合了 Maven 的依赖管理和 Ant 的灵活性&am…