【STM32】开发方式:寄存器、CMSIS、SPL、HAL、LL、RTOS

news2024/11/16 6:47:01

阅读本专栏其他文章,有助于理解本文。

文章目录

  • 一、开发库选择
    • 1.1 概述
    • 1.2 CMSIS库
    • 1.3 SPL库
    • 1.4 HAL 库
    • 1.5 LL库
    • 1.6 寄存器开发
  • 二、代码对比
    • 2.1 使用寄存器
    • 2.2 使用CMSIS库
    • 2.3 使用SPL库
    • 2.4 使用HAL库
    • 2.5 使用LL库
    • 2.6 使用RTOS
  • 三、软件配置

一、开发库选择

1.1 概述

STM32开发相关的库有很多,它们都是为了方便开发者使用STM32微控制器而提供的软件工具。根据不同的功能和层次,可以将它们分为以下几类:

  1. CMSIS库Cortex Microcontroller Software Interface Standard)是ARM公司推出的一种标准化的微控制器软件接口,它定义了一些通用的数据类型、寄存器访问、中断处理、内核功能等,方便开发者使用Cortex-M内核的各种功能。CMSIS库还包括了一些中间件组件,如RTOS、DSP、Driver、Pack、SVD、DAP和NN等,提供了丰富的软件功能。CMSIS库不是HAL库,也不是标准库,它是一种与厂商(比如ST公司)无关的软件层,可以在不同的微控制器上使用。

  2. HAL库Hardware Abstraction Layer硬件抽象层)是ST公司推出的一种硬件抽象层库,它提供了一套统一、简洁、易用的API函数接口,方便开发者使用STM32的各种外设功能。HAL库支持STM32全系列产品,具有可移植性、易用性和可靠性等优点。HAL库还提供了一些中间件组件,如RTOS,USB,TCP/IP和图形等,可以快速实现复杂的功能。

  3. 标准库Standard Peripheral Libraries)是ST公司为STM32微控制器提供的一种固件函数包,它封装了STM32所有外设的寄存器操作和中断处理,提供了一套统一、简洁、易用的API函数接口,方便开发者使用STM32的各种外设功能。标准库支持STM32全系列产品,具有可移植性、易用性和可靠性等优点。不过,ST官方已经不再更新STM32标准固件库,而是力推新的固件库:HAL库。

  4. LL库(Low-Layer,底层)是ST公司最近(也不是最近,六七年了)新增的一种底层库,它与HAL库捆绑发布,文档也是和HAL文档在一起的。 LL库更接近硬件层,对需要复杂上层协议栈的外设不适用,直接操作寄存器。LL库可以独立使用,也可以和HAL库结合使用。

  5. 其他第三方或开源库:除了ST公司提供的官方库外,还有许多第三方或开源的软件库可以用于STM32开发,如FreeRTOS、uCOS、FatFs、LwIP等。这些软件库通常提供了一些特定领域或功能的解决方案,如实时操作系统、文件系统、网络协议等。

很显然,CMSISI库是老大,HAL、SPL、LL都是基于CMSIS进一步进行设计和开发的,旨在降低开发难度。(当然了寄存器开发就不用CMSIS库了哈,反过来,CMSIS库要使用寄存器)

我们通常的、简单的开发形式有:HAL库开发、LL库开发、SPL库开发、第三方库开发。


插一嘴:

一般,如果你使用正点原子的开发板进行学习或开发,就会看到他们的相关资料。你会看到:《xxx开发指南HAL库版本Vx.x》、《xxx开发指南固件库版本Vx.x》、《xxx开发指南寄存器版本Vx.x》。
在这里插入图片描述

这里说明一下:正点原子一些资料里面的“固件库”、“标准库”、“库函数”,这些名词一般都指的是:STM32 的 Standard Peripheral Library (SPL):标准外设库(或SPL库中的函数)。

(具体的看资料内部描述即可)

实际上,固件库不单单指的是SPL库,固件库是指由芯片厂商提供的针对特定芯片或系列芯片的软件包,它包含了对芯片外设的驱动函数、示例代码、中间件和实用工具等。固件库的目的是为了简化开发者对底层硬件的访问和操作,提供一个统一的、易于使用的编程接口。所以:LL库、HAL库、SPL库都是固件库。所以,当您看到HAL固件库这样类似的名词时应当理解其就是HAL库。

总之,注意一下,正点原子的一些资料可能把SPL库叫做固件库或标准库。


1.2 CMSIS库

CMSIS (Cortex Microcontroller Software Interface Standard) 是 ARM 公司为其 Cortex-M 系列微控制器定义的一套软件接口标准。这套标准旨在简化微控制器的软件开发,使得开发者可以更容易地开发跨不同 Cortex-M 处理器系列和供应商的嵌入式应用程序。

提示: 阅读本专栏其他文章,学习相关知识点。

CMSIS库主要由以下几部分组成:

  • CMSIS-CORE:提供了Cortex-M处理器的核心功能接口,包括NVIC、SysTick等。它还定义了处理器的寄存器访问、中断向量和中断函数名称。

  • CMSIS-DSP:一个为Cortex-M处理器优化的数字信号处理库,提供了丰富的DSP函数,如FFT、滤波器、矩阵运算等。

  • CMSIS-RTOS:为实时操作系统提供了一个标准的API接口,使得开发者可以轻松地在不同的RTOS之间切换。

  • CMSIS-Driver:定义了一套标准的外设驱动接口,如UART、SPI、I2C等。

  • CMSIS-SVD:系统查看描述,提供了一个描述微控制器外设的XML格式。

  • CMSIS-Pack:定义了一个用于软件组件、设备和板卡的描述、交付和安装的标准。
    在这里插入图片描述

1

CMSIS库的优势

  • 跨平台:由于CMSIS是为Cortex-M系列微控制器定义的标准,因此开发者可以轻松地将代码从一个Cortex-M处理器迁移到另一个处理器,而无需进行大量的代码修改。

  • 高效性:CMSIS库中的许多函数都经过了优化,以充分利用Cortex-M处理器的特性,如SIMD指令。

  • 易于使用:CMSIS提供了清晰、一致的API,使得开发者可以快速上手并开始开发。

  • 强大的生态系统:许多第三方供应商和RTOS提供了对CMSIS的支持,这使得开发者可以轻松地集成各种软件组件和工具。


通常在进行STM32开发时,不会直接使用CMSIS库,而是使用基于CMSISI的HAL库或者SPL库,它们提供了更高级的抽象、更易用的API、更丰富的文档、更好的IDE支持等等。

使用CMSIS库可以获得更精细粒度的控制、更强大额性能,在以下场景中,可能会直接使用CMISIS库:

  1. DSP开发,CMSIS-DSP已经为Cortex-M系列微控制器进行了优化。对于需要高性能计算的应用,直接使用这些函数可能会更有效。
  2. 如果开发者希望他们的代码能够在不同的Cortex-M微控制器之间移植,那么直接使用CMSIS库会更有意义,因为它提供了一个标准化的接口。
  3. 使用RTOS。

1.3 SPL库

STM32的SPL(Standard Peripheral Libraries),即标准外设库,是STMicroelectronics为其STM32系列Cortex-M微控制器提供的软件开发库。它为STM32微控制器上的各种外设提供了C语言的函数API,帮助开发者简化硬件配置和使用。

STM32的SPL主要由以下几部分组成:

  • 外设驱动:为STM32微控制器上的各种外设(如GPIO、UART、SPI、I2C、ADC、TIM等)提供了驱动函数。

  • CMSIS支持:SPL包括对CMSIS库的支持,特别是CMSIS-CORE部分,为开发者提供了对Cortex-M核心功能的访问。

  • 系统配置:包括系统时钟、中断和其他基础配置的函数。

  • 工具链文件:如启动文件、链接脚本等,这些文件为特定的工具链(如GCC、Keil、IAR等)提供了支持。

  • 示例代码:STMicroelectronics通常会提供一些示例代码,展示如何使用SPL来开发应用程序。

STM32 SPL 应用程序的文件描述:

文件名描述
STM32 SPL
stm32yyxx_conf.h外设驱动程序的配置文件。用户可以通过使用模板启用或禁用外设头文件包含。此文件还可用于在编译固件库驱动程序之前启用或禁用库运行时失败,通过预处理器定义USE_FULL_ASSERT
stm32yyxx_ppp.hPPP外设的头文件
stm32yyxx_ppp.c用C语言编写的PPP外设的驱动源代码文件
stm32yyxx_it.h包含所有中断处理程序原型的头文件
stm32yyxx_it.c包含Cortex-Mx异常的中断服务例程(ISR)的模板源文件。用户可以为使用的外设添加额外的ISRs(有关可用的外设中断处理程序的名称,请参考startup_stm32yyxx.s)
CMSIS
stm32yyxx.hCMSIS Cortex-Mx STM32yyxx 设备外设访问层头文件。这是应用程序员在源代码中使用的唯一包含文件
system_stm32yyxx.hCMSIS Cortex-Mx STM32yyxx 设备外设访问层系统头文件
system_stm32yyxx.cCMSIS Cortex-Mx STM32yyxx 设备外设访问层系统源文件

在这里插入图片描述

2

SPL的优势:

  • 简化开发:STM32的SPL为微控制器的外设提供了高级的抽象,使得开发者不需要深入了解硬件细节就可以配置和使用外设。

  • 跨设备兼容性:由于SPL为STM32系列的微控制器提供了统一的API,因此开发者可以更容易地在同一系列的不同微控制器之间移植代码。

  • 供应商支持:使用SPL意味着可以获得STMicroelectronics的支持,包括文档、示例代码和可能的固件更新。

SPL的局限性:

  • 性能:由于SPL提供了高级的抽象,某些操作可能不如直接访问硬件寄存器那么快。

  • 灵活性:虽然SPL为大多数常见的用例提供了支持,但对于一些特定的、非标准的需求,直接使用CMSIS或其他方法可能会更合适。

  • 更新和维护STMicroelectronics已经开始推广其HAL(硬件抽象层)库,并逐渐减少对SPL的支持。因此,新的STM32产品可能不再支持SPL,或者SPL可能不再获得更新。

1.4 HAL 库

HAL(Hardware Abstraction Layer),即硬件抽象层,是STMicroelectronics为其STM32系列微控制器提供的一个新的软件开发框架。与SPL(标准外设库)相比,HAL提供了更高级的抽象和更多的功能,旨在简化和加速STM32微控制器的开发过程。

STM32的HAL库主要由以下几部分组成:

  • 外设驱动:为STM32微控制器上的各种外设(如GPIO、UART、SPI、I2C、ADC、TIM等)提供了驱动函数。

  • 中间件支持:HAL库包括对各种中间件的支持,如USB、TCP/IP、文件系统等。

  • 系统配置:提供了系统时钟、电源模式、中断和其他基础配置的函数。

  • 回调机制:HAL库使用了回调函数的机制,允许开发者在特定的事件(如数据接收完成)发生时执行自定义的代码。

  • 错误处理:HAL库提供了错误处理和检查机制,帮助开发者识别和处理可能的错误。

HAL库的优势:

  • 模块化和可重用性:HAL库的设计使得开发者可以轻松地重用代码,特别是在不同的STM32微控制器之间。

  • 跨设备兼容性:由于HAL为STM32系列的微控制器提供了统一的API,因此开发者可以更容易地在同一系列的不同微控制器之间移植代码。

  • 集成开发环境(IDE)支持:STMicroelectronics提供了STM32CubeMX工具,该工具可以自动生成HAL库的初始化代码,进一步简化了开发过程。

  • 持续更新和维护:与SPL相比,HAL库获得了更多的更新和维护,以支持新的STM32产品和功能。

HAL库的局限性:

  • 学习曲线:对于习惯于使用SPL或直接访问硬件寄存器的开发者来说,HAL库可能需要一些时间来熟悉。

  • 性能考虑:虽然HAL库为开发者提供了很多便利,但它的高级抽象可能会导致某些操作的性能略有下降。

1.5 LL库

STM32的LL库((Low Layer))是STM32Cube库的一部分,旨在为STM32外设提供一个简化的API集,同时保持最大的灵活性。LL库是一个更接近硬件的编程接口,与HAL(硬件抽象层)库相比,它提供了更低的抽象级别。

主要特点:

  1. 性能:由于LL库提供了更接近硬件的API,因此它通常比HAL库更快,尤其是在中断处理程序中。

  2. 简单性:LL库的API设计得更简单,更直接,使得代码更容易阅读和维护。

  3. 灵活性:LL库提供了对STM32外设的完全控制,允许开发人员更好地优化其应用程序。

  4. 与HAL的互操作性:LL库可以与HAL库一起使用,这意味着开发人员可以在同一个项目中混合使用两者,根据需要选择最佳的库。

LL库的组成:

  • 外设初始化:LL库提供了初始化外设的功能,这些功能通常比HAL库提供的功能更简单,更直接。

  • 外设控制:LL库提供了一组函数,允许开发人员直接控制STM32外设,而无需经过任何中间抽象。

  • 中断处理:与HAL库相比,LL库提供了更简单、更直接的中断处理函数。

使用LL库的优点:

  1. 代码大小:由于LL库提供了更少的抽象,因此生成的代码通常比使用HAL库的代码更小。

  2. 执行速度:LL库的函数通常比HAL库的函数执行得更快,因为它们提供了更少的抽象。

  3. 更好的控制:LL库允许开发人员更直接地控制STM32外设,这可以提供更好的性能和更低的功耗。

STM32Cube库的组成如下:(STMicroelectronics为其STM32微控制器系列提供的一个全面的软件开发工具集)

  1. HAL (Hardware Abstraction Layer):这是STM32Cube的核心部分,提供了一套完整的外设驱动程序,用于STM32系列的微控制器。这些驱动程序提供了一个高级的API,使开发人员能够轻松地访问STM32的各种功能。

  2. LL (Low Layer):这是一个更接近硬件的驱动程序集,为那些需要更高性能或更低级访问的应用程序提供了一个选择。

  3. Middleware:STM32Cube还包含了一些中间件组件,如USB库、TCP/IP堆栈、文件系统、RTOS接口等。

  4. CMSIS (Cortex Microcontroller Software Interface Standard):这是ARM定义的一个标准,用于开发Cortex-M微控制器的应用程序。STM32Cube包含了CMSIS核心和设备头文件。

  5. Utilities:这些是一些实用程序和工具,如数据结构、数学函数、图形界面库等。

  6. Examples and Templates:STM32Cube为STM32的各种开发板提供了大量的示例代码和模板,帮助开发人员快速入门。

  7. Configuration Tool:STM32CubeMX是一个图形工具,允许用户图形化地配置STM32微控制器的外设,并自动生成初始化代码。

1.6 寄存器开发

STM32寄存器开发是一种直接操作STM32微控制器内部的寄存器来控制外设的开发方式,它可以充分利用STM32的性能和灵活性,但也需要对寄存器的功能和地址有深入的了解。

STM32寄存器开发的优点是:

  • 可以实现最高效的代码执行,无需调用库函数或中间件。
  • 可以实现最灵活的外设配置,无需受限于库函数或中间件的参数。
  • 可以实现最低层次的硬件控制,无需考虑库函数或中间件的兼容性。

STM32寄存器开发的缺点是:

  • 需要对寄存器的功能和地址有深入的了解,否则容易出错或造成冲突。
  • 需要编写大量的代码,否则难以实现复杂的功能或逻辑。
  • 需要手动管理内存和堆栈,否则容易出现溢出或泄漏。

有时候,直接使用寄存器进行开发也称作“裸机开发”。但裸机开发有时候也指不使用操作系统的开发。

二、代码对比

一个简单功能的实现:点亮一个 LED。以下是使用不同 STM32 开发库实现此功能的代码示例(主要部分):

2.1 使用寄存器

直接操作STM32的硬件寄存器来配置和控制GPIO。

#define GPIOB_BASE 0x40020400
#define GPIOB_MODER ( *(volatile uint32_t*)(GPIOB_BASE) )
#define GPIOB_ODR   ( *(volatile uint32_t*)(GPIOB_BASE + 0x14) )

int main(void) {
    // 设置PB0为输出模式
    GPIOB_MODER |= (1 << 0);
    
    while(1) {
        GPIOB_ODR |= (1 << 0);  // 点亮LED
    }
}

2.2 使用CMSIS库

使用CMSIS定义的结构和宏来操作寄存器。

#include "stm32f4xx.h"

int main(void) {
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;  // 使能GPIOB时钟
    GPIOB->MODER |= GPIO_MODER_MODER0_0;  // 设置PB0为输出模式
    
    while(1) {
        GPIOB->ODR |= GPIO_ODR_OD0;  // 点亮LED
    }
}

2.3 使用SPL库

使用STM32标准外设库函数。

#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"

int main(void) {
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    while(1) {
        GPIO_SetBits(GPIOB, GPIO_Pin_0);  // 点亮LED
    }
}

2.4 使用HAL库

使用STM32硬件抽象层函数。

#include "stm32f4xx_hal.h"

GPIO_InitTypeDef GPIO_InitStructure;

int main(void) {
    __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitStructure.Pin = GPIO_PIN_0;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Pull = GPIO_NOPULL;
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);

    while(1) {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);  // 点亮LED
    }
}

2.5 使用LL库

使用STM32低层库函数。

#include "stm32f4xx_ll_gpio.h"
#include "stm32f4xx_ll_bus.h"

int main(void) {
    LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);

    LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_0, LL_GPIO_MODE_OUTPUT);

    while(1) {
        LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_0);  // 点亮LED
    }
}

2.6 使用RTOS

使用实时操作系统(如FreeRTOS)来控制LED。

#include "FreeRTOS.h"
#include "task.h"
#include "stm32f4xx_hal.h"

void LedTask(void *pvParameters) {
    GPIO_InitTypeDef GPIO_InitStructure;

    __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitStructure.Pin = GPIO_PIN_0;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Pull = GPIO_NOPULL;
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);

    while(1) {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);  // 点亮LED
        vTaskDelay(1000);  // 延时1秒
    }
}

int main(void) {
    xTaskCreate(LedTask, "LED", 128, NULL, 1, NULL);
    vTaskStartScheduler();
}

三、软件配置


  1. Keil官方:https://www.keil.com/pack/doc/CMSIS_Dev/General/html/index.html ↩︎

  2. ST官方:https://www.st.com/resource/en/application_note/an5044-stm32-standard-peripheral-library-to-stm32cube-lowlayer-migration-stmicroelectronics.pdf ↩︎

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

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

相关文章

【linux】使用rpm下载mysql

1/ 2/ 3/ 4/ 5/ 6/ 7/ 8/ 9/ 10/ 11/ 12/ 13/

JDBC回顾

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 JDBC回顾 前言一、JDBC1.JDBC是什么&#xff1f;2.如何使用&#xff1f;&#xff08;1&#xff09;注册驱动&#xff08;2&#xff09;获取连接&#xff08;3&#xff09;操作…

二叉树题目:二叉树的层序遍历

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉树的层序遍历 出处&#xff1a;102. 二叉树的层序遍历 难度 4 级 题目描述 要求 给你二叉树的根结点 root \texttt{root} root&#xff0c;返…

c++ day1

作业: 1&#xff0e;整理思维导图 2.定义一个命名空间Myspace&#xff0c;包含以下函数:将一个字符串中的所有单词进行反转&#xff0c;并输出反转后的结果。例如&#xff0c;输入字符串 为"Hello World"&#xff0c;输出结果为"olleH dlroW"&#xff0c;并…

python:pyqt5 + cef 模仿 mdict 界面

PyQt5 安装参见&#xff1a;python&#xff1a;PyQt5 简单示例 cefpython 入门 参考: Python GUI: cefpython3的简单分析和应用 pip install cefpython3 cefpython3-66.1-py2.py3-none-win_amd64.whl (69.0 MB) Successfully installed cefpython3-66.1 cd \Python37\Lib\si…

prometheus blackbox_exporter安装

目录 一、准备工作1.1 安装或关闭以下服务1.2 本次安装环境 二、安装blackbox_exporter2.1 下载并解压2.2配置2.3测试 三、配置blackbox_exporter3.1配置blackbox.yml3.2 开启blackbox_exporter3.3配置prometheus.yml 四、其他4.1server returned HTTP status 400 Bad Request …

Docker 存储驱动解析:选择最适合你的存储方案

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

分类预测 | MATLAB实现NGO-DBN北方苍鹰优化深度置信网络多特征输入分类预测

分类预测 | MATLAB实现NGO-DBN北方苍鹰优化深度置信网络多特征输入分类预测 目录 分类预测 | MATLAB实现NGO-DBN北方苍鹰优化深度置信网络多特征输入分类预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现NGO-DBN北方苍鹰优化深度置信网络多特征输入…

【QT】重写QAbstractLIstModel,使用ListView来显示多列数据

qt提供了几个视图来进行信息的列表显示&#xff0c;QListView可以用来显示继承QStractListModel的字符串列表中的字符串&#xff0c;默认的模型里面只包含一列的内容&#xff1a; 这里以qml为例子&#xff0c;先新建一个qml的项目&#xff0c;示例代码如下&#xff1a; 先创建一…

查看所有数据库各表容量大小

查看所有数据库各表容量大小 1. 查看所有数据库各表容量大小2.查看指定数据库容量大小3. 查看所有数据库容量大小 1. 查看所有数据库各表容量大小 select table_schema as 数据库, table_name as 表名, table_rows as 记录数, truncate(data_length/1024/1024, 2) as 数据容量…

Redis 持久化的手段有哪些 ?RDB 和 AOF 有什么区别 ?

目录 1. Redis 持久化的手段有哪些 2. RDB 和 AOF 有什么区别 2.1 RDB 持久化 2.2 AOF 持久化 2.2.1 AOF 持久化策略有哪些 3. 混合持久化是如何执行的&#xff08;了解&#xff09; 1. Redis 持久化的手段有哪些 Redis 持久化的手段有三种&#xff1a; 快照方式&#…

模型预测笔记(二):结合SMOTE来进行数据不均衡处理实操

文章目录 数据不均衡危害如何解决SMOTE原理代码效果 数据不均衡危害 在模型预测中&#xff0c;数据不均衡是指不同类别的样本数量差异很大。这种情况可能会对模型的性能和结果产生一些危害&#xff1a; 偏斜的预测结果&#xff1a;由于某些类别的样本数量较少&#xff0c;模型…

Rides分布式缓存

分布式缓存 -- 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; 1.Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化 AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#x…

从Web 2.0到Web 3.0,互联网有哪些变革?

文章目录 Web 2.0时代&#xff1a;用户参与和社交互动Web 3.0时代&#xff1a;语义化和智能化影响和展望 &#x1f389;欢迎来到Java学习路线专栏~从Web 2.0到Web 3.0&#xff0c;互联网有哪些变革&#xff1f; ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#x…

Docker容器与虚拟化技术:容器运行时说明与比较

目录 一、理论 1.容器运行时 2.容器运行时接口 3.容器运行时层级 4.容器运行时比较 5.强隔离容器 二、问题 1.K8S为何难以实现真正的多租户 三、总结 一、理论 1.容器运行时 &#xff08;1&#xff09;概念 Container Runtime 是运行于 k8s 集群每个节点中&#xff…

基于51单片机的八路抢答器Protues仿真设计

目录 一、设计背景 二、实现功能 三、仿真演示 四、源程序&#xff08;部分&#xff09; 一、设计背景 近年来随着科技的飞速发展&#xff0c;单片机的应用正在不断的走向深入。本文阐述了基于51单片机的八路抢答器设计。本设计中&#xff0c;51单片机充当了核心控制器的角…

HTML浪漫动态表白代码绚烂星空烟花+粉色大爱心+3D旋转相册+音乐(附源码)(三)

一. 前言 七夕马上就要到了&#xff0c;为了帮助大家高效表白&#xff0c;下面再给大家加几款实用的HTML浪漫表白代码(附源码)背景音乐&#xff0c;可用于520&#xff0c;情人节&#xff0c;生日&#xff0c;求爱表白等场景&#xff0c;可直接使用。 来吧&#xff0c;展示&am…

统一git使用方法,git状态变迁图,git commit提交规范

目录 说明 统一git使用方法 git状态变迁图 git commit 提交规范 说明 多次工作中多名员工不懂git多次技术分享&#xff0c;自行查资料学习git并使用&#xff0c;会出现使用各种偏僻的命令&#xff0c;异常问题无法解决&#xff1b;或出现带url的git合并提交。主要是学的不…

【腾讯云 TDSQL-C Serverless 产品测评】全面测评TDSQL-C Mysql Serverless

全面测评TDSQL-C Mysql Serverless 文章目录 全面测评TDSQL-C Mysql Serverless前言什么是TDSQL-C Mysql Serverless初始化 TDSQL-C Mysql Serverless新建数据库建立数据表开启外网访问 兼容性SQL文件 导入导出navicat 直接在线传输 构建测试环境准备Python测试脚本准备 Jmeter…

算法通关村第5关【白银】| 哈希和栈经典算法题

1.两个栈实现队列 思路&#xff1a;两个栈&#xff0c;一个输入栈&#xff0c;一个输出栈。 当需要输入的时候就往inStack中插入&#xff0c;需要输出就往outStack中输出&#xff0c;当输出栈是空就倒出输入栈的数据到输出栈中&#xff0c;这样就保证了后插入的数据从栈顶倒入…