【ARM】CMSIS 软件标准接口

news2024/11/17 11:23:03

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内核

    // 创建线程1
    osThreadNew(Thread1, NULL, &(const osThreadAttr_t) {
        .name = "Thread1",
        .stack_size = THREAD_STACK_SIZE,
        .priority = osPriorityNormal
    });

    // 创建线程2
    osThreadNew(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.coloradmin.cn/o/1991787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java之equals的使用区别

public class SystermDemo3 {public static void main(String[] args) {String s"abc";StringBuilder sbnew StringBuilder("abc");System.out.println(s.equals(sb));//false//equals方法是被s调用的,而s是字符串//所以equals要看String类中//字符串中的e…

大模型笔记5 Extractive QA任务评估

目录 Extractive QA任务评估 Extractive QA评测指标 precision, recall, f1 ROUGE 划分训练与评估数据集 token位置评估 单个token位置评估 输入label的token位置 预测token位置 评估 Wandb 共享机器同时登录 样本类别平衡 标记token label时对窗口进行筛选 训练…

亚马逊日本站认证 硅藻土商品

商品说明和商品照片 硅藻土商品&#xff0c;是指以硅藻土为主要原料而制作的商品。其中&#xff0c;针对浴室脚垫和杯垫等呈板状的商品&#xff0c;因需确认其石棉含有率符合相关安全基准规定&#xff0c;请您提交相关证明资料。 防止石棉损害健康条例以及相关法令 可证明该产…

[算法题]课程表/课程表 II

题目链接: 课程表 课程表 II 通过拓扑排序求解, 首先认识有向无环图: 入度表示有多少点指向自己, 出度表示自己指向多少点, 拓扑排序的思想则为选出入度为 0 的点排, 然后将被选出的点指向的点的入度减 1, 当入度被减到 0 时表示该点可以被选出, 一直循环直到全部点被选出或…

书生大模型实战营-基础关卡-2-8G 显存玩转书生大模型 Demo

Cli Demo 部署 InternLM2-Chat-1.8B 模型 先简单试试 InternLM2-Chat-1.8B 模型的能力 生成 300 字的小故事 我的prompt&#xff1a;写一个300字以内的小故事,故事符合中国特色. 模型输出&#xff1a;故事整体性还是很好的。 在一个小镇上&#xff0c;住着一只名叫小明的猫咪…

基于Dijkstra的校园导游系统

目录 一. 设计目的 二. 设计背景 三. 系统功能 四. 系统算法实现 五. 系统调试与结果分析 六. 完整源代码 一. 设计目的 通过设计并实现校园导游系统&#xff0c;使学生对数据结构有更深入的了解。该系统综合性非常广&#xff0c;能够极大提高学生的设计&#xff0c;编程及…

数据库中的约束,聚合函数以及联合查询

目录 数据库中的约束 not null unique default primary key foreign key 表的设计 聚合函数&#xff08;查询&#xff09; 分组 联表查询&#xff08;多表查询&#xff09; 内连接 外连接 左外连接 右外连接 自连接 子查询 合并查询 数据库中的约束 为了保证…

用python获取系统的硬件信息(python实例二十九)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.获取系统信息 3.1 代码构思 3.2 代码示例 3.3 运行部分结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的…

计算机组成原理面试-核心概念-问题理解

目录 1.怎么理解计算机组成原理中存储器、控制器、运算器、输入输出设备之间的协作关系和工作流程 2.比、比特等类似几种表示信息存储的单位具体换算 3.介绍计算机的五大功能-数据传送功能、数据存储功能、数据处理功能、操作控制功能、操作判断功能 4.计算机的工作过程/指令…

【Linux基础】Linux基本指令(一)

目录 前言1&#xff0c; ls指令2&#xff0c;pwd指令三&#xff0c;cd指令3.1 当前目录与上级目录3.2 绝对路径和相对路径3.3 tree指令 四&#xff0c;创建一个普通文件或目录4.1 touch指令4.2 mkdir指令 五&#xff0c;删除目录或文件5.1 rmdir指令5.2 rm 指令 六&#xff0c;…

华大基因阿尔茨海默病风险基因检测,助力阿尔茨海默病早预防

中国正面临日益加剧的老龄化挑战。据统计&#xff0c;2020年我国60岁以上的老年人口已达2.6亿&#xff0c;其中轻度认知障碍患者超过3800万&#xff0c;而阿尔茨海默病患者近千万。随着这一趋势的延续&#xff0c;如何早期发现和预防阿尔茨海默病已成为公共卫生领域的重要议题。…

为什么建议从二维向三维GIS开发方向拓展?

GIS开发是地理信息系统领域中一个薪资待遇较高的职业方向&#xff0c;吸引了众多来自测绘、遥感和城市规划等相关专业的学生转型投身于WebGIS开发工作。 那么&#xff0c;今天从技术角度出发&#xff0c;探讨为何鼓励大家超越WebGIS的范畴&#xff0c;继续深入学习三维GIS开发…

el-date-picker 限制开始时间和结束时间

el-date-picker 限制开始时间和结束时间 需求&#xff1a;el-date-picker 月份限制开始时间和结束时间 开始时间&#xff1a;202307 结束时间&#xff1a;202407 代码实现 vue 页面 <el-form-item label"月份" prop"monthList"><el-date-picker …

零基础5分钟上手亚马逊云科技AWS核心云开发/云架构 - 创建高可用数据库集群

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;让大家零基础5分钟通过这篇文章就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我将每天介绍一个基于亚马逊云科…

测试概论之系统测试

系统测试 文章目录 系统测试一、系统测试定义二、系统测试的对象三、系统测试类型1、功能测试2、性能测试3、压力测试4、容量测试5、GUI 测试6、可以性测试7、安装性测试8、配置测试9、异常测试10、备份测试11、健壮性测试12、文档测试13、在线帮助测试14、网络测试 四、系统测…

为什么奥运会采用通义而不是 OpenAI,现在中国的 AI 技术是世界领先了吗?

奥运会作为全球最盛大的体育赛事之一&#xff0c;一直在不断地引入和利用最新的科技来提升赛事的组织效率、观众体验以及运动员的表现。在2024年巴黎奥运会上&#xff0c;人工智能&#xff08;AI&#xff09;技术的应用尤为引人注目。 首先&#xff0c;关于奥运会采用的技术选…

数字噪音计(声级计)【AR814数字噪音计】

系统介绍 声级计&#xff0c;又叫噪音计&#xff0c;是噪声测量中最基本的仪器。声级计一般由电容式传声器、前置放大器、衰减器、放大器、频率计权网络以及有效值指示表头等组成。 声级计的工作原理是&#xff1a;由传声器将声音转换成电信号&#xff0c;再由前置放大器放大…

【json解析】控制台打印json字符串格式正确,但json.loads()解析失败问题解决

问题为控制台打印json字符串格式正确&#xff0c;但json.loads()解析失败。看似简单的问题&#xff0c;却又折腾了好一会&#xff0c;因此记录一下解决方法&#xff01; 出现这个问题的原因&#xff1a;眼见不一定为实&#xff0c;控制台打印的json字符串并不一定是实际的json字…

Typora v1.9.5解锁版下载、安装教程 (轻便简洁的Markdown编辑器)

前言 Typora是一款轻便简洁的Markdown编辑器&#xff0c;支持即时渲染技术&#xff0c;这也是与其他Markdown编辑器最显著的区别。即时渲染使得你写Markdown就想是写Word文档一样流畅自如&#xff0c;不像其他编辑器的有编辑栏和显示栏。 一、下载地址 下载链接&#xff1a;…

软件测试---Fiddler抓包

一、初识Fiddler ①BS架构简介和请求过程理解 ②Fiddler原理 Fiddler是一个代理服务器。代理地址:127.0.0.1&#xff0c;端口:8888。浏览器可以通过设置查看代理服务器&#xff1a;设置->高级->打开您计算机的代理设置->连接->局域网设置->代理服务器->在高级…