FreeRTOS移植到STM32F103C8T6(HAL库)

目录

一、将STM32F103ZET6代码变更成STM32F103C8T6

二、 将FreeRTOS码源添加到文件

三、代码更改适配

四、测试 


一、将STM32F103ZET6代码变更成STM32F103C8T6

点击魔法棒,点击Device,选择芯片为STM32F103C8T6

 进行编译,无报错无警告:

二、 将FreeRTOS码源添加到文件

先进入官网获取FreeRTOS码源:https://www.freertos.org/a00110.html

将获取到的源码中的FreeRTOS/Source文件夹移植到工程文件中的Middlewares下

 点击文件拓展工具,添加Middlewares/FreeRTOS_CODE与Middlewares/FreeRTOS_PORT两个组

将相关代码添加到这两个新建组中 

 

引入相关头文件地址 

将 FreeRTOSConfig.h添加到User中

三、代码更改适配

sys.h文件

将宏SYS_SUPPORT_OS定义为1

#define SYS_SUPPORT_OS  1 

usart.c文件

USART_UX_IRQHandler适配更改:

void USART_UX_IRQHandler(void) 
{ 
    HAL_UART_IRQHandler(&g_uart1_handle);   /* 调用HAL库中断处理公用函数 */ 
     
    while (HAL_UART_Receive_IT( &g_uart1_handle, 
            (uint8_t *)g_rx_buffer, 
            RXBUFFERSIZE) != HAL_OK)/* 重新开启中断并接收数据 */ 
    { 
      /* 如果出错会卡死在这里 */ 
    } 
} 

删除无关头文件

/* 如果使用os,则包括下面的头文件即可. */ 
#if SYS_SUPPORT_OS 
#include "includes.h"  /* os 使用 */ 
#endif 

delay.c文件

将如下代码删除

static uint16_t g_fac_ms = 0; 
#ifdef  OS_CRITICAL_METHOD
#define delay_osrunning OSRunning   /* OS是否运行标记,0,不运行;1,在运行 */ 
#define delay_ostickspersec OS_TICKS_PER_SEC /* OS时钟节拍,即每秒调度次数 */ 
#define delay_osintnesting OSIntNesting  /* 中断嵌套级别,即中断嵌套次数 */ 
#endif
#ifdef  CPU_CFG_CRITICAL_METHOD
#define delay_osrunning OSRunning   /* OS是否运行标记,0,不运行;1,在运行 */ 
#define delay_ostickspersec OSCfg_TickRate_Hz /* OS时钟节拍,即每秒调度次数 */ 
#define delay_osintnesting OSIntNestingCtr  /* 中断嵌套级别,即中断嵌套次数 */ 
#endif 
static void delay_osschedlock(void) 
{ 
#ifdef CPU_CFG_CRITICAL_METHOD /* 使用UCOSIII */ 
    OS_ERR err; 
    OSSchedLock(&err);   /* UCOSIII的方式,禁止调度,防止打断us延时 */ 
#else       /* 否则UCOSII */ 
    OSSchedLock();    /* UCOSII的方式,禁止调度,防止打断us延时 */ 
#endif 
}
static void delay_osschedunlock(void) 
{ 
#ifdef CPU_CFG_CRITICAL_METHOD /* 使用UCOSIII */ 
    OS_ERR err; 
    OSSchedUnlock(&err);  /* UCOSIII的方式,恢复调度 */ 
#else       /* 否则UCOSII */ 
    OSSchedUnlock();    /* UCOSII的方式,恢复调度 */ 
#endif 
} 
static void delay_ostimedly(uint32_t ticks) 
{ 
#ifdef CPU_CFG_CRITICAL_METHOD 
    OS_ERR err; 
    OSTimeDly(ticks, OS_OPT_TIME_PERIODIC, &err); /* UCOSIII延时采用周期模式 */ 
#else 
    OSTimeDly(ticks);        /* UCOSII延时 */ 
#endif 
} 

将代码添加到 SysTick中断服务函数之前

extern void xPortSysTickHandler(void); 

修改SysTick_Handler()

void SysTick_Handler(void) 
{ 
    HAL_IncTick(); 
    /* OS开始跑了,才执行正常的调度处理 */ 
    if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) 
    { 
        xPortSysTickHandler(); 
    } 
} 

xPortSysTickHandler()

void SysTick_Handler(void) 
{ 
    HAL_IncTick(); 
    /* OS开始跑了,才执行正常的调度处理 */ 
    if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) 
    { 
        xPortSysTickHandler(); 
    } 
} 

SysTick_Handler 函数

delay_init()

void delay_init(uint16_t sysclk) 
{ 
#if SYS_SUPPORT_OS 
    uint32_t reload; 
#endif 
    SysTick->CTRL = 0; 
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8); 
     
    g_fac_us = sysclk / 8; 
#if SYS_SUPPORT_OS 
    reload = sysclk / 8; 
    /* 使用configTICK_RATE_HZ计算重装载值 
     * configTICK_RATE_HZ在FreeRTOSConfig.h中定义 
     */ 
    reload *= 1000000 / configTICK_RATE_HZ; 
    /* 删除不用的g_fac_ms相关代码 */ 
    SysTick->CTRL |= 1 << 1; 
    SysTick->LOAD = reload; 
    SysTick->CTRL |= 1 << 0; 
#endif 
} 

delay_us()

void delay_us(uint32_t nus) 
{ 
    uint32_t ticks; 
    uint32_t told, tnow, tcnt = 0; 
    uint32_t reload = SysTick->LOAD; 
    /* 删除适用于µC/OS用于锁定任务调度器的自定义函数 */ 
    ticks = nus * g_fac_us; 
    told = SysTick->VAL; 
    while (1) 
    { 
      tnow = SysTick->VAL; 
      if (tnow != told) 
      { 
       if (tnow < told) 
       { 
        tcnt += told - tnow; 
       } 
       else 
       { 
        tcnt += reload - tnow + told; 
       } 
       told = tnow; 
       if (tcnt >= ticks)  
       { 
        break; 
       } 
      } 
    } 
    /* 删除适用于µC/OS用于解锁任务调度器的自定义函数 */ 
}  

delay_ms()

void delay_ms(uint16_t nms) 
{ 
    uint32_t i; 
    for (i=0; i<nms; i++) 
    { 
        delay_us(1000); 
    } 
} 

将#include "includes.h" 修改成

/* 添加公共头文件 (FreeRTOS 需要用到) */ 
#include "FreeRTOS.h" 
#include "task.h" 

完整delay.c文件:


#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"


static uint32_t g_fac_us = 0;       /* us延时倍乘数 */

/* 如果SYS_SUPPORT_OS定义了,说明要支持OS了(不限于UCOS) */
#if SYS_SUPPORT_OS

/* 添加公共头文件 (FreeRTOS 需要用到) */
#include "FreeRTOS.h"
#include "task.h"

extern void xPortSysTickHandler(void);

/**
 * @brief     systick中断服务函数,使用OS时用到
 * @param     ticks : 延时的节拍数  
 * @retval    无
 */  
void SysTick_Handler(void)
{
    HAL_IncTick();
    /* OS 开始跑了,才执行正常的调度处理 */
    if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
    {
        xPortSysTickHandler();
    }
}
#endif

/**
 * @brief     初始化延迟函数
 * @param     sysclk: 系统时钟频率, 即CPU频率(rcc_c_ck), 180MHz
 * @retval    无
 */  
void delay_init(uint16_t sysclk)
{
#if SYS_SUPPORT_OS                                      /* 如果需要支持OS */
    uint32_t reload;
#endif
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);/* SYSTICK使用外部时钟源,频率为HCLK */
    g_fac_us = sysclk;                                  /* 不论是否使用OS,g_fac_us都需要使用 */
#if SYS_SUPPORT_OS                                      /* 如果需要支持OS. */
    reload = sysclk;                                    /* 每秒钟的计数次数 单位为M */
    reload *= 1000000 / configTICK_RATE_HZ;            /* 根据delay_ostickspersec设定溢出时间,reload为24位
                                                         * 寄存器,最大值:16777216,在180M下,约合0.0932s左右
                                                         */
    SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;          /* 开启SYSTICK中断 */
    SysTick->LOAD = reload;                             /* 每1/delay_ostickspersec秒中断一次 */
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;           /* 开启SYSTICK */
#endif 
}

#if SYS_SUPPORT_OS                                      /* 如果需要支持OS, 用以下代码 */

/**
 * @brief     延时nus
 * @param     nus: 要延时的us数
 * @note      注意: nus的值,不要大于93206us(最大值即2^24 / g_fac_us @g_fac_us = 180)
 * @retval    无
 */ 
void delay_us(uint32_t nus)
{
    uint32_t ticks;
    uint32_t told, tnow, tcnt = 0;
    uint32_t reload = SysTick->LOAD;        /* LOAD的值 */
    ticks = nus * g_fac_us;                 /* 需要的节拍数 */
    told = SysTick->VAL;                    /* 刚进入时的计数器值 */
    while (1)
    {
        tnow = SysTick->VAL;
        if (tnow != told)
        {
            if (tnow < told)
            {
                tcnt += told - tnow;        /* 这里注意一下SYSTICK是一个递减的计数器就可以了 */
            }
            else
            {
                tcnt += reload - tnow + told;
            }
            told = tnow;
            if (tcnt >= ticks) 
            {
                break;                      /* 时间超过/等于要延迟的时间,则退出 */
            }
        }
    }
        
} 

/**
 * @brief     延时nms
 * @param     nms: 要延时的ms数 (0< nms <= 65535) 
 * @retval    无
 */
void delay_ms(uint16_t nms)
{
    uint32_t i;
    for (i=0; i<nms; i++)
    {
        delay_us(1000);
    }
}

#else  /* 不使用OS时, 用以下代码 */

/**
 * @brief       延时nus
 * @param       nus: 要延时的us数.
 * @note        注意: nus的值,不要大于93206us(最大值即2^24 / g_fac_us @g_fac_us = 180)
 * @retval      无
 */
void delay_us(uint32_t nus)
{
    uint32_t ticks;
    uint32_t told, tnow, tcnt = 0;
    uint32_t reload = SysTick->LOAD;        /* LOAD的值 */
    ticks = nus * g_fac_us;                 /* 需要的节拍数 */
    told = SysTick->VAL;                    /* 刚进入时的计数器值 */
    while (1)
    {
        tnow = SysTick->VAL;
        if (tnow != told)
        {
            if (tnow < told)
            {
                tcnt += told - tnow;        /* 这里注意一下SYSTICK是一个递减的计数器就可以了 */
            }
            else 
            {
                tcnt += reload - tnow + told;
            }
            told = tnow;
            if (tcnt >= ticks)
            {
                break;                      /* 时间超过/等于要延迟的时间,则退出 */
            }
        }
    }
}

/**
 * @brief       延时nms
 * @param       nms: 要延时的ms数 (0< nms <= 65535)
 * @retval      无
 */
void delay_ms(uint16_t nms)
{
    uint32_t repeat = nms / 65;     /*  这里用60,是考虑到可能有超频应用,比如180M的时候,delay_us最大只能延时93206us左右了 */
    uint32_t remain = nms % 65;

    while (repeat)
    {
        delay_us(65 * 1000);        /* 利用delay_us 实现 65ms 延时 */
        repeat--;
    }

    if (remain)
    {
        delay_us(remain * 1000);    /* 利用delay_us, 把尾数延时(remain ms)给做了 */
    }
}

/**
 * @brief       HAL库内部函数用到的延时
 * @note        HAL库的延时默认用Systick,如果我们没有开Systick的中断会导致调用这个延时后无法退出
 * @param       Delay : 要延时的毫秒数
 * @retval      None
 */
void HAL_Delay(uint32_t Delay)
{
     delay_ms(Delay);
}
#endif









stm32f1xx_it.c

/* 加入宏开关 */ 
#if (!SYS_SUPPORT_OS) 
void SVC_Handler(void) 
{ 
} 
#endif 
 
/** 
  * @brief This function handles PendSVC exception. 
  * @param None 
  * @retval None 
  */ 
/* 加入宏开关 */ 
#if (!SYS_SUPPORT_OS) 
void PendSV_Handler(void) 
{ 
} 
#endif 
 
/** 
  * @brief This function handles SysTick Handler. 
  * @param None 
  * @retval None 
  */ 
/* 加入宏开关 */ 
#if (!SYS_SUPPORT_OS) 
void SysTick_Handler(void) 
{ 
  HAL_IncTick(); 
} 
#endif

FreeRTOSConfig.h

#define configPRIO_BITS  __NVIC_PRIO_BITS 
//#define __NVIC_PRIO_BITS  4U 
#define __NVIC_PRIO_BITS  4 

编译:无报错无警告

四、测试 

编写主函数:

#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
 #include "./SYSTEM/delay/delay.h"
 #include "./SYSTEM/usart/usart.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
/******************************************************************************************************/
/*FreeRTOS配置*/

/* START_TASK 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define START_TASK_PRIO 1                   /* 任务优先级 */
#define START_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            StartTask_Handler;  /* 任务句柄 */
void start_task(void *pvParameters);        /* 任务函数 */

/* TASK1 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK1_PRIO      2                   /* 任务优先级 */
#define TASK1_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            Task1Task_Handler;  /* 任务句柄 */
void task1(void *pvParameters);             /* 任务函数 */

/* TASK2 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK2_PRIO      3                   /* 任务优先级 */
#define TASK2_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            Task2Task_Handler;  /* 任务句柄 */
void task2(void *pvParameters);             /* 任务函数 */

/******************************************************************************************************/
void led_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
__HAL_RCC_GPIOC_CLK_ENABLE();

    gpio_initstruct.Pin = GPIO_PIN_13;                      /* LED0引脚 */
    gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */
    gpio_initstruct.Pull = GPIO_PULLUP;                    /* 上拉 */
    gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */
    HAL_GPIO_Init(GPIOC, &gpio_initstruct);                /* 初始化LED0引脚 */

//    gpio_initstruct.Pin = GPIO_PIN_5;                      /* LED1引脚 */
//    HAL_GPIO_Init(GPIOE, &gpio_initstruct);                /* 初始化LED1引脚 */
}

 

/**
 * @brief       FreeRTOS例程入口函数
 * @param       无
 * @retval      无
 */
void freertos_demo(void)
{    
    xTaskCreate((TaskFunction_t )start_task,            /* 任务函数 */
                (const char*    )"start_task",          /* 任务名称 */
                (uint16_t       )START_STK_SIZE,        /* 任务堆栈大小 */
                (void*          )NULL,                  /* 传入给任务函数的参数 */
                (UBaseType_t    )START_TASK_PRIO,       /* 任务优先级 */
                (TaskHandle_t*  )&StartTask_Handler);   /* 任务句柄 */
    vTaskStartScheduler();
}

/**
 * @brief       start_task
 * @param       pvParameters : 传入参数(未用到)
 * @retval      无
 */
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           /* 进入临界区 */
    /* 创建任务1 */
    xTaskCreate((TaskFunction_t )task1,
                (const char*    )"task1",
                (uint16_t       )TASK1_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )TASK1_PRIO,
                (TaskHandle_t*  )&Task1Task_Handler);
    /* 创建任务2 */
    xTaskCreate((TaskFunction_t )task2,
                (const char*    )"task2",
                (uint16_t       )TASK2_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )TASK2_PRIO,
                (TaskHandle_t*  )&Task2Task_Handler);
    vTaskDelete(StartTask_Handler); /* 删除开始任务 */
    taskEXIT_CRITICAL();            /* 退出临界区 */
}

/**
 * @brief       task1
 * @param       pvParameters : 传入参数(未用到)
 * @retval      无
 */
void task1(void *pvParameters)
{    
	
    while(1)
    {
			printf("task1\r\n");delay_ms(500);
    }
}

/**
 * @brief       task2
 * @param       pvParameters : 传入参数(未用到)
 * @retval      无
 */
void task2(void *pvParameters)
{    
		led_init();                         /* LED初始化 */
    while(1)
    { 
			printf("task2\r\n");delay_ms(500);
        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);    /* PB5置1 */ 
        
        delay_ms(500);
        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);  /* PB5置0 */
  
        delay_ms(500); 
    }
}


int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    delay_init(72);                     /* 延时初始化 */
		usart_init(115200);
		printf("start\r\n"); 
		freertos_demo();
//    while(1)
//    { 

//    }
}

编译烧入:

参考:第7讲 FreeRTOS移植_哔哩哔哩_bilibili

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

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

相关文章

Nginx 的 Http 模块介绍(上)

Nginx 的 Http 模块介绍&#xff08;上&#xff09; 1. http 请求 11 个处理阶段介绍 Nginx 将一个 Http 请求分成多个阶段&#xff0c;以模块为单位进行处理。其将 Http请求的处理过程分成了 11 个阶段&#xff0c;各个阶段可以包含任意多个 Http 的模块并以流水线的方式处理…

六西格玛项目助力,手术机器人零部件国产化稳中求胜——张驰咨询

项目背景 XR-1000型腔镜手术机器人是某头部手术机器人企业推出的高端手术设备&#xff0c;专注于微创手术领域&#xff0c;具有高度的精确性和稳定性。而XR-1000型机器人使用的部分核心零部件长期依赖进口&#xff0c;特别是高精度电机、关节执行机构和视觉系统等&#xff0c;…

基于Python爬虫与文本挖掘的网络舆情监控系统【附源码】

基于Python爬虫与文本挖掘的网络舆情监控系统 效果如下&#xff1a; 系统登录界面 注册页面界面 管理员主界面 用户界面 网络舆情管理界面 看板详细页面 系统简介界面 用户主界面 网络舆情界面 研究背景 随着网络空间舆论的日益活跃&#xff0c;其对社会事件的影响愈发显著。…

光影重塑 艺术无界——中央美术学院国际学院与北京曦烽摄影学院联展启幕

10月28日&#xff0c;中央美术学院国际学院与北京曦烽摄影学院联合举办的《重塑》摄影展&#xff0c;在中央美术学院国际学院艺术空间启幕。展览旨在打破传统“时尚摄影”的话语界限&#xff0c;通过镜头展现时尚的更多维度&#xff0c;既关注视觉美感&#xff0c;更深入挖掘时…

【Linux 25】网络套接字 socket 概念

文章目录 &#x1f308; 一、IP 地址概念⭐ 1. IP 地址的作用⭐ 2. 源 IP 地址和目的 IP 地址 &#x1f308; 二、端口号概念⭐ 1. 源端口号和目的端口号⭐ 2. 端口号范围划分⭐ 3. 端口号 VS 进程 ID⭐ 4. 套接字 socket 的概念 &#x1f308; 三、传输层的典型代表协议⭐ 1. …

配置mysql 主主模式 GTID

文章目录 一、前提二、修改my.cnf主1 10.255.131.9主2 10.255.131.10 三、配置主主3.1 配置主 10.255.131.93.2 配置从 10.255.131.103.3 配置主 10.255.131.103.4 配置从 10.255.131.9 四、验证五、同步问题排查以及恢复5.1 查看同步状态5.2 查看同步是否数据一致性&#xff0…

自动化研磨领域的革新者:半自动与自动自磨机的技术突破

据QYResearch调研团队最新报告“全球半自动和自动自磨机市场报告2023-2029”显示&#xff0c;预计2029年全球半自动和自动自磨机市场规模将达到5.3亿美元&#xff0c;未来几年年复合增长率CAGR为3.5%。 图00001. 半自动和自动自磨机&#xff0c;全球市场总体规模 如上图表/数据…

最长方连续方波信号

更多关于刷题的内容欢迎订阅我的专栏华为刷题笔记 该专栏题目包含两部分&#xff1a; 100 分值部分题目 200 分值部分题目 所有题目都会陆续更新&#xff0c;订阅防丢失 题目描述 输入一串方波信号&#xff0c;求取最长的完全连续交替方波信号&#xff0c;并将其输出&#x…

ARB链挖矿DApp系统开发模式定制

在区块链生态中&#xff0c;挖矿作为一种获取加密资产的方式&#xff0c;越来越受到关注。ARB链凭借其高效的性能和灵活的智能合约系统&#xff0c;成为了开发挖矿DApp的理想平台。本文将探讨ARB链挖矿DApp的开发模式定制&#xff0c;包括架构设计、功能实现以及最佳实践。 ARB…

YoloV8改进策略:Block改进|RFE模块,提高小物体的识别精度|即插即用|代码+修改过程

摘要 论文介绍 本文介绍了一种基于YOLOv5的人脸检测方法,命名为YOLO-FaceV2。该方法旨在解决人脸检测中的尺度变化、简单与困难样本不平衡以及人脸遮挡等问题。通过引入一系列创新模块和损失函数,YOLO-FaceV2在WiderFace数据集上取得了优异的表现,特别是在小物体、遮挡和困…

使用 Elasticsearch 进行语义搜索

Elasticsearch 是一款功能强大的开源搜索引擎&#xff0c;可用于全文搜索、分析和数据可视化。传统上&#xff0c;Elasticsearch 以其执行基于关键字/词汇的搜索的能力而闻名&#xff0c;其中文档基于精确或部分关键字匹配进行匹配。然而&#xff0c;Elasticsearch 已经发展到支…

计算机网络:网络层 —— 虚拟专用网 VPN

文章目录 虚拟专用网 VPN 概述内联网 VPN外联网 VPN 虚拟专用网 VPN 概述 虚拟专用网&#xff08;Virtual Private Network&#xff0c;VPN&#xff09;&#xff1a;利用公用的因特网作为本机构各专用网之间的通信载体&#xff0c;这样形成的网络又称为虚拟专用网。 出于安全…

C语言函数嵌套调用

函数嵌套调用就是在一个函数中调用另一个函数&#xff1b; 看一个例子&#xff1b; max2函数返回2个整数中大的一个&#xff1b;max4中调用max2&#xff0c;实现返回4个整数中最大的一个&#xff1b; int max2(int, int); int max4(int, int, int, int);......void CCjjyyV…

C++:继承及其相关问题

继承的定义 继承机制是⾯向对象程序设计实现代码复⽤的重要⼿段&#xff0c;它允许我们在保持原有类特性的基础上进⾏扩展&#xff0c;增加⽅法 (成员函数) 和属性 (成员变量)&#xff0c;从而产⽣的类&#xff0c;这样的类称为派⽣类&#xff0c;也称为子类。而这样的类就成为…

Centos7.9 x86架构部署

一、部署环境 表 1‑1 环境服务版本号系统centos7.9_2009运行环境1JDK1.8_321前端WEBNginx1.14数据库postgresqlpostgresql13postgis3.1pgrouting3.1消息队列rabbitmq3.8.16运行环境2erlang23.3.3.1 二、部署JDK 2.1下载JDK安装包 官网下载JDK8 官网地址&#xff1a; https…

【uniapp3】分享一个自己写的h5日历组件

简言 分享一下自己基于uniapp写的日历组件。如果不太满足你的需求&#xff0c;可以自己改造。 日历 实现分析&#xff1a; 页面显示 - 分为顶部显示和日历显示&#xff0c;我这里做了多行和单行显示两种情况&#xff0c;主要是当时看着手机的日历做的&#xff0c;手机上的…

Nginx安装配置详解

Nginx Nginx官网 Tengine翻译的Nginx中文文档 轻量级的Web服务器&#xff0c;主要有反向代理、负载均衡的功能。 能够支撑5万的并发量&#xff0c;运行时内存和CPU占用低&#xff0c;配置简单&#xff0c;运行稳定。 写在前 uWSGI与Nginx的关系 1. 安装 Windows 官网 Stabl…

Java版企电子招标采购系统源业码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

MS01SF1 精准测距UWB模组助力露天采矿中的人车定位安全和作业效率提升

在当今矿业行业&#xff0c;随着全球对资源需求的不断增加和开采难度的逐步提升&#xff0c;传统的作业方式面临着越来越多的挑战。露天矿山开采&#xff0c;因其大规模的作业环境和复杂的地形特点&#xff0c;面临着作业人员的安全风险、设备调度的高难度以及资源利用率低下等…

【Web.路由】——路由模板

路由模板负责根据规则生成URL&#xff0c;从而使得请求可以正常访问到资源。 总之就是——》》》 规范如何写一个url&#xff0c;并且命名以方便进行管理。 在Asp.net core中的Http管道机制&#xff0c;UseRouting()和 UseEndpoints()这两个中间件来实现整个路由系统。关于asp…