GD32F103*固件库移植FreeRTOS详细教程与解析

GD32F103*固件库移植FreeRTOS详细教程与解析

GD32F103*移植μCOS-Ⅲ详细教程与解析,欢迎指正


文章目录

  • GD32F103*固件库移植FreeRTOS详细教程与解析
  • 前言
  • 一、移植前的准备
  • 二、移植步骤
    • 1.文件结构
    • 2.添加代码
    • 3.编译与配置
  • 三、注意事项
  • 总结


前言

FreeRTOS是一个可以基于ROM运行的、可裁剪的、抢占式、实时多任务内核,具有高度可移植性,特点:公开源代码、可移植性、可固化、可裁剪、多任务、占先式,特别适合于微处理器和控制器,适合很多商业操作系统性能相当的实时操作系统(RTOS)。在使用GD32F103单片机项目使用过FreeRTOS,这里作为一个基础教学版简单记录一下移植过程,最终成果后续上传更新,欢迎指正!


一、移植前的准备

<1>、硬件平台:可运行软件程序的GD32单片机(本项目使用GD32F103CBT6硬件平台)
<2>、软件平台:可直接下载运行的单片机基础工程,本例程是基于使用标准库GD32F10x_Firmware_Library_V2.2.4固件库编写,点击此处可直接获取本试验基础工程
<3>、源码获取:FreeRTOS源码(本例程使用FreeRTOS源码版本为:FreeRTOS9.0.0)
<4>、J-link或ST-link等下载器
<5>、源码简介:在上篇FreeRTOS简介中已经介绍:https://blog.csdn.net/Yin_w/article/details/134771124

二、移植步骤

1.文件结构

1.在基础工程同目录下新建FreeRTOS文件夹用来保存FreeRTOS源码
在这里插入图片描述
2.将源码\FreeRTOS\portable目录除以下文件夹以外的文件夹可以删除
在这里插入图片描述
3.打开Keil工程,在基础工程目录下新建FreeRTOS_Core、FreeRTOS_Protable文件分组,然后严格按照以下步骤去添加文件。
在这里插入图片描述

■FreeRTOS_Core分组:将\FreeRTOSv9.0.0\FreeRTOS\Source目录下*.c文件添加到此分组中

■FreeRTOS_Protable分组:FreeRTOS_PORTABLE 分组中的port.c 是 RVDS 文件夹下的 ARM_CM3 中的文件,因为GD32F103是 Cortex-M43内核,因此要选择 ARM_CM3 中的 port.c 文件。heap_4.c 是 MemMang 文件夹中的,这5 个 c 文件是五种不同的内存管理方法,我们选取heap_4这种方式。
在这里插入图片描述
4.添加头文件路径,Target-C/C++下,添加如下头文件路径
在这里插入图片描述
5.新建四个文件名字分别是system_cfg.c和system_cfg.h,FreeRTOS_main.c和FreeRTOS_main.h都保存到main.c所在目录下。system_cfg.c和system_cfg.h文件主要是包含一些全局的自定义配置。FreeRTOS_main.c和FreeRTOS_main.h主要是OS的任务启动、调度函数等,这样划分的主要目的是使得系统main函数和OS的main函数分开,结构会很清晰明朗,系统启动会进入系统main函数初始化各个外设组件和软件模块,然后再进入OS的main中进行任务调度,以下会详细说明各个文件的作用和内容。
在这里插入图片描述
6.如图将system_cfg.c和FreeRTOS_main文件添加到user组件下方。
在这里插入图片描述

2.添加代码

1.system_cfg.c主要是系统配置需要的文件,本例程中主要配置主要都在system_cfg.h文件中,这里的内容是我自己写的,不必完全参考,其他内容也可自己补充

/******************************************************************************************************* @file          system_cfg.c* @author        Awen_* @version       V1.0* @date          2023-04-13* @brief         system Initialization configuration* @license* @modifyRecord:*                V1.0  XXX  XXXX-XX-XX Modify...*                V2.0  XXX  XXXX-XX-XX Modify...***************************************************************************************************** @attention  :*                Hardware Testing Platform:兆易创新(GigaDevice)  GD32F103RE*                Software Support Package :GD32F10x_Firmware_Library_V2.2.4* *****************************************************************************************************/#ifndef __SYS_H
#define __SYS_H#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <gd32f10x.h>
#include <systick.h>
#include "gd32f10x_libopt.h"#define SYSTEM_SUPPORT_OS		     1	  //定义系统文件夹是否支持OS
#define SYSTEM_SUPPORT_DEBUG     	 1   //是否支持串口打印调试/*
*********************************************************************************************************
*                                     如果使用FreeRTOS_main,则包括下面的头文件即可
*********************************************************************************************************
*/
#ifdef SYSTEM_SUPPORT_OS#include "FreeRTOS_main.h"					//FreeRTOS_main 使用
#endif/*
*********************************************************************************************************
*                                     如果使用FreeRTOS_main,则包括下面的头文件即可
*********************************************************************************************************
*//*
*********************************************************************************************************
*                                                 定义返回值类型  
*********************************************************************************************************
*/typedef uint8_t  ReturnType_u8;
typedef uint16_t ReturnType_u16;
typedef uint32_t ReturnType_u32;typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t  u8;/*
*********************************************************************************************************
*                                                  获取数组长度宏  
*********************************************************************************************************
*/
#define ARRAYNUM(arr_name)     (uint32_t)(sizeof(arr_name) / sizeof(*(arr_name)))
/*
*********************************************************************************************************
*                                   如果使用串口Debug,则定义SYSTEM_SUPPORT_DEBUG 1
*********************************************************************************************************
*/
#ifdef SYSTEM_SUPPORT_DEBUG#define Debug  			printf
#else#define Debug(...)  do{ }while(0)
#endif/*
*********************************************************************************************************
*                                                  定义空指针类型
*********************************************************************************************************
*/
#define NULL_PTR  ((void*)0)/*
*********************************************************************************************************
*                                                  定义错误代号
*********************************************************************************************************
*/
#ifndef E_OK#define E_OK  0U
#endif#ifndef E_NOT_OK#define E_NOT_OK  1U
#endifextern void FWDG_Init(void);#endif

2.system_cfg.c主要是系统配置需要的文件,本例程中主要配置主要都在system_cfg.h文件中,所以system_cfg.c文件中的内容之包含system_cfg.h头文件,其他内容可先空着方便后续补充。

代码如下(示例):

/******************************************************************************************************* @file          system_cfg.c* @author        Awen_* @version       V1.0* @date          2023-04-13* @brief         system config file* @license* @modifyRecord:*                V1.0  XXX  XXXX-XX-XX Modify...*                V2.0  XXX  XXXX-XX-XX Modify...***************************************************************************************************** @attention  :*                Hardware Testing Platform:兆易创新(GigaDevice)  GD32F103RE*                Software Support Package :GD32F10x_Firmware_Library_V2.2.4*                *****************************************************************************************************/
#define FWDG_TIMEOUT_3000MS   (3750u) #include "system_cfg.h"void FWDG_Init(void)
{/* configure FWDGT counter clock: 40KHz(IRC40K) / 32 = 0.625 KHz */fwdgt_config(FWDG_TIMEOUT_3000MS,FWDGT_PSC_DIV32);/* after 3 seconds to generate a reset */fwdgt_enable();
}

3.FreeRTOS_main.h文件主要作为FreeRTOS_main.c的头文件,FreeRTOS_main(void)函数作为FreeRTOS系统的入口,可在FreeRTOS_main.c中实现,以供main函数调用,也可自己添加一些OS的配置

/******************************************************************************************************* @file        FreeRTOS.h* @author      Awen_* @version     V2.0* @date        2023-06-13* @brief       FreeRTOS 实验* @license     Copyright (c) 2020-2032, ***************************************************************************************************** @attention*******************************************************************************************************/
#ifndef __FreeRTOS_MAIN_H
#define __FreeRTOS_MAIN_H//#include "system_cfg.h"
//#include "usart_Func.h"
/*uC/OS-III*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"extern void FreeRTOS_main(void);#endif

4.FreeRTOS_main.c文件就是OS的主场,FreeRTOS_main(void)的实现,系统启动,创建任务,任务函数都是在这里实现,此处给出一个简单的例程,不必深究内容,大意就是创建了三个优先级不同的任务,分别闪灯和usart0输出点内容。这里可直节复制粘贴即可,先不必深究内容。

/******************************************************************************************************* @file          IoHwAb.c* @author        Awen_* @version       V1.0* @date          2023-04-13* @brief         Hardware IO Initialization configuration* @license* @modifyRecord:*                V1.0  XXX  XXXX-XX-XX Modify...*                V2.0  XXX  XXXX-XX-XX Modify...***************************************************************************************************** @attention  :*                Hardware Testing Platform:兆易创新(GigaDevice)  GD32F103RE*                Software Support Package :GD32F10x_Firmware_Library_V2.2.4* *****************************************************************************************************//*
*****************************************************************************************************
*                                                Header Flie
*****************************************************************************************************
*/#include "FreeRTOS_main.h"
/*Peripheral Header file*/
#include "IOHard_cfg.h"
#include "usart_cfg.h"
#include "usart_Func.h"/*
*****************************************************************************************************
*                                               FreeRTOS_main配置
*****************************************************************************************************
*//* Start Task */
#define START_TASK_PRIO                 5
#define START_TASK_STACK_SIZE           256
TaskHandle_t StartTask_Handler;			    //任务句柄
void 	start_task(void *pvParameters); 	//任务函数/*Task1*/
#define TASK1_PRIO                      2
#define TASK1_STACK_SIZE                256
TaskHandle_t Task1_Handler;	            //任务句柄
void 	Task1_Func(void *p_agc);	        //任务函数/*Task2*/
#define TASK2_PRIO                      3
#define TASK2_STACK_SIZE                256
TaskHandle_t Task2_Handler;	            //任务句柄
void 	Task2_Func(void *p_agc);	        //任务函数/*** @brief       FreeRTOS main.c 入口函数* @param       无         * @retval      无*/
void FreeRTOS_main(void)
{systick_config();                                             //开启xTaskCreate(  (TaskFunction_t )start_task,                    //任务函数(const char*    )"start_task",                  //任务名称(uint16_t       )START_TASK_STACK_SIZE,         //任务堆栈大小(void*          )NULL,                          //传递给任务函数的参数(UBaseType_t    )START_TASK_PRIO,               //任务优先级(TaskHandle_t*  )&StartTask_Handler);           //任务句柄/*开始任务调度*/vTaskStartScheduler();
}void start_task(void *p_arg)
{/*创建优先级任务1*/taskENTER_CRITICAL();        		   xTaskCreate(  (TaskFunction_t )Task1_Func,                  //任务函数(const char*    )"Task1_Func",                //任务名称(uint16_t       )TASK1_STACK_SIZE,            //任务堆栈大小(void*          )NULL,                        //传递给任务函数的参数(UBaseType_t    )TASK1_PRIO,                  //任务优先级(TaskHandle_t*  )&Task1_Handler);             //任务句柄xTaskCreate(  (TaskFunction_t )Task2_Func,                  //任务函数(const char*    )"Task2_Func",                //任务名称(uint16_t       )TASK2_STACK_SIZE,            //任务堆栈大小(void*          )NULL,                        //传递给任务函数的参数(UBaseType_t    )TASK2_PRIO,                  //任务优先级(TaskHandle_t*  )&Task2_Handler);             //任务句柄//删除开始任务                  vTaskDelete(StartTask_Handler);//退出临界区                  taskEXIT_CRITICAL();            }uint8_t counter = 0;/*高优先级任务*/
void Task1_Func(void *p_arg)
{
//   OS_ERR  err;while (1){counter++;//Error            vTaskDelay(1000);}       
}/*低优先级任务*/
void Task2_Func(void *p_arg)
{while(1){     fwdgt_counter_reload();vTaskDelay(500);}
}

3.编译与配置

至此主要文件添加完毕,可以编译工程,头文件路径添加完成以后编译一下,看看有没有什么错误,结果会发现提示打不开
“FreeRTOSConfig.h”这个文件:

1.这是因为缺少 FreeRTOSConfig.h 文件,这个文件在哪里找呢?你可以自己创建,也可以找找 FreeRTOS 的官方移植工程中会不会有这个文件,打开FreeRTOS 针对 Cortex-M3 的移植工程文件复制一个FreeRTOSConfig.h 文件过来,针对gd32F103我做了如下修改,可以新建一个FreeRTOSConfig.h文件,然后直接复制粘贴以下内容。

/** FreeRTOS Kernel V10.2.1* Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.** Permission is hereby granted, free of charge, to any person obtaining a copy of* this software and associated documentation files (the "Software"), to deal in* the Software without restriction, including without limitation the rights to* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of* the Software, and to permit persons to whom the Software is furnished to do so,* subject to the following conditions:** The above copyright notice and this permission notice shall be included in all* copies or substantial portions of the Software.** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.** http://www.FreeRTOS.org* http://aws.amazon.com/freertos** 1 tab == 4 spaces!*/#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H#include "systick.h"
//针对不同的编译器调用不同的stdint.h文件
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)#include <stdint.h>#include <stdio.h>extern uint32_t SystemCoreClock;
#endif//断言
#define vAssertCalled(char,int) printf("Error:%s,%d\r\n",char,int)
#define configASSERT(x) if((x)==0) vAssertCalled(__FILE__,__LINE__)/***************************************************************************************************************/
/*                                        FreeRTOS基础配置配置选项                                              */
/***************************************************************************************************************/
#define configUSE_PREEMPTION					         	1                       //1使用抢占式内核,0使用协程
#define configUSE_TIME_SLICING					        	1						//1使能时间片调度(默认式使能的)
#define configUSE_PORT_OPTIMISED_TASK_SELECTION				1                       //1启用特殊方法来选择下一个要运行的任务#define configUSE_TICKLESS_IDLE					            0                       //1启用低功耗tickless模式
#define configUSE_QUEUE_SETS					            1                       //为1时启用队列
#define configCPU_CLOCK_HZ						           (SystemCoreClock)        //CPU频率
#define configTICK_RATE_HZ						           (1000)                   //时钟节拍频率,这里设置为1000,周期就是1ms
#define configMAX_PRIORITIES					           (32)                     //可使用的最大优先级
#define configMINIMAL_STACK_SIZE				           ((unsigned short)130)    //空闲任务使用的堆栈大小
#define configMAX_TASK_NAME_LEN					           (16)                     //任务名字字符串长度#define configUSE_16_BIT_TICKS					            0                       //系统节拍计数器变量数据类型,//1表示为16位无符号整形,0表示为32位无符号整形
#define configIDLE_SHOULD_YIELD					            1                       //为1时空闲任务放弃CPU使用权给其他同优先级的用户任务
#define configUSE_TASK_NOTIFICATIONS                        1                       //为1时开启任务通知功能,默认开启
#define configUSE_MUTEXES						            1                       //为1时使用互斥信号量
#define configQUEUE_REGISTRY_SIZE				            8                       //不为0时表示启用队列记录,具体的值是可以//记录的队列和信号量最大数目。
#define configCHECK_FOR_STACK_OVERFLOW			            0                       //大于0时启用堆栈溢出检测功能,如果使用此功能//用户必须提供一个栈溢出钩子函数,如果使用的话//此值可以为1或者2,因为有两种栈溢出检测方法。
#define configUSE_RECURSIVE_MUTEXES				            1                       //为1时使用递归互斥信号量
#define configUSE_MALLOC_FAILED_HOOK			            0                       //1使用内存申请失败钩子函数
#define configUSE_APPLICATION_TASK_TAG			            0                       
#define configUSE_COUNTING_SEMAPHORES			            1                       //为1时使用计数信号量/***************************************************************************************************************/
/*                                FreeRTOS与内存申请有关配置选项                                                */
/***************************************************************************************************************/
#define configSUPPORT_DYNAMIC_ALLOCATION                    1                       //支持动态内存申请
#define configTOTAL_HEAP_SIZE					            ((size_t)(10*1024))     //系统所有总的堆大小/***************************************************************************************************************/
/*                                FreeRTOS与钩子函数有关的配置选项                                              */
/***************************************************************************************************************/
#define configUSE_IDLE_HOOK						            0                       //1,使用空闲钩子;0,不使用
#define configUSE_TICK_HOOK						            0                       //1,使用时间片钩子;0,不使用/***************************************************************************************************************/
/*                                FreeRTOS与运行时间和任务状态收集有关的配置选项                                 */
/***************************************************************************************************************/
#define configGENERATE_RUN_TIME_STATS	                    0                       //为1时启用运行时间统计功能
#define configUSE_TRACE_FACILITY				            1                       //为1启用可视化跟踪调试
#define configUSE_STATS_FORMATTING_FUNCTIONS	            1                       //与宏configUSE_TRACE_FACILITY同时为1时会编译下面3个函数/***************************************************************************************************************/
/*                                FreeRTOS与协程有关的配置选项                                                  */
/***************************************************************************************************************/
#define configUSE_CO_ROUTINES 			                    0                       //为1时启用协程,启用协程以后必须添加文件croutine.c
#define configMAX_CO_ROUTINE_PRIORITIES                    (2)                      //协程的有效优先级数目/***************************************************************************************************************/
/*                                FreeRTOS与软件定时器有关的配置选项                                            */
/***************************************************************************************************************/
#define configUSE_TIMERS				                    1                               //为1时启用软件定时器
#define configTIMER_TASK_PRIORITY		                    (configMAX_PRIORITIES-1)        //软件定时器优先级
#define configTIMER_QUEUE_LENGTH		                    5                               //软件定时器队列长度
#define configTIMER_TASK_STACK_DEPTH	                    (configMINIMAL_STACK_SIZE*2)    //软件定时器任务堆栈大小/***************************************************************************************************************/
/*                                FreeRTOS可选函数配置选项                                                      */
/***************************************************************************************************************/
#define INCLUDE_xTaskGetSchedulerState                      1                       
#define INCLUDE_vTaskPrioritySet		                    1
#define INCLUDE_uxTaskPriorityGet		                    1
#define INCLUDE_vTaskDelete				                    1
#define INCLUDE_vTaskCleanUpResources	                    1
#define INCLUDE_vTaskSuspend			                    1
#define INCLUDE_vTaskDelayUntil			                    1
#define INCLUDE_vTaskDelay				                    1
#define INCLUDE_eTaskGetState			                    1
#define INCLUDE_xTimerPendFunctionCall	                    1/***************************************************************************************************************/
/*                                FreeRTOS与中断有关的配置选项                                                  */
/***************************************************************************************************************/
#ifdef __NVIC_PRIO_BITS#define configPRIO_BITS       		                    __NVIC_PRIO_BITS
#else#define configPRIO_BITS       		                    4                  
#endif#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			    15	                    //中断最低优先级
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	    5                       //系统可管理的最高中断优先级
#define configKERNEL_INTERRUPT_PRIORITY 		            (configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	            (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )/***************************************************************************************************************/
/*                                FreeRTOS与中断服务函数有关的配置选项                                          */
/***************************************************************************************************************/#define xPortPendSVHandler 	  PendSV_Handler
//#define xPortSysTickHandler 	SysTick_Handler
#define vPortSVCHandler 	    SVC_Handler#endif /* FREERTOS_CONFIG_H */

2.再编译一次,发现还是有错误:
在这里插入图片描述

这是因为 port.c 和 stm32f4xx_it.c 这两个文件中有重复定义的函数:PendSV_Handler()、SVC_Handler()和 Systick_Handler(),这里屏蔽掉 stm32f4xx_it.c 中的 PendSV_Handler()、SVC_Handler()两个函数。然后在stm32f4xx_it.c 添加如下代码:

#if SYSTEM_SUPPORT_OS#include "FreeRTOS.h"#include "task.h"//extern void xPortPendSVHandler( void );extern void xPortSysTickHandler( void );//extern void vPortSVCHandler( void );
#endif

再对void SysTick_Handler(void)做如下修改:

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

再返回FreeRTOSConfig.h文件,拉到文件最底下做如下修改:

/***************************************************************************************************************/
/*                                FreeRTOS与中断服务函数有关的配置选项                                          */
/***************************************************************************************************************/#define xPortPendSVHandler 	  PendSV_Handler
//#define xPortSysTickHandler 	SysTick_Handler
#define vPortSVCHandler 	    SVC_Handler#endif /* FREERTOS_CONFIG_H */

3.配置并启动滴答定时器,打开systick.c文件,对void systick_config(void)做以下修改,如果提示未定义则添加#include “FreeRTOS.h”
#include "task.h"包含头文件

/*!\brief      configure systick\param[in]  none\param[out] none\retval     none
*/
void systick_config(void)
{/* setup systick timer for 1000Hz interrupts*/if (SysTick_Config(rcu_clock_freq_get(CK_SYS) / configTICK_RATE_HZ)){/* capture error */while (1){}}/* configure the systick handler priority */NVIC_SetPriority(SysTick_IRQn, 0x00U);
}

至此编译完成,无错误显示

三、注意事项

1.宏configTICK_RATE_HZ,对OS系统时基进行配置,一般配置为1000,表示为系统以1ms为一个节拍作为系统时基
2.需要使用相关功能,则打开对“FreeRTOSConfig.h”,打开相关宏


总结

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop学习笔记(HDP)-Part.09 安装OpenLDAP

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

网工内推 | 上市公司初级网工,HCIP认证优先,14薪,享企业年金

01 易佰网络 招聘岗位&#xff1a;初级网络工程师 职责描述&#xff1a; 1.电脑周边设备&#xff08;打印机、扫描仪、传真机、复印机、投影仪等&#xff09;安装与维护&#xff1b; 2.局域网维护&#xff1b;无线网WLAN维护&#xff1b;监控系统维护&#xff1b; 3.固资维护管…

学校图书管理系统的开发

目 录 摘要 1 Abstract. 1 1 引言 2 1.1 图书管理的现状 2 1.2 现有图书管理系统的概述 3 1.3 选题的目的、意义 3 1.4 图书管理系统的可行性分析 4 1.5 系统开发运行环境 4 2 图书管理系统开发相关技术的介绍 5 2.1 Asp.net的介绍 5 2.1.1 Asp.net的优势介绍 5 2.1.2 Asp.net…

记录一下Mac配置SpringBoot开发环境

由于很多项目喜欢使用传统的 Java 8 进行开发&#xff0c;而且 Java 8 的稳定性也是经过长久考验的&#xff0c;我们接下来就尝试一下&#xff0c;在一台新的 Mac 中配置 Java 环境&#xff0c;并且开始创建 SpringBoot 项目。 首先&#xff0c;去 Oracle 官网下载 java8 JDK …

玩转数据8:数据质量管理与数据清洗的实践

引言 在当今数字化时代&#xff0c;数据质量管理和数据清洗对于企业和组织来说变得至关重要。随着大数据的快速增长和数据驱动决策的普及&#xff0c;确保数据的准确性、一致性和完整性成为保证业务成功的关键因素。本文将探讨数据质量管理和数据清洗的概念、目标以及其在Java…

Servlet作业1

1.【单选题】 (10分) &#xff08;B &#xff09;是一个用 Java 编写的程序&#xff0c;是一种实现了Servlet接口的类&#xff0c;它是由web容器负责创建并调用&#xff0c;在服务器容器上运行&#xff0c;用于接收和响应用户的请求。 A.Filter B.Servlet C.Request D.Res…

药敏分析分子对接

RCSB PDB: Homepage AutoDock Vina (scripps.edu) GSCA - Gene Set Cancer Analysis (hust.edu.cn) 药物筛选 gscalite数据库&#xff08;好像用不了了&#xff09; PRISM CTRP CMap GDSC oncoPredict文献学习-CSDN博客 蛋白的3D结构 RCSB PDB: Homepage SH3PXD2B G…

CRC(循环冗余校验)直接计算和查表法

文章目录 CRC概述CRC名词解释宽度 (WIDTH)多项式 &#xff08;POLY&#xff09;初始值 &#xff08;INIT&#xff09;结果异或值 &#xff08;XOROUT&#xff09;输入数据反转&#xff08;REFIN&#xff09;输出数据反转&#xff08;REFOUT&#xff09; CRC手算过程模二加减&am…

vue3中手写一个日历,年部分,月部分,周部分,日部分

效果图 高度自定义&#xff0c;支持每天的统计展示&#xff0c;弹窗展示&#xff0c;详情操作 月部分&#xff1a; 默认展示当前月&#xff0c;支持前进和后退选择下一月 支持自定义每月的展示数据&#xff0c; 周部分&#xff1a; 分为上下午&#xff0c;可以列出要做的事项…

30、pytest入门内容回顾

整体结构 解读与实操 pytest30讲主要从四个方面由浅入深的进行解读&#xff0c; 开始 讲解了pytest的概述&#xff0c;安装前的准备工作&#xff08;python,pycharm,pytest&#xff09;&#xff0c;运行方式&#xff08;命令行&#xff09;&#xff0c;断言&#xff08;assert…

麒麟linux将图片批量生成PDF的方法

笔者手里有一批国产linu系统&#xff0c;目前开始用在日常的工作生产环境中&#xff0c;我这个老程序猿勉为其难的充当运维的或网管的角色。 国产linux系统常见的为麒麟Linux&#xff0c;统信UOS等&#xff0c;基本都是基于debian再开发的linux。 问题描述&#xff1a; wind…

OCP Java17 SE Developers 复习题08

答案 答案 答案 A. This code is correct. Line 8 creates a lambda expression that checks whether the age is less than 5, making option A correct. Since there is only one parameter and it does not specify a type, the parentheses around the parameter are …

【C++】POCO学习总结(九):网络

【C】郭老二博文之&#xff1a;C目录 1、Poco::Net::IPAddress IP地址 Poco::Net::IPAddress类存储IPv4或IPv6主机地址。 Poco::Net::IPAddress可以从字符串解析&#xff0c;也可以格式化为字符串。支持IPv4格式(d.d.d.d)和IPv6格式(x: x: x: x: x: x: x: x)。 常用函数&…

springboot整合阿里云oss上传图片,解决无法预览的问题

1.前置工作 需要申请一个域名,需要备案&#xff0c;对接这个踩了不少坑,写的很详细,guan fang tong guo bu 了,各位参考别的博客结合看吧,主要是域名配置,还有看service里面的实现 2.进入控制台 bucket列表 选择bucket 选择域名管理 复制你申请的域名,比如域名:abkhkajs…

1970-2022年中国省级国家级开发区数据集

1970-2022年Z国省级国家级开发区数据集 1、时间&#xff1a;1970-2022年 2、指标&#xff1a;单位名称、所属区域、所属省份、所属级别、开发区类型、关注热度、成立时间、核准面积、主导产业、地址、联系电话、经纬度 3、范围&#xff1a;2781个开发区 4、来源&#xff1a…

MagicPipe3D地下管网三维建模数据规格

经纬管网建模系统MagicPipe3D&#xff08;www.magic3d.net&#xff09;本地离线参数化构建三维地下管网&#xff08;含管道、接头、附属物等&#xff09;模型&#xff0c;输出标准3DTiles、Obj等格式&#xff0c;支持Cesium、Unreal、Unity等引擎可视化查询。MagicPipe3D三维建…

c++基本常见错误总结

我们无论是在学习中还是在工作当中&#xff0c;总是会遇到各种各样的c编译错误问题&#xff0c;经常会有一种情况就是上一次好像遇到过这种问题&#xff0c;但是就是想不起来了&#xff08;我就是这样&#xff09;所以下面这一篇文章就是总结自己遇到的编译以及运行错误。 注意…

【C语言】函数递归详解(二)

前言 在上一篇博客函数递归详解&#xff08;一&#xff09;中讲解了什么是递归&#xff0c;递归的思想及限制条件以及两个递归的例子&#xff0c;这一篇博客将讲解递归与迭代的关系。 递归与迭代 递归是一种很好的编程技巧&#xff0c;但是同很多技巧一样也是可能被误用的&…

Centos7 制作Openssh9.5 RPM包

Centos7 制作Openssh9.5 RPM包 最近都在升级Openssh版本到9.3.在博客里也放了openssh 9.5的rpm包. 详见:https://blog.csdn.net/qq_29974229/article/details/133878576 但还是有小伙伴不停追问这个rpm包是怎么做的,怕下载别人的rpm包里被加了盐. 于是做了个关于怎么用官方的o…

yolov5实现多图形识别和图像训练

1.使用了yolov7,检测更好,但是训练上有问题,运行不起来,转了一圈发现yolov5是应用更广泛使用简单 2.怎么使用 //下载代码 https://github.com/ultralytics/yolov5 //安装依赖 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple some-package //按…