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

四、STM32 HAL库API完全指南:从功能分类到实战示例

STM32 HAL库API完全指南:从功能分类到实战示例

一、HAL库API的总体架构

STM32 HAL库(Hardware Abstraction Layer)作为STMicroelectronics推出的统一驱动框架,提供了覆盖所有STM32外设的标准化API。HAL库的API设计遵循严格的分层架构和命名规范,旨在简化开发流程并提高代码可移植性。

HAL库API主要分为以下几大类:

  • 外设初始化与配置
  • 数据传输与通信
  • 中断与DMA管理
  • 状态监控与错误处理
  • 定时器与PWM控制
  • ADC/DAC与模拟功能
  • 低功耗与电源管理
  • 系统服务与辅助功能
二、外设初始化与配置类API

这类API负责外设的初始化、反初始化以及底层硬件配置:

/* 通用初始化函数 */
HAL_StatusTypeDef HAL_<外设>_Init(<外设>_HandleTypeDef *h<外设>);
HAL_StatusTypeDef HAL_<外设>_DeInit(<外设>_HandleTypeDef *h<外设>);/* MSP底层配置函数(用户需实现) */
void HAL_<外设>_MspInit(<外设>_HandleTypeDef* h<外设>);
void HAL_<外设>_MspDeInit(<外设>_HandleTypeDef* h<外设>);/* 参数配置函数 */
HAL_StatusTypeDef HAL_<外设>_Config(<外设>_HandleTypeDef *h<外设>, <配置结构体>* config);
HAL_StatusTypeDef HAL_<外设>_GetConfig(<外设>_HandleTypeDef *h<外设>, <配置结构体>* config);

典型示例

// UART初始化
HAL_UART_Init(&huart2);// SPI配置
SPI_InitTypeDef spiConfig = {0};
spiConfig.Mode = SPI_MODE_MASTER;
spiConfig.Direction = SPI_DIRECTION_2LINES;
// ...其他配置
HAL_SPI_Config(&hspi1, &spiConfig);
三、数据传输与通信类API

这类API支持各种通信协议的数据收发,包括轮询、中断和DMA三种模式:

/* 轮询模式 */
HAL_StatusTypeDef HAL_<外设>_Transmit(<外设>_HandleTypeDef *h<外设>, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_<外设>_Receive(<外设>_HandleTypeDef *h<外设>, uint8_t *pData, uint16_t Size, uint32_t Timeout);/* 中断模式 */
HAL_StatusTypeDef HAL_<外设>_Transmit_IT(<外设>_HandleTypeDef *h<外设>, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_<外设>_Receive_IT(<外设>_HandleTypeDef *h<外设>, uint8_t *pData, uint16_t Size);/* DMA模式 */
HAL_StatusTypeDef HAL_<外设>_Transmit_DMA(<外设>_HandleTypeDef *h<外设>, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_<外设>_Receive_DMA(<外设>_HandleTypeDef *h<外设>, uint8_t *pData, uint16_t Size);/* 双向通信(如SPI全双工) */
HAL_StatusTypeDef HAL_<外设>_TransmitReceive(<外设>_HandleTypeDef *h<外设>, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_<外设>_TransmitReceive_IT(<外设>_HandleTypeDef *h<外设>, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size);
HAL_StatusTypeDef HAL_<外设>_TransmitReceive_DMA(<外设>_HandleTypeDef *h<外设>, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size);

典型示例

// UART轮询发送
HAL_UART_Transmit(&huart2, "Hello World!", 12, 1000);// SPI中断接收
HAL_SPI_Receive_IT(&hspi1, rxBuffer, 32);// I2C DMA发送
HAL_I2C_Master_Transmit_DMA(&hi2c1, 0x50, txBuffer, 16);
四、中断与DMA管理类API

这类API用于配置和处理外设中断及DMA操作:

/* 中断处理函数 */
void HAL_<外设>_IRQHandler(<外设>_HandleTypeDef *h<外设>);/* 中断回调函数(用户需重写) */
__weak void HAL_<外设>_TxCpltCallback(<外设>_HandleTypeDef *h<外设>);
__weak void HAL_<外设>_RxCpltCallback(<外设>_HandleTypeDef *h<外设>);
__weak void HAL_<外设>_TxRxCpltCallback(<外设>_HandleTypeDef *h<外设>);
__weak void HAL_<外设>_ErrorCallback(<外设>_HandleTypeDef *h<外设>);/* DMA相关函数 */
HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma);
HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma);
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma);

典型示例

// UART中断处理函数(在stm32xxxx_it.c中)
void USART2_IRQHandler(void)
{HAL_UART_IRQHandler(&huart2);
}// 重写UART接收完成回调
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if (huart->Instance == USART2) {// 处理接收到的数据process_uart_data(rxBuffer, rxSize);}
}
五、状态监控与错误处理类API

这类API用于检查外设状态、获取错误码及清除标志位:

/* 获取外设状态 */
HAL_StatusTypeDef HAL_<外设>_GetState(<外设>_HandleTypeDef *h<外设>);/* 获取错误码 */
uint32_t HAL_<外设>_GetError(<外设>_HandleTypeDef *h<外设>);/* 标志位操作 */
FlagStatus HAL_<外设>_GetFlagStatus(<外设>_HandleTypeDef *h<外设>, uint32_t Flag);
void HAL_<外设>_ClearFlag(<外设>_HandleTypeDef *h<外设>, uint32_t Flag);

典型示例

// 检查UART是否就绪
if (HAL_UART_GetState(&huart2) == HAL_UART_STATE_READY) {// 可以进行数据传输
}// 获取SPI错误码
uint32_t error = HAL_SPI_GetError(&hspi1);
if (error != HAL_ERROR_NONE) {// 处理错误
}
六、定时器与PWM控制类API

这类API用于定时器配置、PWM输出及定时功能:

/* 定时器基础功能 */
HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim);/* PWM输出功能 */
HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel);/* 输入捕获功能 */
HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);

典型示例

// 启动定时器中断(用于周期性任务)
HAL_TIM_Base_Start_IT(&htim3);// 启动PWM输出(用于电机控制)
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);// 修改PWM占空比
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500; // 修改占空比值
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
七、ADC/DAC与模拟功能类API

这类API用于模拟数字转换和数字模拟转换:

/* ADC功能 */
HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc);
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc);
HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef *hadc);
HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef *hadc);
HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef *hadc);
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc);/* DAC功能 */
HAL_StatusTypeDef HAL_DAC_Init(DAC_HandleTypeDef *hdac);
HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel);
HAL_StatusTypeDef HAL_DAC_Start_IT(DAC_HandleTypeDef *hdac, uint32_t Channel);
HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef *hdac, uint32_t Channel);
HAL_StatusTypeDef HAL_DAC_Stop_IT(DAC_HandleTypeDef *hdac, uint32_t Channel);
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);
uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef *hdac, uint32_t Channel);

典型示例

// 启动ADC并读取值
HAL_ADC_Start(&hadc1);
uint32_t adcValue = HAL_ADC_GetValue(&hadc1);// 启动DAC输出
HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048); // 输出1.65V (3.3V的一半)
八、低功耗与电源管理类API

这类API用于配置STM32的各种低功耗模式:

/* 睡眠模式 */
void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t STOPEntry);/* 停止模式 */
void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry);
void HAL_PWR_ExitSTOPMode(void);/* 待机模式 */
void HAL_PWR_EnterSTANDBYMode(void);/* 低功耗配置 */
void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx);
void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx);
void HAL_PWR_EnableBkUpAccess(void);
void HAL_PWR_DisableBkUpAccess(void);

典型示例

// 配置唤醒引脚并进入停止模式
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);// 进入待机模式(仅外部复位或WKUP引脚可唤醒)
HAL_PWR_EnterSTANDBYMode();
九、系统服务与辅助功能类API

这类API提供系统级功能和辅助工具:

/* 系统时钟配置 */
HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct);
HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency);/* 中断控制 */
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority);
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);
void HAL_NVIC_DisableIRQ(IRQn_Type IRQn);/* GPIO操作 */
void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
void HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin);
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin, GPIO_PinState PinState);
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin);
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin);/* 延时功能 */
__weak void HAL_Delay(uint32_t Delay);/* 看门狗功能 */
HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg);
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg);
HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg);
HAL_StatusTypeDef HAL_WWDG_SetCounter(WWDG_HandleTypeDef *hwwdg, uint32_t Counter);

典型示例

// 配置系统时钟
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
// ...其他配置
HAL_RCC_OscConfig(&RCC_OscInitStruct);// GPIO操作
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 点亮LED
HAL_Delay(500); // 延时500ms
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 熄灭LED// 喂狗操作(独立看门狗)
HAL_IWDG_Refresh(&hiwdg);
十、HAL库API使用最佳实践
  1. 遵循初始化流程

    • 使用STM32CubeMX生成基础初始化代码
    • 按照"系统时钟→外设→应用"的顺序初始化
  2. 合理选择通信模式

    • 简单场景使用轮询模式
    • 实时性要求高的场景使用中断模式
    • 大数据量传输使用DMA模式
  3. 正确处理中断

    • 在中断处理函数中调用HAL_<外设>_IRQHandler()
    • 重写相应的回调函数处理事件
    • 保持中断处理代码简洁
  4. 错误处理

    • 检查API返回值,处理可能的错误
    • 使用HAL_<外设>_GetError()获取详细错误信息
  5. 低功耗设计

    • 根据应用需求选择合适的低功耗模式
    • 注意唤醒源配置和唤醒后的系统恢复

掌握这些API分类和使用技巧,开发者可以高效地利用HAL库完成各种STM32项目开发,从简单的GPIO控制到复杂的多外设协同工作。HAL库的标准化设计使得代码更具可读性、可维护性和可移植性,是STM32开发的首选方案。

相关文章:

四、STM32 HAL库API完全指南:从功能分类到实战示例

STM32 HAL库API完全指南&#xff1a;从功能分类到实战示例 一、HAL库API的总体架构 STM32 HAL库&#xff08;Hardware Abstraction Layer&#xff09;作为STMicroelectronics推出的统一驱动框架&#xff0c;提供了覆盖所有STM32外设的标准化API。HAL库的API设计遵循严格的分层…...

MySQL全量、增量备份与恢复

目录 数据备份 一、数据备份类型 二、常见备份方法 扩展&#xff1a;GTID与XtraBackup ‌一、GTID&#xff08;全局事务标识符&#xff09;‌ ‌1. 定义与核心作用‌ ‌2. GTID在备份恢复中的意义‌ ‌3. GTID配置与启用‌ ‌二、XtraBackup的意义与核心价值‌ ‌1. 定…...

fastboot 如何只刷system.img 分区

在 fastboot 模式下只刷入 system.img 分区&#xff0c;可以按照以下步骤操作&#xff1a; 1. 确保设备已进入 Fastboot 模式 连接设备到电脑&#xff0c;并确保已进入 Fastboot/Bootloader 模式&#xff1a;adb reboot bootloader或手动进入&#xff08;通常为 电源键 音量…...

连接词化归律详解

1. 连接词化归律的基本概念 连接词化归律(也称为归结原理)是数理逻辑中用于简化逻辑表达式的重要方法&#xff0c;它允许我们将复杂的逻辑表达式转化为更简单的等价形式&#xff0c;特别是转化为合取范式(CNF)或析取范式(DNF)。 核心思想 连接词化归律基于一系列逻辑等价关系…...

《构建社交应用用户激励引擎:React Native与Flutter实战解析》

React Native凭借其与JavaScript和React的紧密联系&#xff0c;为开发者提供了一个熟悉且灵活的开发环境。在构建用户等级体系时&#xff0c;它能够充分利用现有的前端开发知识和工具。通过将用户在社交应用中的各种行为进行量化&#xff0c;比如发布动态的数量、点赞评论的次数…...

goner/otel 在Gone框架接入OpenTelemetry

文章目录 背景与意义快速上手&#xff1a;五步集成 OpenTelemetry运行效果展示代码详解与实践目录结构说明组件加载&#xff08;module.load.go&#xff09;业务组件示例&#xff08;your_component.go&#xff09;程序入口&#xff08;main.go&#xff09; 进阶用法与最佳实践…...

杨校老师项目之基于SSM与JSP的鲜花销售系统-【成品设计含文档】

基于SSMJSP鲜花商城系统 随着电子商务的快速发展&#xff0c;鲜花在线销售已成为一种重要的消费模式。本文设计并实现了一个基于JSP技术的鲜花销售管理系统&#xff0c;采用B/S架构&#xff0c;使用SSM框架进行开发&#xff0c;并结合Maven进行项目依赖管理。系统分为前台用户模…...

springboot集成langchain4j实现票务助手实战

前言 看此篇的前置知识为langchain4j整合springboot&#xff0c;以及springboot集成langchain4j记忆对话。 Function-Calls介绍 langchain4j 中的 Function Calls&#xff08;函数调用&#xff09;是一种让大语言模型&#xff08;LLM&#xff09;与外部工具&#xff08;如 A…...

Feed流推送之订阅推送

分类 feed流分为TimeLine和智能排序&#xff0c;前者不对内容进行过滤&#xff0c;一般根据发布的时间来进行排序&#xff0c;一般用于好友动态或者推送关注的人的消息&#xff0c;而后者一般有着复杂的算法&#xff0c;可以根据算法智能地向目标用户推送内容&#xff0c;例如…...

wordpress自学笔记 第四节 商城菜单的添加和修改美化

wordpress自学笔记 摘自 超详细WordPress搭建独立站商城教程-第四节 商城菜单的添加和修改美化&#xff0c;2025 WordPress搭建独立站商城#WordPress建站教程https://www.bilibili.com/video/BV1UwwgeuEkK?spm_id_from333.788.videopod.sections&vd_sourcea0af3bbc6b6d…...

GPU L2 Cache一致性协议对科学计算的影响研究

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 一、GPU缓存层级革命&#xff1a;从Volta到Hopper的演进图谱 1.1 架构级缓存策略对比 ‌Vo…...

C++中类中const知识应用详解

下面将从**const 成员**、const 成员函数、const 对象、mutable、constexpr 等方面&#xff0c;逐一详解 C 类中常见的 const 用法及注意事项&#xff0c;并配合示例。 一、const 数据成员 必须在初始化列表中初始化 class A {const int x; // const 成员 public:A(int v) :…...

【速写】KV-cache与解码的再探讨(以束搜索实现为例)

文章目录 1 Beam Search 解码算法实现2 实现带KV Cache的Beam Search解码3 关于在带kv-cache的情况下的use_cache参数 1 Beam Search 解码算法实现 下面是一个使用PyTorch实现的beam search解码算法&#xff1a; 几个小细节&#xff1a; 束搜索可以加入length_penalty&#…...

(网络)应用层协议-HTTPS

1.HTTPS是什么&#xff1f; HTTPS是应用层的一种协议&#xff0c;是在HTTP的基础上进行了加密层的处理。 HTTP协议的内容都是按照文本的形式进行传输的&#xff0c;所以呢就很容易被别人知道传输的是什么。 我们在了解了TCP/IP之后是知道我们的数据在传输的过程中是通过路由器进…...

vue3: pdf.js 3.4.120 using javascript

npm install pdfjs-dist3.4.120 项目结构&#xff1a; pdfjsViewer.vue <template><div><div v-if"loading" class"flex justify-center items-center py-8"><div class"animate-spin rounded-full h-12 w-12 border-b-2 borde…...

Spark目前支持的部署模式。

一、本地模式&#xff08;Local Mode&#xff09; 特点&#xff1a; 在单台机器上运行&#xff0c;无需集群。主要用于开发、测试和调试。所有组件&#xff08;Driver、Executor&#xff09;在同一个 JVM 中运行。 启动命令&#xff1a; bash spark-submit --master local[*]…...

想实现一个基于MCP的pptx生成系统架构图【初版实现】

技术栈:Python + MCP协议 + python-pptx + FastMCP 核心创新点:通过MCP协议实现PPTX元素的动态化生成与标准化模板管理 当前还是个半成品,后续持续更新。 主要先介绍一下思路。 一、MCP协议与系统设计原理 1.1 为什么选择MCP? 标准化工具调用:通过MCP将PPTX元素生成逻辑封…...

PyTorch Lightning实战 - 训练 MNIST 数据集

MNIST with PyTorch Lightning 利用 PyTorch Lightning 训练 MNIST 数据。验证梯度范数、学习率、优化器对训练的影响。 pip show lightning Version: 2.5.1.post0Fast dev run DATASET_DIR"/repos/datasets" python mnist_pl.py --output_grad_norm --fast_dev_run…...

力扣2094题解

记录&#xff1a; 2025.5.12 题目&#xff1a; 思路&#xff1a; 暴力遍历。 解题步骤&#xff1a; 1.统计数字出现次数&#xff1a;使用数组cnt来记录输入数组中每个数字的出现次数。 2.生成三位偶数&#xff1a;通过循环从100开始&#xff0c;每次递增2&#xff0c;生成…...

DHCP自动分配IP

DHCP自动分配IP 练习1 路由器 Router>en Router#conf t Router(config)#ip dhcp pool ip10 //创建DHCP地址池 Router(dhcp-config)#network 192.168.20.0 255.255.255.0 // 配置网络地址和子网掩码 Router(dhcp-config)#default-router 192.168.20.254 //配置默认网关 Rou…...

【CF】Day57——Codeforces Round 955 (Div. 2, with prizes from NEAR!) BCD

B. Collatz Conjecture 题目&#xff1a; 思路&#xff1a; 简单模拟 很简单的模拟&#xff0c;我们只需要快速的找到下一个离 x 最近的 y 的倍数即可&#xff08;要大于 x&#xff09; 这里我们可以这样写 add y - (x % y)&#xff0c;这样就知道如果 x 要变成 y 的倍数还要…...

(done) 补充:xv6 的一个用户程序 init 是怎么启动的 ?它如何启动第一个 bash ?

先看 main.c 从函数名来看&#xff0c;比较相关的就 userinit() 和 scheduler() #include "types.h" #include "param.h" #include "memlayout.h" #include "riscv.h" #include "defs.h"volatile static int started 0;//…...

Nginx部署前端项目深度解析

在部署Vue前端项目时&#xff0c;Nginx的高效配置直接影响用户体验和性能表现。以下从7个关键维度深度解析部署方案&#xff0c;并提供专业级配置策略&#xff1a; 一、项目构建与基础部署 生产构建 npm run build -- --modern # 现代模式构建生成dist/目录包含&#xff1a;…...

超详细讲解C语言转义字符\a \b \r \t \? \n等等

转义字符 C语言有一组字符很特殊&#xff0c;叫做转义字符&#xff0c;顾名思义&#xff0c;改变原来的意思的字符。 1 \? ??)是一个三字母词&#xff0c;在以前的编译器它会被编译为] (??会被编译为[ 因此在以前输入(are you ok ??)就会被编译为are you ok ] 解决这个…...

SpringBoot校园失物招领信息平台

SpringBoot校园失物招领信息平台 文章目录 SpringBoot校园失物招领信息平台1、技术栈2、项目说明2.1、登录注册2.2、管理员端截图2.3、用户端截图 3、核心代码实现3.1、前端首页3.2、前端招领广场3.3、后端业务处理 1、技术栈 本项目采用前后端分离的架构&#xff0c;前端和后…...

【Qt/C++】深入理解 Lambda 表达式与 `mutable` 关键字的使用

【Qt/C】深入理解 Lambda 表达式与 mutable 关键字的使用 在 Qt 开发中&#xff0c;我们常常会用到 lambda 表达式来编写简洁的槽函数。今天通过一个实际代码示例&#xff0c;详细讲解 lambda 的语法、变量捕获方式&#xff0c;特别是 mutable 的作用。 示例代码 QPushButto…...

扩展:React 项目执行 yarn eject 后的 package.json 变化详解及参数解析

扩展&#xff1a;React 项目执行 yarn eject 后的 package.json 变化详解及参数解析 什么是 yarn eject&#xff1f;React 项目执行 yarn eject 后的 package.json 变化详解1. 脚本部分 Scripts 被替换2. 新增构建依赖 dependencies&#xff08;部分&#xff09;3. 新增 Babel …...

slackel系统详解

Slackel 是一个基于 Slackware Linux 和 Salix OS&#xff08;另一个 Slackware 衍生版&#xff09;的轻量级 Linux 发行版&#xff0c;主要面向桌面用户。它由希腊开发者 Dimitris Tzemos 创建&#xff0c;目标是结合 Slackware 的稳定性与用户友好的工具&#xff0c;同时优化…...

rust 全栈应用框架dioxus server

接上一篇文章dioxus全栈应用框架的基本使用&#xff0c;支持web、desktop、mobile等平台。 可以先查看上一篇文章rust 全栈应用框架dioxus&#x1f448; 既然是全栈框架&#xff0c;那肯定是得有后端服务的&#xff0c;之前创建的服务没有包含后端服务包&#xff0c;我们修改…...

CSS Layer 详解

CSS Layer 详解 前言 最近在整理CSS知识体系时&#xff0c;发现Layer这个特性特别有意思。它就像是给样式规则提供了一个专属的「VIP通道」&#xff0c;让我们能更优雅地解决样式冲突问题。今天我就用最通俗的语言&#xff0c;带大家全面了解这个CSS新特性。 什么是CSS Laye…...