【蓝桥杯嵌入式】 第六届国赛

目录

题目

配置

注意事项

代码 - 默写大师

EEPROM读写函数

LED驱动函数

ADC采集

上电初始化

LCD

按键

PWM互补输出

全部代码

hardware.c

hardware.h

control.c

control.h

main.c 


题目

配置

注意事项

复制LCD的工程,先配置资源 --- 勾选完选项一定要再看一眼,可能选择错误

ADC:配置ADC2_IN15,对应PB15引脚

EEROM,配置PB6和PB7

按键 输入模式PB0、PB1、PB2、PA0

LED 一定要使能PD2

PWM互补输出,用TIM15

TIM6 - 10ms基准定时器


代码 - 默写大师

先默写几个函数

EEPROM读写函数

随机地址读函数 - 参考手册的时序

uint8_t EEPROM_ReadByte(uint8_t address)
{
	uint8_t data;
	I2CStart();
	I2CSendByte(0xA0);		// address + write
	I2CWaitAck();
	I2CSendByte(address);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0xA1);		// address + read
	I2CWaitAck();
	data = I2CReceiveByte();
	I2CSendNotAck();
	I2CStop();
	return data;
}

void EEPROM_WriteByte(uint8_t address, uint8_t data)
{
    I2CStart();
    I2CSendByte(0xA0);
    I2CWaitAck();
    I2CSendByte(address);
    I2CWaitAck();
    
    I2CSendByte(data);
    I2CWaitAck();
    I2CStop();
}

定义几个结构体

//-----------------------
void power_init(void);
void LCD_Disp(void);
void Key_Proc(void);
void ADC_Proc(void);
void PWM_Proc(void);

//-----------------------
struct Tick{
    uint32_t lcd;
    uint32_t key;
    uint32_t adc;
    uint32_t pwm;
};
extern struct Tick tick;

struct Flag{
    bool PWM_Mode;
    uint8_t LCD_View;
};
extern struct Flag flag;

struct Param{
    double ADC;
    
    uint16_t PWM_Frq;       //频率
    uint8_t  PWM_Duty_PA9;
    uint8_t  PWM_Duty_PA14;
};
extern struct Param param;
//定义变量
struct Tick tick;
struct Flag flag;
struct Param param;
struct Keys key;

LED驱动函数

void LED_Disp(uint8_t state)
{
    HAL_GPIO_WritePin(GPIOC, 0xFF00, GPIO_PIN_SET); //0ff
    HAL_GPIO_WritePin(GPIOC, state << 8, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}

ADC采集

double Get_ADC(ADC_HandleTypeDef *hadc)
{
    uint32_t adc;
    HAL_ADC_Start(hadc);
    adc = HAL_ADC_GetValue(hadc);
    return adc*3.3/4040;    //这里应该是adc*3.3/4096
}
double Get_ADC(ADC_HandleTypeDef *hadc)
{
    uint32_t adc;
    HAL_ADC_Start(hadc);
    adc = Hal_ADC_GetValue(hadc);
    return adc*3.3/4040;
}

返回值应该是adc*3.3/4096,但是这里我改成了return adc*3.3/4040; 补偿电压采集的数据,范围是0~3.30V

void ADC_Proc(void)
{
    if (uwTick - tick.adc < 250)
        return;
    tick.adc = uwTick;
    param.ADC = Get_ADC(&hadc2);
}

上电初始化

void power_init(void)
{
    LCD_Clear(Black);
    LCD_SetBackColor(Black);
    LCD_SetTextColor(White);

    LED_Disp(0x00); //0ff
    I2CInit();
    
    if (EEPROM_ReadByte(0x55) != 0x11)  //第一次上电
    {
        param.PWM_Frq = 1000;   //初始化参数
        EEPROM_WriteByte(0x55, 0x11);
        HAL_Delay(10);
        EEPROM_WriteByte(0x01, 1);
        HAL_Delay(10);
    }
    else
    {
        param.PWM_Frq = EEPROM_ReadByte(0x01)*1000;
    }
}

LCD

封装LCD显示函数,使用可变参数列表

#include "stdio.h"
#include "string.h"
#include "stdarg.h"

void LCD_Printf(uint8_t linex, char *format, ...)
{
    char lcd_show_text[30];
    memset(lcd_show_text, '\0', sizeof(lcd_show_text));
    va_list arg;
    va_start(arg, format);
    vsprintf(lcd_show_text, format, arg);
    LCD_DisplayStringLine(linex, (uint8_t *)lcd_show_text);
    va_end(arg);
}

LCD界面 

void LCD_Disp(void)
{
    if (uwTick - tick.lcd < 200)
        return;
    tick.lcd = uwTick;
    
    if (flag.LCD_View == 0)
    {
        LCD_Printf(Line0, "      Para");
        LCD_Printf(Line2, "  ADC_V:%.2fV ", param.ADC);
        LCD_Printf(Line4, "  State:%s  ", (flag.PWM_Mode) ? "start" : "stop" );   //三目运算符
        LCD_Printf(Line6, "  Siginal:PA9: %2d%%  ", (flag.PWM_Mode) ? (param.PWM_Duty_PA9) : 0);
        LCD_Printf(Line7, "          PB14:%2d%%  ", (flag.PWM_Mode) ? (param.PWM_Duty_PA14) :0);
        LCD_Printf(Line8, "          %dKHz   ", param.PWM_Frq/1000);
        LCD_Printf(Line9, "                   1");        
    }
    else if (flag.LCD_View == 1)
    {
        LCD_Printf(Line1, "      Setting");
        LCD_Printf(Line5, "  Signal_Frq:%dKHz  ", param.PWM_Frq/1000);
        LCD_Printf(Line9, "                   2");
    }
}

按键

按键扫描

void Key_Read(void)
{
    if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0)
        key.value = 1;
    else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0)
        key.value = 2;
    else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0)
        key.value = 3;
    else if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0)
        key.value = 4;
    else
        key.value = 0;
    key.down = key.value & (key.value ^ key.old);
    key.up  = ~key.value & (key.value ^ key.old);
    key.old = key.value;
}

按键处理函数

void Key_Proc(void)
{
    if (uwTick - tick.key < 10) //10ms
        return;
    tick.key = uwTick;
    Key_Read();
    if (key.down == 1)  //“B1”按键设定为“启动/停止”按键
    {
        flag.PWM_Mode = !flag.PWM_Mode;
    }
    
    if (key.down == 2)
    {
        //先判断是否存入E2PROM
        if (flag.LCD_View == 1)
        {
            //eeprom
            EEPROM_WriteByte(0x01, param.PWM_Frq/1000); //存整数部分
            HAL_Delay(10);
        }
        
        // 再刷新界面
        flag.LCD_View ++;
        if (flag.LCD_View == 2) flag.LCD_View = 0;
        LCD_Clear(Black);        
    }
    
    if (key.down == 3)
    {
        if (flag.LCD_View == 1)
        {
            param.PWM_Frq += 1000;
            if (param.PWM_Frq > 10000)  param.PWM_Frq = 1000;
        }
    }    
}

PWM互补输出

PWM配置的定时器,给的80-1预分频,那计数值就是80M/80 = 1M

频率设置:TIMx->ARR = 1e6/频率

占空比设置:TIMx->CCRx = (1e6/频率)*占空比

我代码里的占空比只保留整数部分,所以我的CCR赋值时候最后除以100。

void PWM_Proc(void)
{
    if (uwTick - tick.pwm < 100)
        return;
    tick.pwm = uwTick;
    
    //计算占空比
    param.PWM_Duty_PA9 = (uint8_t)(param.ADC*100.0/3.3);
    param.PWM_Duty_PA14 = 100-param.PWM_Duty_PA9;
    
    TIM15->ARR = 1e6 / param.PWM_Frq;   //计算频率
    if (flag.PWM_Mode == 0) //stop
    {   //关闭PWM输出
        LED_Disp(0);
        HAL_TIM_PWM_Stop(&htim15, TIM_CHANNEL_1);
        HAL_TIMEx_PWMN_Stop(&htim15, TIM_CHANNEL_1);
    }
    else
    {
        LED_Disp(0x01);
        TIM15 -> CCR1 = (TIM15->ARR + 1) * param.PWM_Duty_PA9 / 100;
        HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1);
        HAL_TIMEx_PWMN_Start(&htim15, TIM_CHANNEL_1);
    }
}

互补PWM的函数

//PWM开启
HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim15, TIM_CHANNEL_1);
//PWM关闭
HAL_TIM_PWM_Stop(&htim15, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Stop(&htim15, TIM_CHANNEL_1);

全部代码

hardware.c

#include "hardware.h"

struct Keys key;

void LED_Disp(uint8_t state)
{
    HAL_GPIO_WritePin(GPIOC, 0xFF00, GPIO_PIN_SET); //0ff
    HAL_GPIO_WritePin(GPIOC, state << 8, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}

void Key_Read(void)
{
    if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0)
        key.value = 1;
    else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0)
        key.value = 2;
    else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0)
        key.value = 3;
    else if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0)
        key.value = 4;
    else
        key.value = 0;
    key.down = key.value & (key.value ^ key.old);
    key.up  = ~key.value & (key.value ^ key.old);
    key.old = key.value;
}

double Get_ADC(ADC_HandleTypeDef *hadc)
{
    uint32_t adc;
    HAL_ADC_Start(hadc);
    adc = HAL_ADC_GetValue(hadc);
    return adc*3.3/4040;
}

hardware.h

#ifndef __HARDWARE_H
#define __HARDWARE_H

#include "stm32g4xx_hal.h"

void LED_Disp(uint8_t state);
void Key_Read(void);
double Get_ADC(ADC_HandleTypeDef *hadc);


struct Keys{
    uint8_t value;
    uint8_t old;
    uint8_t down;
    uint8_t up;
};
extern struct Keys key;

#endif

control.c

#include "control.h"

//定义变量
struct Tick tick;
struct Flag flag;
struct Param param;

void power_init(void)
{
    LCD_Clear(Black);
    LCD_SetBackColor(Black);
    LCD_SetTextColor(White);

    LED_Disp(0x00); //0ff
    I2CInit();
    
    if (EEPROM_ReadByte(0x55) != 0x11)  //第一次上电
    {
        param.PWM_Frq = 1000;   //初始化参数
        EEPROM_WriteByte(0x55, 0x11);
        HAL_Delay(10);
        EEPROM_WriteByte(0x01, 1);
        HAL_Delay(10);
    }
    else
    {
        param.PWM_Frq = EEPROM_ReadByte(0x01)*1000;
    }
}

void LCD_Disp(void)
{
    if (uwTick - tick.lcd < 200)
        return;
    tick.lcd = uwTick;
    
    if (flag.LCD_View == 0)
    {
        LCD_Printf(Line0, "      Para");
        LCD_Printf(Line2, "  ADC_V:%.2fV ", param.ADC);
        LCD_Printf(Line4, "  State:%s  ", (flag.PWM_Mode) ? "start" : "stop" );   //三目运算符
        LCD_Printf(Line6, "  Siginal:PA9: %2d%%  ", (flag.PWM_Mode) ? (param.PWM_Duty_PA9) : 0);
        LCD_Printf(Line7, "          PB14:%2d%%  ", (flag.PWM_Mode) ? (param.PWM_Duty_PA14) :0);
        LCD_Printf(Line8, "          %dKHz   ", param.PWM_Frq/1000);
        LCD_Printf(Line9, "                   1");        
    }
    else if (flag.LCD_View == 1)
    {
        LCD_Printf(Line1, "      Setting");
        LCD_Printf(Line5, "  Signal_Frq:%dKHz  ", param.PWM_Frq/1000);
        LCD_Printf(Line9, "                   2");
    }
}

void Key_Proc(void)
{
    if (uwTick - tick.key < 10) //10ms
        return;
    tick.key = uwTick;
    Key_Read();
    if (key.down == 1)  //“B1”按键设定为“启动/停止”按键
    {
        flag.PWM_Mode = !flag.PWM_Mode;
    }
    
    if (key.down == 2)
    {
        //先判断是否存入E2PROM
        if (flag.LCD_View == 1)
        {
            //eeprom
            EEPROM_WriteByte(0x01, param.PWM_Frq/1000); //存整数部分
            HAL_Delay(10);
        }
        
        // 再刷新界面
        flag.LCD_View ++;
        if (flag.LCD_View == 2) flag.LCD_View = 0;
        LCD_Clear(Black);        
    }
    
    if (key.down == 3)
    {
        if (flag.LCD_View == 1)
        {
            param.PWM_Frq += 1000;
            if (param.PWM_Frq > 10000)  param.PWM_Frq = 1000;
        }
    }    
}

void ADC_Proc(void)
{
    if (uwTick - tick.adc < 250)
        return;
    tick.adc = uwTick;
    param.ADC = Get_ADC(&hadc2);
}

void PWM_Proc(void)
{
    if (uwTick - tick.pwm < 100)
        return;
    tick.pwm = uwTick;
    
    //计算占空比
    param.PWM_Duty_PA9 = (uint8_t)(param.ADC*100.0/3.3);
    param.PWM_Duty_PA14 = 100-param.PWM_Duty_PA9;
    
    TIM15->ARR = 1e6 / param.PWM_Frq;   //计算频率
    if (flag.PWM_Mode == 0) //stop
    {   //关闭PWM输出
        LED_Disp(0);
        HAL_TIM_PWM_Stop(&htim15, TIM_CHANNEL_1);
        HAL_TIMEx_PWMN_Stop(&htim15, TIM_CHANNEL_1);
    }
    else
    {
        LED_Disp(0x01);
        TIM15 -> CCR1 = (TIM15->ARR + 1) * param.PWM_Duty_PA9 / 100;
        HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1);
        HAL_TIMEx_PWMN_Start(&htim15, TIM_CHANNEL_1);
    }
}

control.h

#ifndef __CONTROL_H
#define __CONTROL_H

#include "stm32g4xx_hal.h"
#include "string.h"
#include "stdio.h"
#include "stdbool.h"

#include "hardware.h"
#include "i2c_hal.h"
#include "tim.h"
#include "adc.h"
#include "lcd.h"

//-----------------------
void power_init(void);
void LCD_Disp(void);
void Key_Proc(void);
void ADC_Proc(void);
void PWM_Proc(void);

//-----------------------
struct Tick{
    uint32_t lcd;
    uint32_t key;
    uint32_t adc;
    uint32_t pwm;
    
};
extern struct Tick tick;

struct Flag{
    bool PWM_Mode;
    uint8_t LCD_View;
    
};
extern struct Flag flag;

struct Param{
    double ADC;
    
    uint16_t PWM_Frq;       //频率
    uint8_t  PWM_Duty_PA9;
    uint8_t  PWM_Duty_PA14;
    
};
extern struct Param param;
//-----------------------

#endif

main.c 

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

#include "control.h"

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM6_Init();
  MX_ADC2_Init();
  MX_TIM15_Init();
  /* USER CODE BEGIN 2 */

    LCD_Init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
    
    power_init();

    while (1)
    {
        Key_Proc();
        LCD_Disp();
        ADC_Proc();
        PWM_Proc();
        
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    }
  /* USER CODE END 3 */
}

完结,第六届国赛比较简单,只有PWM互补输出是没有写过的

后续会更新其他届的赛题,同步源码到我的Gitee~

波形展示:具体见B站演示视频

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java基于saas模式云MES制造执行系统源码Spring Boot + Hibernate Validation什么是MES系统?

Java基于saas模式云MES制造执行系统源码Spring Boot Hibernate Validation 什么是MES系统&#xff1f; MES制造执行系统&#xff0c;通过互联网技术实现从订单下达到产品完成的整个生产过程进行优化管理。能有效地对生产现场的流程进行智能控制&#xff0c;防错防呆防漏&…

docker占用磁盘空间大小排查

首先进入到 /var/lib/docker/overlay2 目录下,查看谁占用的较多 cd /var/lib/docker/overlay2/du -s ./* | sort -rn | more再通过目录名查找容器名 docker ps -q | xargs docker inspect --format {{.State.Pid}}, {{.Id}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}} | gre…

【4.vi编辑器使用(下)】

一、vi编辑器的光标移动 二、vi编辑器查找命令 1、命令&#xff1a;:/string 查找字符串 n&#xff1a;继续查找 N&#xff1a;反向继续查找 /^the 查找以the开头的行 /end 查找以 查找以 查找以结尾的行 三、vi编辑器替换命令 1、语法: : s[范围,范围]str1/str2[g] g表示全…

如何在.NET中集成SignalR

SignalR 简介 SignalR是一个开放源代码库&#xff0c;可用于简化向应用添加实时Web功能&#xff0c;实时Web功能使服务器端代码能够将内容推送到客户端。 SignalR开源库&#xff1a;https://github.com/SignalR/SignalR SignalR 应用场景 需要高频次从服务器获取信息的应用&am…

Hack The Box-MagicGardens

总体思路 SMTP用户爆破->5000端口Docker注册表爆破->敏感数据泄露->Firefox远程调试LFI 信息收集&端口利用 nmap -sSVC 10.10.11.9目标开放了22、25、80、5000端口&#xff0c;先看80端口是否存在利用点 目录扫描结果大部分都是302跳转到admin界面&#xff0c;…

2.1色彩空间

色彩发送器 色彩认知 光源是出生点&#xff0c;光源发射出光线&#xff0c;光线通过直射反射折射等路径最终进入人眼。 但人眼接收到光线后&#xff0c;人眼的细胞产生了一系列化学反应。 由此把产生的信号传入大脑&#xff0c;最终大脑对颜色产生了认知感知。 光的要素 光…

基于STM32单片机老人体温心率血氧跌倒定位短信报警

一.硬件及设计功能 以STM32F103C8T6为中央处理器&#xff0c;GPS模块用采集数据&#xff0c;将数据发送给单片机后&#xff0c;单片机根据定位计算公式得出当前位置的经纬度信息和时间信息。经过LCD显示器处理后得出和时间信息SIM800模块发送短信到设定的手机号上&#xff0c;将…

安卓开发板_开发评估套件_4G/5G联发科MTK安卓主板定制开发

安卓开发板采用了联发科八核A53 CPU&#xff0c;主频2.0GHz&#xff0c;采用12nm制程工艺&#xff0c;拥有强大的通用计算性能。配备GE8300 GPU&#xff0c;支持1080P视频编码和H.264硬解码&#xff0c;能够解析目前流行的视频和图片格式&#xff0c;非常适合各种功能APP的测试…

社交变革:探索Facebook如何塑造我们的日常生活

在数字化时代的潮流中&#xff0c;社交媒体已经成为了我们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中的佼佼者&#xff0c;无疑扮演着至关重要的角色。本文将深入探讨Facebook在社交变革中所发挥的作用&#xff0c;以及它如何塑造着我们的日常生活。 1. 社交网…

最新上市公司控制变量大全(1413+指标)1990-2023年

数据介绍&#xff1a;根据2023年上市公司年报数据进行更新&#xff0c;包括基本信息、财务指标、环境、社会与治理、数字化转型、企业发展、全要素生产率等1413指标。数据范围&#xff1a;A股上市公司数据年份&#xff1a;1990-2023年指标数目&#xff1a;1413个指标&#xff0…

第五天 从零开始构建基于Kubernetes的DevOps平台

基于Kubernetes的DevOps平台实践 持续集成工具&#xff1a; JenkinsgitlabciTekton 本章基于k8s集群部署gitlab、sonarQube、Jenkins等工具&#xff0c;并把上述工具集成到Jenkins中&#xff0c;以Django项目和SpringBoot项目为例&#xff0c;通过多分支流水线及Jenkinsfile…

拥塞控制的微观行为与力学解释

本文以 tcptrace 图为基&#xff0c;描述传输的微观行为&#xff0c;并给出一个初中几何描述的压水井模型。 统计复用网络的拥塞控制&#xff0c;宏观看 inflight&#xff0c;微观看 pacing rate&#xff0c;宏观大方向不对&#xff0c;微观再正确也不行。 而网络的统计动力学…

Iphone自动化指令每隔固定天数打开闹钟关闭闹钟(二)

1.首先在搜索和操作里搜索“查找日期日程" 1.1.然后过滤条件开始日期选择”是今天“ 1.2.增加过滤条件&#xff0c;日历是这里选择”工作“ 1.3.增加过滤条件&#xff0c;选择标题&#xff0c;是这里选择”workDay“ 1.4选中限制&#xff0c;日历日程只要一个&#xff0c;…

5.4 Go 匿名函数与闭包

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

数据结构(一)顺序表

目录 一、概念&#xff08;一&#xff09;数据结构的三元素1. 逻辑结构&#xff08;1&#xff09;线性结构&#xff08;2&#xff09;非线性结构 2. 存储结构&#xff08;1&#xff09;顺序存储&#xff08;2&#xff09;链式存储&#xff08;3&#xff09;索引存储 3. 运算 &a…

11.RedHat认证-Linux文件系统(中)

11.RedHat认证-Linux文件系统(中) Linux的文件系统 格式化分区(1道题) #对于Linux分区来说&#xff0c;只有格式化之后才能使用&#xff0c;不格式化是无法使用的。 #Linux分区格式化之后就会变成文件系统&#xff0c;格式化的过程相当于对分区做了一个文件系统。 #Linux常见…

一个月速刷leetcodeHOT100 day13 二叉树结构 以及相关简单题

树是一种分层数据的抽象模型 二叉树 二叉树中的节点最多只能有两个子节点&#xff0c;一个是左侧子节点&#xff0c;另一个是右侧子节点 二叉搜索树 二叉搜索树&#xff08;BST&#xff09;是二叉树的一种&#xff0c;但是只允许你在左侧节点存储&#xff08;比父节点&…

LVM、磁盘配额

LVM与磁盘配额 一、LVM LVM(逻辑卷管理)&#xff1a;是Linux系统下对硬盘分区的管理机制。 LVM机制适合于管理管理大存储设备。可以动态对硬盘进行扩容。 逻辑上的磁盘&#xff0c;概念上的磁盘&#xff0c;文件系统创建之后不考虑底层的物理磁盘。 若干个磁盘分区或者物理…

51 html网页

上节内容的网页是hello world的字符串&#xff0c;但实际上网页应该是html格式的这种超文本标记语言&#xff0c;这一节完善一下网页的各种格式和内容 分文件 实际服务器中&#xff0c;网页的界面应该单独放一个文件&#xff0c;服务器从文件里读取网页的内容 先创建一个wroo…

PLC集成BL121PO网关优化智能电网的远程管理PLC转OPC UA协议

随着工业自动化技术的不断发展&#xff0c;智能电网等复杂系统对于设备之间高效通信的需求日益增加。PLC转OPC UA协议转换网关BL121PO作为一款领先的协议转换设备&#xff0c;通过其独特的设计和功能&#xff0c;为用户提供了高效、安全的PLC接入OPC UA的解决方案。 设备概述 …