超子物联网HAL库笔记:准备篇
超子物联网 HAL库学习 汇总入口:
超子物联网HAL库笔记:[汇总]
写作不易,如果您觉得写的不错,欢迎给博主来一波点赞、收藏~让博主更有动力吧!
1. HAL库简介
HAL库
- HAL库(Hardware Abstraction Layer)是STMicroelectronics提供的STM32微控制器的硬件抽象层库。
- 它通过一套统一的API接口,简化了对STM32外设的配置和操作,使开发者能够更快速地进行嵌入式系统开发,而不必深入了解底层硬件细节。
HAL库的优点
- 高层次抽象:HAL库提供了高层次的抽象接口,简化了对硬件外设的操作。开发者可以通过调用库函数完成复杂的硬件配置,而不必直接操作寄存器。
- 易于使用:由于提供了丰富的库函数和示例代码,开发者可以快速上手进行开发,减少了开发时间。
- 一致性和移植性:HAL库在不同的STM32系列中保持了一致的API接口,增强了代码的移植性和重用性。如果需要更换STM32系列微控制器,代码的修改量较小。
- 简化调试:由于HAL库屏蔽了底层的寄存器操作,调试过程中更容易定位和解决问题,减少了开发和维护的复杂性。
- 代码维护性好:HAL库的高层次封装和良好的代码结构使得代码更容易维护和更新。
对比标准固件库的不同
- 抽象层次:
- 标准固件库:直接操作寄存器,提供底层硬件访问,要求开发者对STM32微控制器的寄存器有较深入的理解。
- HAL库:提供高层次的抽象接口,屏蔽底层寄存器操作,使开发者可以更快速地进行开发。
- 代码复杂性:
- 标准固件库:代码较复杂,涉及大量的寄存器配置,开发者需要处理更多的细节。
- HAL库:代码简洁易读,通过调用库函数进行配置和操作,减少了代码量和复杂性。
- 学习曲线:
- 标准固件库:学习曲线较陡,需要花费较多时间了解和掌握硬件细节。
- HAL库:学习曲线较缓,提供了丰富的示例代码和文档,开发者可以快速上手。
- 开发效率:
- 标准固件库:适合对性能和功耗有严格要求的项目,但开发和调试时间较长。
- HAL库:提高了开发效率,适合快速开发和原型设计,缩短了开发周期。
- 移植性:
- 标准固件库:不同系列的STM32微控制器之间存在较大的差异,代码移植工作量较大。
- HAL库:提供一致的API接口,增强了代码的移植性和重用性,不同系列之间的移植工作量较小。
2. 创建HAL库工程模板
1. 制作文件模板
-
先找一个位置,存放工程模板
-
在工程模板中 添加 User、Library 、 Hardware 、 CMSIS 文件夹:
- User:
- main.c
- Library:
- Include
- Source
- Hardware:
- Include
- Source
- CMSIS :
- Include
- Source
- User:
-
下载HAL库 源码 STM32Cube MCU和MPU包: 相关产品
-
解压并打开
-
拷贝HAL库(Library)
- 进入
\\STM32Cube_FW_F1_V1.8.0\\Drivers\\STM32F1xx_HAL_Driver
把头文件夹 Inc 和源文件夹 Src 移动到自己的Library的对应的文件中
- 进入
-
拷贝启动文件(CMSIS\Include)
- 先进入内核文件
\\STM32Cube_FW_F1_V1.8.0\\Drivers\\CMSIS
- 进入头文件
\\CMSIS\\Include
把所有文件拷贝到自己的CMSIS/Include文件中 再进入\\CMSIS\\Device\\ST\\STM32F1xx\\Include
把所有文件拷贝到自己的CMSIS/Include文件中
- 先进入内核文件
-
拷贝源文件(CMSYS\Source)
- 进入
\\STM32Cube_FW_F1_V1.8.0\\Drivers\\CMSIS\\Device\\ST\\STM32F1xx\\Source\\Templates
- 把
\\Templates
文件的的system_stm32f1xx.c拷贝到自己的CMSIS/Source文件中 - 再进入/arm文件下,把所有文件拷贝到自己的CMSIS/Source文件中
- 进入
-
编辑Hardware文件夹
分别在源文件家和头文件夹添加stm32f1xx_it.c 和stm32f1xx_it.h 代码如下
stm32f1xx_it.c
/*-------------------------------------------------*/
/* */
/* 实现各种中断服务函数的源文件 */
/* */
/*-------------------------------------------------*/#include "stm32f1xx_hal.h"
#include "stm32f1xx_it.h" /*-------------------------------------------------*/
/*函数名:不可屏蔽中断处理函数 */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
void NMI_Handler(void)
{}/*-------------------------------------------------*/
/*函数名:硬件出错后进入的中断处理函数 */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
void HardFault_Handler(void)
{}
/*-------------------------------------------------*/
/*函数名:软中断,SWI 指令调用的处理函数 */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
void SVC_Handler(void)
{}
/*-------------------------------------------------*/
/*函数名:可挂起的系统服务处理函数 */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
void PendSV_Handler(void)
{}
/*-------------------------------------------------*/
/*函数名:SysTic系统嘀嗒定时器处理函数 */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
void SysTick_Handler(void)
{ HAL_IncTick();
}
stm32f1xx_it.h
/********************************************************************************* @file GPIO/GPIO_IOToggle/Inc/stm32f1xx_it.h* @author MCD Application Team* @brief This file contains the headers of the interrupt handlers.******************************************************************************* @attention** <h2><center>© Copyright (c) 2016 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:* opensource.org/licenses/BSD-3-Clause********************************************************************************//* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F1xx_IT_H
#define __STM32F1xx_IT_H#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);#ifdef __cplusplus
}
#endif#endif /* __STM32F1xx_IT_H *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
最后需要把自己的Library文件中的Include 文件中的stm32f1xx_hal_conf_template.h 更名为 stm32f1xx_hal_conf.h 。否则编译会找不到这个头文件
文件结构
CMSISIncludecmsis_armcc.hcmsis_armclang.hcmsis_compiler.hcmsis_gcc.hcmsis_iccarm.hcmsis_version.hcore_armv8mbl.hcore_armv8mml.hcore_cm0.hcore_cm0plus.hcore_cm1.hcore_cm23.hcore_cm3.hcore_cm33.hcore_cm4.hcore_cm7.hcore_sc000.hcore_sc300.hmpu_armv7.hmpu_armv8.hstm32f100xb.hstm32f100xe.hstm32f101x6.hstm32f101xb.hstm32f101xe.hstm32f101xg.hstm32f102x6.hstm32f102xb.hstm32f103x6.hstm32f103xb.hstm32f103xe.hstm32f103xg.hstm32f105xc.hstm32f107xc.hstm32f1xx.hsystem_stm32f1xx.htz_context.hSourcestartup_stm32f100xb.sstartup_stm32f100xe.sstartup_stm32f101x6.sstartup_stm32f101xb.sstartup_stm32f101xe.sstartup_stm32f101xg.sstartup_stm32f102x6.sstartup_stm32f102xb.sstartup_stm32f103x6.sstartup_stm32f103xb.sstartup_stm32f103xe.sstartup_stm32f103xg.sstartup_stm32f105xc.sstartup_stm32f107xc.ssystem_stm32f1xx.c
DebugConfigProject_STM32F103C8_1.0.0.dbgconfTarget_1_STM32F103C8_1.0.0.dbgconf
HardwareIncludestm32f1xx_it.hSourcestm32f1xx_it.c
LibraryIncludeLegacystm32f1xx_hal_can_ex_legacy.hstm32f1xx_hal_can_legacy.hstm32_hal_legacy.hstm32f1xx_hal.hstm32f1xx_hal_adc.hstm32f1xx_hal_adc_ex.hstm32f1xx_hal_can.hstm32f1xx_hal_cec.hstm32f1xx_hal_conf.hstm32f1xx_hal_cortex.hstm32f1xx_hal_crc.hstm32f1xx_hal_dac.hstm32f1xx_hal_dac_ex.hstm32f1xx_hal_def.hstm32f1xx_hal_dma.hstm32f1xx_hal_dma_ex.hstm32f1xx_hal_eth.hstm32f1xx_hal_exti.hstm32f1xx_hal_flash.hstm32f1xx_hal_flash_ex.hstm32f1xx_hal_gpio.hstm32f1xx_hal_gpio_ex.hstm32f1xx_hal_hcd.hstm32f1xx_hal_i2c.hstm32f1xx_hal_i2s.hstm32f1xx_hal_irda.hstm32f1xx_hal_iwdg.hstm32f1xx_hal_mmc.hstm32f1xx_hal_nand.hstm32f1xx_hal_nor.hstm32f1xx_hal_pccard.hstm32f1xx_hal_pcd.hstm32f1xx_hal_pcd_ex.hstm32f1xx_hal_pwr.hstm32f1xx_hal_rcc.hstm32f1xx_hal_rcc_ex.hstm32f1xx_hal_rtc.hstm32f1xx_hal_rtc_ex.hstm32f1xx_hal_sd.hstm32f1xx_hal_smartcard.hstm32f1xx_hal_spi.hstm32f1xx_hal_sram.hstm32f1xx_hal_tim.hstm32f1xx_hal_tim_ex.hstm32f1xx_hal_uart.hstm32f1xx_hal_usart.hstm32f1xx_hal_wwdg.hstm32f1xx_ll_adc.hstm32f1xx_ll_bus.hstm32f1xx_ll_cortex.hstm32f1xx_ll_crc.hstm32f1xx_ll_dac.hstm32f1xx_ll_dma.hstm32f1xx_ll_exti.hstm32f1xx_ll_fsmc.hstm32f1xx_ll_gpio.hstm32f1xx_ll_i2c.hstm32f1xx_ll_iwdg.hstm32f1xx_ll_pwr.hstm32f1xx_ll_rcc.hstm32f1xx_ll_rtc.hstm32f1xx_ll_sdmmc.hstm32f1xx_ll_spi.hstm32f1xx_ll_system.hstm32f1xx_ll_tim.hstm32f1xx_ll_usart.hstm32f1xx_ll_usb.hstm32f1xx_ll_utils.hstm32f1xx_ll_wwdg.hstm32_assert_template.hSourceLegacystm32f1xx_hal_can.cstm32f1xx_hal.cstm32f1xx_hal_adc.cstm32f1xx_hal_adc_ex.cstm32f1xx_hal_can.cstm32f1xx_hal_cec.cstm32f1xx_hal_cortex.cstm32f1xx_hal_crc.cstm32f1xx_hal_dac.cstm32f1xx_hal_dac_ex.cstm32f1xx_hal_dma.cstm32f1xx_hal_eth.cstm32f1xx_hal_exti.cstm32f1xx_hal_flash.cstm32f1xx_hal_flash_ex.cstm32f1xx_hal_gpio.cstm32f1xx_hal_gpio_ex.cstm32f1xx_hal_hcd.cstm32f1xx_hal_i2c.cstm32f1xx_hal_i2s.cstm32f1xx_hal_irda.cstm32f1xx_hal_iwdg.cstm32f1xx_hal_mmc.cstm32f1xx_hal_msp_template.cstm32f1xx_hal_nand.cstm32f1xx_hal_nor.cstm32f1xx_hal_pccard.cstm32f1xx_hal_pcd.cstm32f1xx_hal_pcd_ex.cstm32f1xx_hal_pwr.cstm32f1xx_hal_rcc.cstm32f1xx_hal_rcc_ex.cstm32f1xx_hal_rtc.cstm32f1xx_hal_rtc_ex.cstm32f1xx_hal_sd.cstm32f1xx_hal_smartcard.cstm32f1xx_hal_spi.cstm32f1xx_hal_sram.cstm32f1xx_hal_tim.cstm32f1xx_hal_timebase_rtc_alarm_template.cstm32f1xx_hal_timebase_tim_template.cstm32f1xx_hal_tim_ex.cstm32f1xx_hal_uart.cstm32f1xx_hal_usart.cstm32f1xx_hal_wwdg.cstm32f1xx_ll_adc.cstm32f1xx_ll_crc.cstm32f1xx_ll_dac.cstm32f1xx_ll_dma.cstm32f1xx_ll_exti.cstm32f1xx_ll_fsmc.cstm32f1xx_ll_gpio.cstm32f1xx_ll_i2c.cstm32f1xx_ll_pwr.cstm32f1xx_ll_rcc.cstm32f1xx_ll_rtc.cstm32f1xx_ll_sdmmc.cstm32f1xx_ll_spi.cstm32f1xx_ll_tim.cstm32f1xx_ll_usart.cstm32f1xx_ll_usb.cstm32f1xx_ll_utils.c
ListingsProject.map
Objectsmain.dmain.oProject.axfProject.build_log.htmProject.htmProject.lnpProject.sctProject_Project.depstartup_stm32f101xb.ostm32f1xx_hal.dstm32f1xx_hal.ostm32f1xx_hal_cortex.dstm32f1xx_hal_cortex.ostm32f1xx_hal_gpio.dstm32f1xx_hal_gpio.ostm32f1xx_hal_gpio_ex.dstm32f1xx_hal_gpio_ex.ostm32f1xx_hal_rcc.dstm32f1xx_hal_rcc.ostm32f1xx_hal_rcc_ex.dstm32f1xx_hal_rcc_ex.osystem_stm32f1xx.dsystem_stm32f1xx.o
Usermain.c
2. Keil 创建工程
-
创建工程、选择User为目录。
-
点击木箱子设置分组
- User 、 Library 、 Hardware 、 CMSIS
-
导入文件
- 这里只导入必备的。以后用哪个再加那个
- Library:
- stm32f1xx_hal.c
- stm32f1xx_hal_cortex.c
- stm32f1xx_hal_gpio.c
- stm32f1xx_hal_gpio_ex.c
- stm32f1xx_hal_rcc.c
- stm32f1xx_hal_rcc_ex.c
- CNSIS:
- system_stm32f1xx.c
- startup_stm32f103xb.s
- User:
- main.c
-
在魔术棒中设置:
C/C++中: 在Define输入STM32F103xB (目的是通知编译器我们用的是xb) 添加头文件路径(Hardware、CMSIS、Library)。以后有别的添加则再添加。 Target中:
选择ARM编译器为v6.16 否则会报错
-
在main.c中引入头文件stm32f1xx_hal.h (在hal.c中可找到)
-
最后编译即可。0错误0警告
3. HAL库结构初步分析
-
以HAL库的串口为例来讲解
-
串口分为USART和UART 他们分别是同步通信和异步通信。一般我们用异步的
所以这里我们添加uart.c的文件。
-
hal库之中,串口包含三种方式: 轮询、中断、DMA。所以在库文件中必须添加DMA库
所以我们这里添加DMA.c的文件
-
-
在HAL库中每个外设都有两个关键的部分:
- Private:(私有的),是HAL库内部自己调用的
- Exported:(对外的),我们的应用程序中去调用。Exported分为四个部分
- types,各种Struct结构体,用于外设功能配置。对应了CubeMax软件的配置项
- constants,上方各种Struct结构体中的成员的可以配置的选项
- macro,宏定义,相当于直接对寄存器操作。因为在某些时候调用api反而效率不高
- functions,API函数。
这些是可以在文件中验证的。hal_uart.c中 可见
我们对CubeMax的操作,实际上就是与这些结构体、成员变量一一对应的
一个外设的相关结构体会被定义在一个总的结构体中。比如串口是UART_HandleTypedef
相关文章:
超子物联网HAL库笔记:准备篇
超子物联网 HAL库学习 汇总入口: 超子物联网HAL库笔记:[汇总] 写作不易,如果您觉得写的不错,欢迎给博主来一波点赞、收藏~让博主更有动力吧! 1. HAL库简介 HAL库 HAL库(Hardware Abstraction Layer&#…...

FoRAG:面向网络增强型长文本问答的事实优化检索增强生成方法
人工智能咨询培训老师叶梓 转载标明出处 检索增强生成技术尽管出现了各种开源方法和商业系统,如Bing Chat,但生成的长文本答案中缺乏事实性和清晰逻辑的问题仍未得到解决。为了解决这些问题,来自蚂蚁集团和清华大学的研究者们提出了一种名为…...
Android NSD局域网发现服务
近期在了解局域网发现服务的时候无意间看到Android 自带的(Network Service Discovery)网络发现服务,在一番验证之后发现实现比较简单,可靠性也高,因此在这里做一个整理,算是对自己知识做一个归档。 网络服…...

算法的学习笔记—左旋转字符串(牛客JZ58)
😀前言 在程序设计中,字符串处理问题屡见不鲜,其中“字符串左旋”是一种常见操作,今天我们一起来探讨一个经典的左旋转字符串题目,以及一种优雅的解决方案——三步翻转法。 🏠个人主页:尘觉主页…...

Mac 上无法烧录 ESP32C3 的问题记录:A fatal error occurred:Failed to write to target RAM
文章目录 问题描述驱动下载地址问题解决:安装 CH343 驱动踩的坑日志是乱码 问题描述 我代码编译可以,但是就是烧录不上去 A fatal error occurred:Failed to write to target RAM(result was 01070000:Operation timed out) Uploaderror:上传失败&…...

ios 项目升级极光SDK
由于项目使用的是旧版本,隐私合规检查不通过,需要升级到最新版本, 使用cocoapods集成无法正常运行,.a文件找不到,可能项目比较久了,最好选择手动导入 下载最新版本SDK,将 SDK 包解压ÿ…...
【Java】java | logback日志配置 | 按包配置级别
一、概述 日志配置需求: 本地部分包开debug,其他路径走配置;只在本地环境有效 二、logback.xml配置 <!--本地调试,开debug--> <springProfile name"dev"><logger name"cn.hg.demo" level&quo…...

Virtuoso使用layout绘制版图、使用Calibre验证DRC和LVS
1 绘制版图 1.1 进入Layout XL 绘制好Schmatic后,在原理图界面点击Launch,点击Layout XL进入版图绘制界面。 1.2 导入元件 1、在Layout XL界面左下角找打Generate All from Source。 2、在Generate Layout界面,选中“Instance”&#…...
Spring框架原理面试题及参考答案
目录 什么是Spring 开发框架? 说说Spring 的 IOC 和 DI? 简述IoC(控制反转)及在 Spring 中的实现 说说Spring IOC 容器的基本概念? 说说Spring IoC 的实现机制? 说说Spring IoC 容器? 简述Spring ApplicationContext 说说Spring Bean 的生命周期 说说在 Spring…...

Java类的static成员以及代码块(详细版)
文章目录 一、什么是static成员二、static修饰的成员有何意义三、static修饰成员变量四、static修饰成员方法4.1、静态成员变量不可以在方法内创建4.2、静态成员方法内部不可以访问非静态成员变量4.3、总结 五、static成员变量的初始化5.1、就地初始化5.2、静态代码块初始化 六…...

Opensearch集群部署【docker、服务器、Helm多种部署方式】
操作系统兼容性 我们建议在 Red Hat Enterprise Linux (RHEL) 或使用systemd的基于 Debian 的 Linux 发行版上安装 OpenSearch ,例如 CentOS、Amazon Linux 2 和 Ubuntu Long-Term Support (LTS)。OpenSearch 应该适用于大多数 Linux 发行版,但我们只测…...

本地Docker部署开源WAF雷池并实现异地远程登录管理界面
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

性能需求笔记
名称解释 系统用户:所有注册过的用户;在线用户:某时间段内登录且在线的用户 pv:用户浏览页面的次数 UV:登录系统的用户,uv课产生多个pv 性能测试:测试软件在系统中的运行性能,度量系…...

ts:数组的常用方法(reduce累加)
ts:数组的常用方法(reduce累加) 一、主要内容说明二、例子reduce方法(累加)1.源码1 (reduce方法)2.源码1运行效果 三、结语四、定位日期 一、主要内容说明 ts中数组的reduce方法,用…...
Begin
cpp 编程的发展方向还是很多的:游戏、嵌入式、QT、客户端、服务端、机器学习、算法大模 型 ...,现阶段还是不太清楚具体想走什么方向。主QT编程应该是不在考虑之内的,可以为辅简单 学习一下;游戏方向:需要学习lua语言…...

【实战案例】Django框架表单处理及数据库交互
本文基于之前内容列表如下: 【图文指引】5分钟搭建Django轻量级框架服务 【实战案例】Django框架基础之上编写第一个Django应用之基本请求和响应 【实战案例】Django框架连接并操作数据库MySQL相关API 【实战案例】Django框架使用模板渲染视图页面及异常处理 更新编…...
python开发工具是选择vscode还是pycharm?两款软件优缺点对照!
Pycharm和VSCode是两款流行的代码编辑器,它们都有各自的优缺点和适用情况。本文将从以下几个方面对它们进行比较和分析: 功能和扩展性性能和稳定性用户体验和界面价格和支持 功能和扩展性 Pycharm是一款专为Python开发而设计的集成开发环境(…...

2025选题|基于Hadoop的物品租赁系统的设计与实现
作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,…...

【Qt】QTableView添加下拉框过滤条件
实现通过带复选框的下拉框来为表格添加过滤条件 带复选框的下拉框 .h文件 #pragma once #include <QCheckBox> #include <QComboBox> #include <QEvent> #include <QLineEdit> #include <QListWidget>class TableComboBox : public QComboBox …...

部署DNS主从服务器
一。DNS主从服务器作用: DNS作为重要的互联网基础设施服务,保证DNS域名解析服务的正常运转至关重要,只有这样才能提供稳定、快速日不间断的域名查询服务 DNS 域名解析服务中,从服务器可以从主服务器上获取指定的区域数据文件&…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

[拓扑优化] 1.概述
常见的拓扑优化方法有:均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有:有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...