当前位置: 首页 > news >正文

【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. 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持!点我关注❤️

相关文章:

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

相关文章:

【ARM】CMSIS 软件标准接口

目录 CMSIS&#xff1a;Cortex Microcontroller Software Interface Standard1. 概述2. CMSIS-Core2.1 概述2.2 关键组件2.3 示例代码2.4 详细解释 3. CMSIS-DSP3.1 概述3.2 关键组件3.3 示例代码3.4 详细解释 4. CMSIS-RTOS4.1 概述4.2 关键组件4.3 示例代码4.4 详细解释 5. C…...

Qt 小功能:加载等待动画——转圈圈

加载等待动画实现——转圈圈 效果图&#xff1a;&#xff08;看封面最好&#xff09; 关键要点 流畅的动画&#xff1a; 使用 QTimer 每 50 毫秒更新一次动画&#xff0c;确保动画流畅。 视觉效果&#xff1a; 使用 QPainter 的平滑像素转换和抗锯齿选项&#xff0c;提高动画…...

【Linux进程篇】进程终章:POSIX信号量线程池线程安全的单例模式自旋锁读者写者问题

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 前言&#xff1a;在之前的进程间通信时我们就讲到过信号量&#xff0c;他的本质就是一个计数器&#xff0c;用来描述临界资源的一个计数器。我们当时使用电影院的例子来说明信号量。电影院的座位被我们称为临界资源&a…...

MathType7.5破解版下载安装激活图文详细教程(附激活秘钥)

&#x1f31f; 引言&#xff1a;揭秘MathType&#xff0c;数学编辑的瑞士军刀&#xff01; 嘿&#xff0c;各位小伙伴&#xff0c;今天我要给你们安利一个我超级喜欢的数学神器——MathType&#xff01;如果你跟我一样&#xff0c;在处理数学公式时常常感到头疼&#xff0c;那你…...

2-62 基于MATLAB gui 编制短波通信系统

基于MATLAB gui 编制短波通信系统&#xff0c;录制一段语音信号&#xff0c;分别通过AM SSB DSB 等调制信号&#xff0c;加入噪声&#xff0c;然后解调出来&#xff0c;可比较各种调制解调方式的优劣。程序已调通&#xff0c;可直接运行。 2-62 matlab gui - 小红书 (xiaohongs…...

windows C++-C++/WinRT 中创建组件和事件(下)

跨 ABI 的简单信号 如果无需连同事件传递任何形参或实参&#xff0c;则可以定义自己的简单 Windows 运行时委托类型。 以下示例展示 Thermometer 运行时类的更简易版本。 它声明名为 SignalDelegate 的委托类型&#xff0c;然后使用该类型来引发信号类型事件&#xff0c;而不是…...

C++初学者指南-5.标准库(第二部分)--二叉堆操作

C初学者指南-5.标准库(第二部分)–二叉堆操作 文章目录 C初学者指南-5.标准库(第二部分)--二叉堆操作背景什么是“堆”二叉最大堆二叉树的表示 堆操作C标准库中的堆初始化堆收缩堆增长堆 辅助操作sort_heap (Heap → Sorted Array)is_heapis_heap_until 相关内容 不熟悉 C 的标…...

在Ubuntu 16.04上安装Git的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 在现代软件开发中&#xff0c;一个不可或缺的工具是某种版本控制系统。版本控制系统允许您在源代码级别跟踪软件。您可以跟踪更改…...

redis内存淘汰策略-------Reservoir Sampling(水库采样)

文章目录 过期删除策略和内存淘汰策略内存淘汰策略evictionPoolEntryevictionPoolPopulate Reservoir SamplingdictGetRandomKeydictGetSomeKeysReservoir Samplingchatgpt对Reservoir Sampling的介绍 过期删除策略和内存淘汰策略 详细介绍请参考博客“redis过期删除策略和内存…...

C++《类和对象》(上)

在之前的C入门基础知识中我们了解了C的发展过程已经重要性&#xff0c;还初步了解了C中一些相比C语言特有的知识点&#xff0c;例如命名空间、缺少参数、函数重载、引用等&#xff0c;接下来在本篇中我们将开始C整个体系中非常重要的一个知识章节——类和对象&#xff0c;类和对…...

LLM大语言模型算法特训

百度 LLM&#xff08;Large Language Model&#xff09;大语言模型算法特训是一个深度学习领域的高级培训项目&#xff0c;专门设计用于训练和优化大规模语言模型的开发者和研究人员。本文将详细探讨LLM算法的基本原理、训练技术、应用领域以及参与者可以预期的学习收获和挑战。…...

Docker相关笔记

Docker笔记 1. Dockerfile编译构建docker Dockerfile 是一个文本文件&#xff0c;包含了构建 Docker 镜像的所有指令。 Dockerfile 常用的有如下关键字&#xff1a; FROM&#xff1a;指定基础镜像&#xff0c;后续定制操作都是基于这个基础镜像&#xff0c;比如&#xff1a; …...

前端技术day01-HTML入门

一、前端介绍 技术描述HTML用于构建网站的基础结构的CSS用于美化页面的&#xff0c;作用和化妆或者整容作用一样JS实现网页和用户的交互Vue主要用于将数据填充到html页面上的Element主要提供了一些非常美观的组件 二、工具软件 VsCode 在前端领域&#xff0c;有一个公认好用…...

Multisim 用LM358 运放模拟线性稳压器 - 运放输出饱和 - 前馈电容

就是拿运放搭一个可调的LDO 稳压器&#xff0c;类似下面这个功能框图里的感觉。本来应该非常简单&#xff0c;没什么好说的&#xff0c;没想到遇到了两个问题。 原理 - 理想运放 我用PNP 三极管Q2 作为输出&#xff0c;运放输出电压升高时&#xff0c;流过PNP 三极管BE 的电流变…...

宁德大屏第二版总结

碰到难点 1.wss 心跳机制 实现前端和后端双向绑定 只要后端发送了消息 前端通过全局总线去触发你想要的函数。 全局总线 vue3可以全局总线下一个mitt 新建一个eventBus.js import mitt from "mitt"; const eventBus mitt();export default eventBus; 然后wss…...

冥想第一千二百四十七天(1247)

1.今天上午带桐桐去游泳了&#xff0c;买了卡吉诺&#xff0c;吃过最好吃的甜点。推荐。还有鸡排。 2.回来后带着媳妇&#xff0c;先加油。去给丈母娘看腿&#xff0c;等丈母娘等了好久&#xff0c;还帮她推车。 3.回来后&#xff0c;在丈母娘家跑步。很舒服。家长麦田的香味。…...

基于光学动捕定位下的Unity-VR手柄交互

Unity VR 场景手柄交互实现方案 需求 在已创建好的 Unity VR 场景中&#xff0c;接入游戏手柄&#xff0c;通过结合动捕系统与 VRPN&#xff0c;建立刚体&#xff0c;实时系统获取到手柄的定位数据与按键数据&#xff0c;通过编写代码实现手柄的交互逻辑&#xff0c;实现手柄…...

php json_decode 带反斜杠字符串json解析

PHP json_decode 带反斜杠字符串json解析 今天再次遇到了json字符串中包含反斜杠的问题&#xff0c;记录下解决方法 在JSON字符串中&#xff0c;反斜杠\用作转义字符。当JSON_UNESCAPED_SLASHES选项被用于json_encode()函数时&#xff0c;不会在slashes前面添加反斜杠。 但是…...

【NLP】文本张量表示方法【word2vec、词嵌入】

文章目录 1、文本张量表示2、one-hot词向量表示2.1、one-hot编码代码实现&#xff1a;2.2、onehot编码器的使用2.3、one-hot编码的优劣势 3、word2vec模型3.1、模型介绍3.2、CBOW模式3.3、skipgram模式3.4、word2vec的训练和使用3.4.1、获取训练数据3.4.2、训练词向量3.4.3、查…...

疯狂Java讲义_08_泛型

文章目录 泛型的传参若函数里的参数使用基类接受所有的派生类&#xff0c;怎么做&#xff1f; 类型通配符的上限类型通配符的下限 泛型的传参 注意 若类 Base 是类 Derived 的基类&#xff08;父类&#xff09;&#xff0c;那么数组类型 Base[] 是 Derived[] 的基类&#xff0…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...