STM32G0xx使用LL库将Flash页分块方式存储数据实现一次擦除可多次写入

STM32G0xx使用LL库将Flash页分块方式存储数据实现一次擦除可多次写入

  • 参考例程
  • 例程说明
  • 一、存储到Flash中的数据
  • 二、Flash最底层操作(解锁,加锁,擦除,读写)
  • 三、从Flash块中读取数据
  • 五、测试验证

参考例程

STM32G0xx HAL和LL库Flash读写擦除操作
STM32G030Cx HAL库Flash擦除或编程操作出错的解决办法

例程说明

1.Flash存储数据采用页分块方式,实现一次擦除多次写入,每块128Byte总共16块,当存满16块后擦除一次
2.将数据写入Flash前,需要前后对比数据,只有数据发生变化才能写入Flash中
3.从Flash读取数据后,进行CRC校验,校验不通过往前继续读取数据,然后重新校验数据
4.将数据写如Flash前需要确保改块都是0xFF,保证写入数据成功

一、存储到Flash中的数据

说明:

  1. Header用来标识存储的头部信息,在Flash读取或写入时用到
  2. ubRes用来作块对齐使用,默认进行128Byte对齐


#define FLASH_STORE_PARM_HEADER_TAG      (0x6C5A)                                             //固定头信息
#define FLASH_STORE_PARM_BLOCK_SIZE      (128)                                                //块大小
#define FLASH_STORE_PARM_BLOCK_COUNT     (u16)(FLASH_PAGE_SIZE / FLASH_STORE_PARM_BLOCK_SIZE) //1页分块的数量

#pragma pack(1)
typedef struct
{
    ............
    ............
}GlobalParamStore, * GlobalParamStore_t;

typedef struct
{
    ............
    ............
}DemarParamStore, * DemarParamStore_t, * pDemarParamStore;

typedef struct
{
    ............
    ............
}ExceptionTrace;

typedef struct
{
    ............
    ............
}ExtraLibPara;

typedef struct
{
    u16 HeaderTag;
    u16 StoreIndex;
}FlashStoreHeader, * FlashStoreHeader_t;

typedef struct
{
    FlashStoreHeader  Header;
    GlobalParamStore  SysPar;
    DemarParamStore   DemarPar;
    ExceptionTrace    ExpTrace;
    ExtraLibPara      ExtLibPar;

    u8 ubRes[16];
    u8 ubCRC8; 
}SystemParamStore, * SystemParamStore_t;
#pragma pack()

二、Flash最底层操作(解锁,加锁,擦除,读写)

说明:

  1. XSUPER_STM32G0_LL_LIB_ENABLE 被使能使用LL库
  2. Flash相关操作失败可多次尝试,尽可能让操作成功


#define FLASH_OPT_OVERTIMER         										(0x1FFFF)
#define FLASH_OPT_TRY_COUNT         										(5)


/* Unlock the FLASH control register access */
static u8 ubFLASH_Unlock(void)
{
    u8 sta = 0;

    if (READ_BIT(FLASH->CR, FLASH_CR_LOCK) != 0x00U)
    {
        /* Authorize the FLASH Registers access */
        WRITE_REG(FLASH->KEYR, FLASH_KEY1);
        WRITE_REG(FLASH->KEYR, FLASH_KEY2);

        /* verify Flash is unlock */
        if (READ_BIT(FLASH->CR, FLASH_CR_LOCK) != 0x00U)
        {
            sta = 1;
        }
    }

    return sta;	
}


/* Lock the FLASH control register access */
static u8 ubFLASH_Lock(void)
{
    u8 sta = 1;

    /* Set the LOCK Bit to lock the FLASH Registers access */
    SET_BIT(FLASH->CR, FLASH_CR_LOCK);

    /* verify Flash is locked */
    if (READ_BIT(FLASH->CR, FLASH_CR_LOCK) != 0x00u)
    {
        sta = 0;
    }

    return sta;
}


/* Gets the page of a given address */
static u32 ulGetPage(u32 startAddr)
{
    return ((startAddr - FLASH_BASE) / FLASH_PAGE_SIZE);
}


/* Erase the specified FLASH memory page */
static u8 ubFLASH_PageErase(u32 page)
{
    u32 tmp  = 0;
    u32 time = 0;
    u8  res  = 0;

    /* Get configuration register, then clear page number */
    tmp = (FLASH->CR & ~FLASH_CR_PNB);

    /* Set page number, Page Erase bit & Start bit */
    FLASH->CR = (tmp | (FLASH_CR_STRT | (page <<  FLASH_CR_PNB_Pos) | FLASH_CR_PER));

    /* wait for BSY1 in order to be sure that flash operation is ended before allowing prefetch in flash */
    while ((FLASH->SR & FLASH_SR_BSY1) != 0x00U)
    {
        if ((++time) > FLASH_OPT_OVERTIMER)
        {
            res = 1;
            break;
        }
    }

    /* If operation is completed or interrupted, disable the Page Erase Bit */
    CLEAR_BIT(FLASH->CR, FLASH_CR_PER);

    return res;
}


/* Program double-word (64-bit) at a specified address */
/* Must EN PG bit before and DIS PG bit after */
static u8 ubFLASH_Program_DoubleWord(u32 addr, u64 data)
{
    u32 time = 0;

	
    /* Wait for last operation to be completed */
    while ((FLASH->SR & FLASH_SR_BSY1) != 0x00U)
    {
        if ((++time) > FLASH_OPT_OVERTIMER)
        {
            return 1;
        }
    }
	
	/* Set PG bit */
	SET_BIT(FLASH->CR, FLASH_CR_PG);

    /* Program first word */
    *(u32 *)addr = (u32)data;

    /* Barrier to ensure programming is performed in 2 steps, in right order
    (independently of compiler optimization behavior) */
    __ISB();

    /* Program second word */
    *(u32 *)(addr + 4U) = (u32)(data >> 32U);

    /* Wait for last operation to be completed */
    while ((FLASH->SR & FLASH_SR_BSY1) != 0x00U)
    {
        if ((++time) > FLASH_OPT_OVERTIMER)
        {
            return 2;
        }
    }

    return 0;
}


/* Wait for a FLASH operation to complete */
static u8 ubFlash_WaitFor_Operate(u32 timeOut)
{
    u32 timer = 0;
    u32 error = 0;

    while ((FLASH->SR & FLASH_SR_BSY1) != 0x00U)
    {
        if ((++timer) >= timeOut)
        {
            return 1;
        }
    }

#if ( XSUPER_STM32G0_LL_LIB_ENABLE > 0)
    /* check flash errors */
    error = (FLASH->SR & FLASH_FLAG_SR_ERROR);

    /* Clear SR register */
    FLASH->SR = FLASH_FLAG_SR_CLEAR;
#endif
    

#if ( XSUPER_STM32G0_HAL_LIB_ENABLE > 0)
    /* check flash errors */
    error = (FLASH->SR & FLASH_SR_ERRORS);

    /* Clear SR register */
    FLASH->SR = FLASH_SR_CLEAR;
#endif

    
    if (error != 0x00U)
    {
        return 2;
    }

    timer = 0;
    while ((FLASH->SR & FLASH_SR_CFGBSY) != 0x00U)
    {
        if ((++timer) > timeOut)
        {
            return 3;
        }
    }

    return 0;
}


/* Read double-word (64-bit) at a specified address */
void vFlash_Read_DoubleWord(u32 startAddr, u64 * pDat, u16 len)
{
    u16 i = 0;

    for(i = 0; i < len; ++i)
    {
        *pDat++ = *(volatile u64 *)(startAddr + (i << 3));
    }
}






static u8 xSuper_Flash_Unlock(void)
{
    u8 tryCount = 0;



    for (tryCount = 0; tryCount < FLASH_OPT_TRY_COUNT; ++tryCount)
    {
        if (!ubFLASH_Unlock()) return 0;
        ubFlash_WaitFor_Operate(FLASH_OPT_OVERTIMER);
    }

    return 1;
}

static u8 xSuper_Flash_Lock(void)
{
    u8 tryCount = 0;

    for (tryCount = 0; tryCount < FLASH_OPT_TRY_COUNT; ++tryCount)
    {
        if (!ubFLASH_Lock()) return 0;
        ubFlash_WaitFor_Operate(FLASH_OPT_OVERTIMER);
    }

    return 1;
}

static u8 xSuper_Flash_EreasePage(u32 startAddr)
{
    u8 tryCount = 0;
    u32 page = ulGetPage(startAddr);

    for (tryCount = 0; tryCount < FLASH_OPT_TRY_COUNT; ++tryCount)
    {
        if (!ubFLASH_PageErase(page)) return 0;
        ubFlash_WaitFor_Operate(FLASH_OPT_OVERTIMER);
    }

    return 1;
}

static u8 xSuper_Flash_Program(u32 startAddr, u64 * pDat, u16 len)
{
    u64 rData = 0;
    u16 i = 0;
    u8 tryCount = 0;

    for (i = 0; i < len; ++i)
    {
        for (tryCount = 0; tryCount < FLASH_OPT_TRY_COUNT; ++tryCount)
        {
            if(!ubFLASH_Program_DoubleWord(startAddr , pDat[i]))
            {
                rData = *(volatile u64 *)(startAddr);
                if (rData != pDat[i])
                {
                    return 1;
                }
                else
                {
                    startAddr += 8;
                    tryCount = 0;
                    break;
                }
            }
            else
            {
                ubFlash_WaitFor_Operate(FLASH_OPT_OVERTIMER);
            }
        }

        if (tryCount) return 2;
    }

    return 0;
}

u8 ubFlash_Write_DoubleWord_EreasePage(u32 startAddr, u64 * pDat, u16 len, u8 mode)
{
    //避免HardFault,三级流水线
    __asm volatile("NOP"); __asm volatile("NOP"); __asm volatile("NOP");
    __DMB(); __DSB(); __ISB();
    __asm volatile("NOP"); __asm volatile("NOP"); __asm volatile("NOP");

    if (xSuper_Flash_Unlock())
    {
        #if defined(DEBUG_RELEASE_VERSION_ENABLE) && (DEBUG_RELEASE_VERSION_ENABLE == 0)
        dprintf("Flash Unlock Error...\r\n");
        #endif

        return 1;
    }

    if (mode)
    {
        if (xSuper_Flash_EreasePage(startAddr))
        {
            xSuper_Flash_Lock();
            #if defined(DEBUG_RELEASE_VERSION_ENABLE) && (DEBUG_RELEASE_VERSION_ENABLE == 0)
            dprintf("Flash Erease Error...\r\n");
            #endif

            return 2;
        }

        #if defined(DEBUG_RELEASE_VERSION_ENABLE) && (DEBUG_RELEASE_VERSION_ENABLE == 0)
        dprintf("Flash Erease OK...\r\n");
        #endif
    }
    
    if (xSuper_Flash_Program(startAddr, pDat, len))
    {
        xSuper_Flash_Lock();
        #if defined(DEBUG_RELEASE_VERSION_ENABLE) && (DEBUG_RELEASE_VERSION_ENABLE == 0)
        dprintf("Flash Program Error...\r\n");
        #endif

        return 3;
    }

    if (xSuper_Flash_Lock())
    {
        #if defined(DEBUG_RELEASE_VERSION_ENABLE) && (DEBUG_RELEASE_VERSION_ENABLE == 0)
        dprintf("Flash Lock Error...\r\n");
        #endif

        return 4;
    }

    return 0;
}


三、从Flash块中读取数据

  1. vRead_System_Parameter开始打印每个结构体大小,便于调试对齐使用

t/30e0161f1a734f6b96899354ad4e0cd4.png)


/* 获取读Flash块索引 */
static u16 usGet_Flash_Read_Index(void)
{
    u16 dat = 0, i = 0;
    u8  crc = 0;

    for (i = 0; i < FLASH_STORE_PARM_BLOCK_COUNT; ++i)
    {
        dat = *(volatile u16 *)(SYSTEM_ARG_STORE_START_ADDRE + (FLASH_STORE_PARM_BLOCK_SIZE * (FLASH_STORE_PARM_BLOCK_COUNT - 1 - i)));
        if (dat == FLASH_STORE_PARM_HEADER_TAG) 
        {
            crc = ubCheckSum_CRC8((void *)(SYSTEM_ARG_STORE_START_ADDRE + (FLASH_STORE_PARM_BLOCK_SIZE * (FLASH_STORE_PARM_BLOCK_COUNT - 1 - i))), XOFS(SystemParamStore , ubCRC8));
            dat = *(volatile u8 *)(SYSTEM_ARG_STORE_START_ADDRE + (FLASH_STORE_PARM_BLOCK_SIZE * (FLASH_STORE_PARM_BLOCK_COUNT - 1 - i)) + (FLASH_STORE_PARM_BLOCK_SIZE - 1));
            if (dat == crc)
            {
                return (FLASH_STORE_PARM_BLOCK_COUNT - 1 - i);
            }
        }
    }

    return FLASH_STORE_PARM_BLOCK_COUNT;
}


static void vRead_GlobalSystem_Parameter(void)
{
    u16 index = usGet_Flash_Read_Index();

    if (index < FLASH_STORE_PARM_BLOCK_COUNT)
    {
        /* 读取块内容 */
        vFlash_Read_DoubleWord(SYSTEM_ARG_STORE_START_ADDRE + (FLASH_STORE_PARM_BLOCK_SIZE * index), (u64 *)&SystemParam, (FLASH_STORE_PARM_BLOCK_SIZE >> 3));
        #if defined(DEBUG_RELEASE_VERSION_ENABLE) && (DEBUG_RELEASE_VERSION_ENABLE == 0)
        dprintf("Read Param OK...%u\r\n", SystemParam.Header.StoreIndex);
        #endif
    }
    else
    {
        /* 块索引无效 恢复默认值 */
        vRestoreDefault_GlobalSystemParam();
        #if defined(DEBUG_RELEASE_VERSION_ENABLE) && (DEBUG_RELEASE_VERSION_ENABLE == 0)
        dprintf("Restore Param...%u\r\n", SystemParam.Header.StoreIndex);
        #endif
    }

    /* 打印块数据 */
    #if defined(DEBUG_RELEASE_VERSION_ENABLE) && (DEBUG_RELEASE_VERSION_ENABLE == 0)
    dprintf("\r\n");
    dprintf("            00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  \r\n");
    dprintf("-------------------------------------------------------------\r\n");
    for (index = 0; index < FLASH_STORE_PARM_BLOCK_SIZE; ++index)
    {
        if (index && (index % 16 == 0)) dprintf("\r\n");
        if (index % 16 == 0) dprintf("0x%08X  ", (SYSTEM_ARG_STORE_START_ADDRE + (FLASH_STORE_PARM_BLOCK_SIZE * SystemParam.Header.StoreIndex) + index));
        dprintf("%02X ", *(volatile u8 *)(SYSTEM_ARG_STORE_START_ADDRE + (FLASH_STORE_PARM_BLOCK_SIZE * SystemParam.Header.StoreIndex) + index));
    }
    dprintf("\r\n\r\n");
    #endif
}



void vRead_System_Parameter(void)
{
    #if defined(DEBUG_RELEASE_VERSION_ENABLE) && (DEBUG_RELEASE_VERSION_ENABLE == 0)
    dprintf("Header Size   :%u\r\n", sizeof(FlashStoreHeader));
    dprintf("SysPar Size   :%u\r\n", sizeof(GlobalParamStore));
    dprintf("DemarPar Size :%u\r\n", sizeof(DemarParamStore));
    dprintf("ExpTrace Size :%u\r\n", sizeof(ExceptionTrace));
    dprintf("ExtLibPar Size:%u\r\n", sizeof(ExtraLibPara));
    dprintf("SystemParamStore Size......%u\r\n", sizeof(SystemParamStore));
    if (sizeof(SystemParamStore) != FLASH_STORE_PARM_BLOCK_SIZE) while (1);
    #endif

    vRead_GlobalSystem_Parameter();
}

四、将数据写入Flash块中


static u16 usGet_Flash_Write_Index(void)
{
    u16 dat = 0, i = 0, x = 0;
    u8 uFlg = 0;

    for (i = 0; i < FLASH_STORE_PARM_BLOCK_COUNT; ++i)
    {
        dat = *(volatile u16 *)(SYSTEM_ARG_STORE_START_ADDRE + (FLASH_STORE_PARM_BLOCK_SIZE * i));
        if (dat == 0xFFFFU)
        {
            uFlg = 0;
            for (x = 0; x < FLASH_STORE_PARM_BLOCK_SIZE; ++x)
            {
                dat = *(volatile u8 *)(SYSTEM_ARG_STORE_START_ADDRE + (FLASH_STORE_PARM_BLOCK_SIZE * i) + x);
                if (dat != 0xFFU)
                {
                    uFlg = 1;
                    break;
                }
            }

            if (!uFlg) 
            {
                return i;
            }
        }
    }

    return FLASH_STORE_PARM_BLOCK_COUNT;
}

static void vSave_GlobalSystem_Parameter(void)
{
    u8 * pSrc = (u8 *)&SystemParam;
    u8   mode = 0, dat = 0;
    u16  index = 0;

    for (index = 0; index < FLASH_STORE_PARM_BLOCK_SIZE; ++index)
    {
        dat = *(volatile u8 *)(SYSTEM_ARG_STORE_START_ADDRE + (FLASH_STORE_PARM_BLOCK_SIZE * SystemParam.Header.StoreIndex) + index);
        if (dat != *pSrc++)
        {
            mode = 1;
            break;
        }
    }

    if (!mode)
    {
        #if defined(DEBUG_RELEASE_VERSION_ENABLE) && (DEBUG_RELEASE_VERSION_ENABLE == 0)
        dprintf("Flash Pram Same...%u\r\n", SystemParam.Header.StoreIndex);
        #endif

        return;
    }

    mode  = 0;
    index = usGet_Flash_Write_Index();
    if (index < FLASH_STORE_PARM_BLOCK_COUNT)
    {
        SystemParam.Header.StoreIndex = index;
    }
    else
    {
        SystemParam.Header.StoreIndex = 0;
        mode = 1;
    }

    SystemParam.ubCRC8 = ubCheckSum_CRC8((void *)(&SystemParam), XOFS(SystemParamStore , ubCRC8));
    if (ubFlash_Write_DoubleWord_EreasePage((SYSTEM_ARG_STORE_START_ADDRE + (FLASH_STORE_PARM_BLOCK_SIZE * SystemParam.Header.StoreIndex)), (u64 *)&SystemParam, (FLASH_STORE_PARM_BLOCK_SIZE >> 3), mode))
    {
        #if defined(DEBUG_RELEASE_VERSION_ENABLE) && (DEBUG_RELEASE_VERSION_ENABLE == 0)
        dprintf("Flash Write Error...%u\r\n", SystemParam.Header.StoreIndex);
        #endif
    }
    else
    {
        #if defined(DEBUG_RELEASE_VERSION_ENABLE) && (DEBUG_RELEASE_VERSION_ENABLE == 0)
        dprintf("Flash Write OK...%u  CRC:%02X\r\n", SystemParam.Header.StoreIndex, SystemParam.ubCRC8);
        #endif
    }
}


void vSave_System_Parameter(void)
{
    vSave_GlobalSystem_Parameter();
}

五、测试验证

只需调用一下函数即可:

从Flash块中读取数据
void vSave_System_Parameter(void)

将数据写入Flash块中
void vRead_System_Parameter(void)


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Spark SQL大数据分析快速上手-DataFrame应用体验

【图书介绍】《Spark SQL大数据分析快速上手》-CSDN博客 《Spark SQL大数据分析快速上手》【摘要 书评 试读】- 京东图书 大数据与数据分析_夏天又到了的博客-CSDN博客 本节主要介绍如何使用DataFrame进行编程。 4.1.1 SparkSession 在旧版本中&#xff0c;Spark SQL提供…

QT信号和槽与自定义的信号和槽

QT信号和槽与自定义的信号和槽 1.概述 这篇文章介绍下QT信号和槽的入门知识&#xff0c;通过一个案例介绍如何创建信号和槽&#xff0c;并调用他们。 2.信号和槽使用 下面通过点击按钮关闭窗口的案例介绍如何使用信号和槽。 创建按钮 在widget.cpp文件中创建按钮代码如下 …

YOLO11改进 | 融合改进 | C3k2融合 Context Anchor Attention 【两个版本融合-独家创新】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 本文给大家带来的教程是将YOLO11的C3k2替…

机械制造工控自动化监控界面:功能与美观兼具

机械制造工控自动化监控界面需做到功能与美观兼具。在功能方面&#xff0c;清晰展示设备运行状态、参数指标等关键信息&#xff0c;提供实时监控和预警功能&#xff0c;确保生产安全高效。 界面布局应合理&#xff0c;操作简便&#xff0c;便于工作人员快速掌握和操作。而在美…

SpringBoot项目集成ONLYOFFICE

ONLYOFFICE 文档8.2版本已发布&#xff1a;PDF 协作编辑、改进界面、性能优化、表格中的 RTL 支持等更新 文章目录 前言ONLYOFFICE 产品简介功能与特点Spring Boot 项目中集成 OnlyOffice1. 环境准备2. 部署OnlyOffice Document Server3. 配置Spring Boot项目4. 实现文档编辑功…

explain执行计划分析 ref_

这里写目录标题 什么是ExplainExplain命令扩展explain extendedexplain partitions 两点重要提示本文示例使用的数据库表Explain命令(关键字)explain简单示例explain结果列说明【id列】【select_type列】【table列】【type列】 【possible_keys列】【key列】【key_len列】【ref…

AIDOVECL数据集:包含超过15000张AI生成的车辆图像数据集,目的解决旨在解决眼水平分类和定位问题。

2024-11-01&#xff0c;由伊利诺伊大学厄巴纳-香槟分校的研究团队创建的AIDOVECL数据集&#xff0c;通过AI生成的车辆图像&#xff0c;显著减少了手动标注工作&#xff0c;为自动驾驶、城市规划和环境监测等领域提供了丰富的眼水平车辆图像资源。 数据集地址&#xff1a;AIDOV…

24/11/7 算法笔记 PCA主成分分析

假如我们的数据集是n维的&#xff0c;共有m个数据(x,x,...,x)。我们希望将这m个数据的维度从n维降到k维&#xff0c;希望这m个k维的数据集尽可能的代表原始数据集。我们知道数据从n维降到k维肯定会有损失&#xff0c;但是我们希望损失尽可能的小。那么如何让这k维的数据尽可能表…

2-142【软件无线电原理与应用作业】基于matlab的圆形阵列的波束形成进行仿真

【软件无线电原理与应用作业】基于matlab的圆形阵列的波束形成进行仿真&#xff0c;具有14页文档。假设发射信号载频为1GHz&#xff0c;圆形阵列半径为0.8米&#xff0c;在圆周上均匀布置30个阵元。1.画出指向0度的方向图。2.如果目标在0度&#xff0c;有一不相干的干扰信号在3…

<项目代码>YOLOv8 苹果腐烂识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

python练习相关代码

一元二次方程的求根公式为&#xff1a; import mathdef quadratic(a, b, c):discriminant b**2 - 4*a*cif discriminant < 0:return Noneelif discriminant 0:return [-b / (2*a)]else:root1 (-b math.sqrt(discriminant)) / (2*a)root2 (-b - math.sqrt(discriminant)…

2024软件测试面试热点问题

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 大厂面试热点问题 1、测试人员需要何时参加需求分析&#xff1f; 如果条件循序 原则上来说 是越早介入需求分析越好 因为测试人员对需求理解越深刻 对测试工…

windows、linux安装jmeter及设置中文显示

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之取样器 windows、linux安装jmeter及设置中文显示 前言一、jdk安装1.windows安装jdk1.1.复制环境变量快捷跳转 2.linux安装jdk 二、下载安装jmet…

各种数据库介绍

1. 关系型数据库&#xff08;RDBMS&#xff09; MySQL • 特点&#xff1a;开源、免费&#xff0c;社区版功能强大且稳定。支持大量的并发连接&#xff0c;常用于Web应用。 • 适用场景&#xff1a;中小型网站、博客、电商等。 PostgreSQL • 特点&#xff1a;功能丰富&#xf…

【linux】查看不同网络命名空间的端口

在部署harbor时&#xff0c;内部用的是数据库postgresql&#xff0c;端口默认是: 5432&#xff0c;一开始以为这个数据库docker容器是在本命名空间中&#xff0c;一直用ss -lnt查询系统的端口&#xff0c;找不到5432端口。但是harbor要能正常使用&#xff0c;所有怀疑harbor的容…

使用ffmpeg和mediamtx模拟多通道rtsp相机

首先下载ffmpeg&#xff0c;在windows系统上直接下载可执行文件&#xff0c;并配置环境变量即可在命令行当中调用执行。 下载地址&#xff1a; https://ffmpeg.org/再在github上下载mediamtx搭建rtsp服务器&#xff0c;使用ffmpeg将码流推流到rtsp服务器。 下载地址&#xff1…

大数据分库分表方案

分库分表介绍 分库分表应用场景 分库分表介绍 大数据分库分表是一种数据库架构技术&#xff0c;旨在应对大数据量场景下的数据库性能瓶颈。以下是对大数据分库分表的详细解释&#xff1a; 一、定义与背景 定义&#xff1a; 分库&#xff1a;将一个大型数据库按照一定的规则…

关于word 页眉页脚的一些小问题

去掉页眉底纹&#xff1a; 对文档的段落边框和底纹进行设置&#xff0c;也是页眉横线怎么删除的一种解决方式&#xff0c;具体操作如下&#xff1a; 选中页眉中的横线文本&#xff1b; 点击【开始】选项卡&#xff0c;在【段落】组中点击【边框】按钮的下拉箭头&#xff1b; …

爬虫-------字体反爬

目录 一、了解什么是字体加密 二. 定位字体位置 三. python处理字体 1. 工具库 2. 字体读取 3. 处理字体 案例1:起点 案例2:字符偏移: 5请求数据 - 发现偏移量 5.4 多套字体替换 套用模板 版本1 版本2 四.项目实战 1. 采集目标 2. 逆向结果 一、了解什么是…

Fortran安装(vscode+gcc+Python)

编写时间&#xff1a; 2024年11月7日 环境配置&#xff1a; gcc VScode Python 条件&#xff1a; Windows 10 x64 VMware虚拟机 前言 这是我出的第2个关于Fortran安装的教程&#xff0c;由于上一个方法&#xff08;你可以在本专栏里找到&#xff09;对储存空间的要求比较…