当前位置: 首页 > news >正文

《基于STMF103的FreeRTOS内核移植》

目录

1.FreeRTOS资料下载与出处

  1.1官网下载,网址:www.freertos.org

   1.2在正点原子官网,任意STM32F1的开发板资料A盘里,

2.FreeRTOS移植重要文件讲解

   2.1  FreeRTOS与FreeRTOS-Plus文件夹

   2.2  Demo、Lincence、Source

       ●Demo文件夹

●Lincese文件夹

● Source文件夹

 在Source文件夹下各个文件的含义

3.FreeRTOS移植STM32F103单片机

3.1 准备工作

   3.1.1 准备基础工程

3.1.2 FreeRTOS 系统源码获取

3.2FreeRTOS移植

   3.2.1 向工程中添加相应文件

3.2.2 向工程分组中添加文件

3.2.3 添加相应的头文件路径

3.3 修改 SYSTEM 文件

3.3.1 修改 sys.h 文件

3.3.2 修改 usart.c 文件

3.3.3 修改 delay.c 文件

xTaskGetSchedulerState()函数报错,

taskSCHEDULER_NOT_STARTED没有定义

《FreeRTOS初步移植出现的xTaskGetSchedulerState()函数报错,taskSCHEDULER_NOT_STARTED没有定义的问题》

3.4 移植验证实验

总结:

下面是我所移植成功的代码:


1.FreeRTOS资料下载与出处

  1.1官网下载,网址:www.freertos.org

  

   1.2在正点原子官网,任意STM32F1的开发板资料A盘里,

下载打开文件后,找到软件资料,打开

里面有一个FreeRTOS源码文件夹,点入会看到FreeRTOSv~.~.~(由于文件会更新,所以这里版本用~.~.~替代),如图片所示,即可下载FreeRTOS源码。

注意!FreeRTOS版本更新非常快!从正点原子官方资料下载的FreeRTOS版本低是非常正常的,强烈建议若是初学FreeRTOS,可以从正点原子的官方文档去下载并学习。

2.FreeRTOS移植重要文件讲解

   2.1  FreeRTOS与FreeRTOS-Plus文件夹

           对于打开FreeRTOS文档,我们可以看到FreeRTOS和FreeRTOS-Plus两份文件夹,前者的含义是FreeRTOS源文件,后者的含义是FreeTROS拓展函数,对于初学者而言,只要关注FreeTROS文件夹就够了。

 

   2.2  Demo、Lincence、Source

       ●Demo文件夹

       Demo 文件夹里面就是 FreeRTOS 的相关例程,

 可以看出 FreeRTOS 针对不同的 MCU 提供了非常多的 Demo,其中就有 ST F1F4 F7 的相关例程,这对于我们学习来说是非常友好的,我们在移植的时候就会参考这些例程。

●Lincese文件夹

这个文件夹里面就是相关的许可信息,要用 FreeRTOS 做产品的得仔细看看,尤其是要出口的产品

● Source文件夹

看名字就知道了,这个就是 FreeRTOS 的本尊了。

 在Source文件夹下各个文件的含义

其中红色加粗是必须要添加进去的,其他可用可不用,根据自己的使用需求

FreeRTOS是一个系统,归根结底就是一个纯软件的东西,include文件不必多说,重点是portable文件,他是软件和硬件链接的一个桥梁,不同的编译环境,不同的 MCU,其桥梁是不同的,故而需要我们在移植的时候格外注意。

可以看出 FreeRTOS 针对不同的编译环境和 MCU 都有不同的“桥梁”,我们这里就以 MDK 编译环境下的 STM32F103 为例。MemMang 这个文件夹是跟内存管理相关的,我们移植的时候是必须的,具体内容我们后面会专门有一章来讲解。

Keil 文件夹里面的东西肯定也是必须的,但是我们打开Keil文件夹以后里面只有一个文件:See-also-the-RVDS-directory.txt

这个 txt 文件是什么鬼?别急嘛!看文件名字“See-also-the-RVDS-directory”,意思就是参考RVDS文件夹里面的东西!哎,好吧,再打开 RVDS 文件夹。

RVDS 文件夹针对不同的架构的 MCU 做了详细的分类,STM32F103就参考ARM_CM3,打开 ARM_CM3 文件夹

ARM_CM3 有两个文件,这两个文件就是我们移植的时候所需要的!

以上就是FreeRTOS移植所用到的的,重要的文件讲解。

3.FreeRTOS移植STM32F103单片机

以上说完了各个文件的含义,就开始移植辣!

这里以 ALIENTEK STM32F103 开发板为

分为如下几部分:

1)准备工作

2)FreeRTOS 移植

3)移植验证实验

3.1 准备工作

   3.1.1 准备基础工程

要移植 FreeRTOS,肯定需要一个基础工程,基础工程越简单越好,这里我们就用基础例程库函数中的跑马灯实验来作为基础工程。

3.1.2 FreeRTOS 系统源码获取

FreeRTOS 的系统源码已经详细的讲解过如何获取了,这里我们会将 FreeRTOS 的系统源码开发板光盘的库函数的跑马灯的实例工程中去。

3.2FreeRTOS移植

   3.2.1 向工程中添加相应文件

添加 FreeRTOS 源码

在基础工程中新建一个名为 FreeRTOS 的文件夹

创建 FreeRTOS 文件夹以后就可以将 FreeRTOS 的源码添加到这个文件夹中,添加完以后

如图:

这里有些.c文件可以不添加,可以不添加的文件前文已经说明,这里因为是实例,所以都添加。

注意!,关于portable文件夹,我们只需要留下keil、MemMang和RVDS这三个文件夹,其他的都可以删除掉,完成后如下图:

 

 注意!portable留下这三个文件夹,如果用的其他编译器或者MCU的话请根据实际情况选择

3.2.2 向工程分组中添加文件

打开基础工程,新建分组 FreeRTOS_CORE 和 FreeRTOS_PORTABLE,然后向这两个分组

中添加文件,如图:

分组 FreeRTOS_CORE 中的文件在什么地方就不说了,打开 FreeRTOS 源码一目了然。

重点来说说 FreeRTOS_PORTABLE 分组中的 port.c 和 heap_4.c 是怎么来的,port.c 是 RVDS 文件 夹下的 ARM_CM3 中的文件,因为 STM32F103 是 Cortex-M3 内核的,因此要选择ARM_CM3 中的 port.c 文件。heap_4.c 是 MemMang 文件夹中的,前面说了 MemMang 是跟内存管理相关 的,里面有 5 个 c 文件:heap_1.c、heap_2.c、heap_3.c、heap_4.c 和 heap_5.c。这 5 个 c 文件是 五种不同的内存管理方法,就像从北京到上海你可以坐火车、坐飞机,如果心情好的话也可以 走路,反正有很多种方法,只要能到上海就行。这里也一样的,这 5 个文件都可以用来作为 FreeRTOS 的内存管理文件,只是它们的实现原理不同,各有利弊。这里我们选择 heap_4.c,至 于原因,会涉及到FreeRTOS 的内存管理的内容,这里就不多赘述。

3.2.3 添加相应的头文件路径

添加完 FreeRTOS 源码中的 C 文件以后还要添加 FreeRTOS 源码的头文件路径,头文件路

径,如图:

头文件路径添加完成以后编译一下,看看有没有什么错误,结果会发现提示打不开 “FreeRTOSConfig.h”这个文件,如图所示:

 这是因为缺少 FreeRTOSConfig.h 文件,这个文件在哪里找呢?你可以自己创建,显然这不是一个明智的做法。

我们可以找找 FreeRTOS 的官方移植工程中会不会有这个文件,打开FreeRTOS 针对STM32F103 的移植工程文件,文件夹是 CORTEX_STM32F103_Keil,打开以后会官方的移植工程中有这个文件,我们可以使用这个文件,但是建议大家使用我们例程中的 FreeRTOSConf.h 文件,这个文件是 FreeRTOS 的系统配置文件,不同的平台其配置不同,但是我们提供的例程中的这个文件肯定是针对 ALIENTEK 开发板配置正确的。这个文件复制到什么地方大家可以自行决定,这里我为了方便放到了 FreeRTOS 源码include文件夹下。

FreeRTOSConfig.h 是何方神圣?看名字就知道,他是 FreeRTOS 的配置文件,一般的操作系统都有裁剪、配置功能,而这些裁剪及配置都是通过一个文件来完成的,也就是FreeRTOSConfig.h

     到这里我们再编译一次,没有错误!

3.3 修改 SYSTEM 文件

     SYSTEM 文件夹里面的文件一开始是针对 UCOS 而编写的,所以如果使用 FreeRTOS 的话就需要做相应的修改。本来打算让 SYSTEM 文件夹也支持 FreeRTOS,但是这样的话会导致SYSTEM 里面的文件太过于复杂,这样非常不利于初学者学习,所以这里就专门针对 FreeRTOS修改了 SYSTEM 里面的文件。

3.3.1 修改 sys.h 文件

 sys.h 文件修改很简单,在 sys.h 文件里面用宏 SYSTEM_SUPPORT_OS 来定义是否使用 OS,我们使用了 FreeRTOS,所以应该将宏 SYSTEM_SUPPORT_OS 改为 1。

3.3.2 修改 usart.c 文件

usart.c 文件修改也很简单,usart.c 文件有两部分要修改,一个是添加 FreeRTOS.h 头文件,

默认是添加的 UCOS 中的 includes.h 头文件,修改以后如下

另外一个就是 USART1 的中断服务函数,在使用 UCOS 的时候进出中断的时候需要添加OSIntEnter()和 OSIntExit(),使用 FreeRTOS 的话就不需要了,所以将这两行代码删除掉,修改以后如下:

3.3.3 修改 delay.c 文件

delay.c 文件修改的就比较大了,因为涉及到 FreeRTOS 的系统时钟,delay.c 文件里面有 4

个函数需要修改,还要添加应该函数,分别是,SysTick_Handler(),delay_init() delay_us(u32nus) delay_ms(u32 nms),delay_xms(u32 nms) 

delay.c的代码如下:

#include "delay.h"#include "FreeRTOS.h"					//ucos 使用	  
#include "task.h"	
//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32开发板
//使用SysTick的普通计数模式对延迟进行管理(适合STM32F10x系列)
//包括delay_us,delay_ms
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2010/1/1
//版本:V1.8
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//********************************************************************************
//V1.2修改说明
//修正了中断中调用出现死循环的错误
//防止延时不准确,采用do while结构!
//V1.3修改说明
//增加了对UCOSII延时的支持.
//如果使用ucosII,delay_init会自动设置SYSTICK的值,使之与ucos的TICKS_PER_SEC对应.
//delay_ms和delay_us也进行了针对ucos的改造.
//delay_us可以在ucos下使用,而且准确度很高,更重要的是没有占用额外的定时器.
//delay_ms在ucos下,可以当成OSTimeDly来用,在未启动ucos时,它采用delay_us实现,从而准确延时
//可以用来初始化外设,在启动了ucos之后delay_ms根据延时的长短,选择OSTimeDly实现或者delay_us实现.
//V1.4修改说明 20110929
//修改了使用ucos,但是ucos未启动的时候,delay_ms中中断无法响应的bug.
//V1.5修改说明 20120902
//在delay_us加入ucos上锁,防止由于ucos打断delay_us的执行,可能导致的延时不准。
//V1.6修改说明 20150109
//在delay_ms加入OSLockNesting判断。
//V1.7修改说明 20150319
//修改OS支持方式,以支持任意OS(不限于UCOSII和UCOSIII,理论上任意OS都可以支持)
//添加:delay_osrunning/delay_ostickspersec/delay_osintnesting三个宏定义
//添加:delay_osschedlock/delay_osschedunlock/delay_ostimedly三个函数
//V1.8修改说明 20150519
//修正UCOSIII支持时的2个bug:
//delay_tickspersec改为:delay_ostickspersec
//delay_intnesting改为:delay_osintnesting
//  static u8  fac_us=0;							//us延时倍乘数			   
static u16 fac_ms=0;							//ms延时倍乘数,在ucos下,代表每个节拍的ms数extern void xPortSysTickHandler(void);
//systick 中断服务函数,使用 OS 时用到
void SysTick_Handler(void)
{ if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行{xPortSysTickHandler();}
}//初始化延迟函数
//SYSTICK 的时钟固定为 AHB 时钟,基础例程里面 SYSTICK 时钟频率为 AHB/8
//这里为了兼容 FreeRTOS,所以将 SYSTICK 的时钟频率改为 AHB 的频率!
//SYSCLK:系统时钟频率
void delay_init()
{
u32 reload;
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟 HCLK
fac_us=SystemCoreClock/1000000; //不论是否使用 OS,fac_us 都需要使用
reload=SystemCoreClock/1000000; //每秒钟的计数次数 单位为 M 
reload*=1000000/configTICK_RATE_HZ; //根据 configTICK_RATE_HZ 设定溢出
//时间 reload 为 24 位寄存器,最大值:
//16777216,在 72M 下,约合 0.233s 左右
fac_ms=1000/configTICK_RATE_HZ; //代表 OS 可以延时的最少单位 
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启 SYSTICK 中断
SysTick->LOAD=reload; //每 1/configTICK_RATE_HZ 秒中断
//一次
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启 SYSTICK 
}//延时 nus
//nus:要延时的 us 数.
//nus:0~204522252(最大值即 2^32/fac_us@fac_us=168) 
void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //LOAD 的值 
ticks=nus*fac_us; //需要的节拍数
told=SysTick->VAL; //刚进入时的计数器值
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{
//这里注意一下 SYSTICK 是一个递减的计数器就可以了. 
if(tnow<told)tcnt+=told-tnow;
else tcnt+=reload-tnow+told; 
told=tnow;
if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
} 
}; 
}//延时 nms,会引起任务调度
//nms:要延时的 ms 数
//nms:0~65535
void delay_ms(u32 nms)
{
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
{
if(nms>=fac_ms) //延时的时间大于 OS 的最少时间周期
{ vTaskDelay(nms/fac_ms); //FreeRTOS 延时
}
nms%=fac_ms; //OS 已经无法提供这么小的延时了,
//采用普通方式延时 
}
delay_us((u32)(nms*1000)); //普通方式延时
}
//延时 nms,不会引起任务调度
//nms:要延时的 ms 数
void delay_xms(u32 nms)
{
u32 i;
for(i=0;i<nms;i++) delay_us(1000);
}

其中delay_xms()是添加的函数,需要在.h中声明,修改SysTick_Handler()时需要在之前添加extern void xPortSysTickHandler(void);

delay_us()us 级延时函数,delay_ms delay_xms()都是 ms 级的延时函数,delay_us()delay_xms()不会导致任务切换。delay_ms()其实就是对 FreeRTOS 中的延时函数 vTaskDelay()的简单封装,所以在使用 delay_ms()的时候就会导致任务切换。

delay.c 修改完成以后编译一下,会提示如图所示错误:

2.2.2.1 的错误提示表示在 port.cdelay.c stm32f10x_it.c 中三个重复定义的函数:

SysTick_Handler()SVC_Handler()PendSV_Handler(),这三个函数分别为滴答定时器中断服务函数、SVC 中断服务函数和 PendSV 中断服务函数,将 stm32f10x_it.c 中的三个函数屏蔽掉,如图所示:

再次编译代码,应该没有错误了,如果还是错误的话,比如

xTaskGetSchedulerState()函数报错

taskSCHEDULER_NOT_STARTED没有定义

等问题,这里我单独写了一个篇章,方便查看:

《FreeRTOS初步移植出现的xTaskGetSchedulerState()函数报错,taskSCHEDULER_NOT_STARTED没有定义的问题》

3.4 移植验证实验

1. 实验目的

编写简单的 FreeRTOS 应用代码,测试 FreeRTOS 的移植是否成功。鉴于大家还没正式学习FreeRTOS,可以直接将本实验代码复制粘贴到自己的移植工程中。

2. 实验设计

本实验设计四个任务:start_task()、led0_task ()、led1_task ()和 float_task(),这四个任务的

任务功能如下:

start_task():用来创建其他三个任务。

led0_task ():控制 LED0 的闪烁,提示系统正在运行。

led1_task ():控制 LED1 的闪烁。

实验主函数代码如下:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
//#include "stm32f10x.h"                  // Device header/************************************************
ALIENTEK 战舰 STM32F103 开发板 FreeRTOS 实验 2-1
FreeRTOS 移植实验-库函数版本
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com 
关注微信公众平台微信号:"正点原子",免费获取 STM32 资料。
广州市星翼电子科技有限公司 
作者:正点原子 @ALIENTEK
************************************************/
#define START_TASK_PRIO 1 //任务优先级
#define START_STK_SIZE 128 //任务堆栈大小
TaskHandle_t StartTask_Handler; //任务句柄
void start_task(void *pvParameters); //任务函数
#define LED0_TASK_PRIO 2 //任务优先级
#define LED0_STK_SIZE 50 //任务堆栈大小
TaskHandle_t LED0Task_Handler; //任务句柄
void led0_task(void *p_arg); //任务函数
#define LED1_TASK_PRIO 3 //任务优先级
#define LED1_STK_SIZE 50 //任务堆栈大小
TaskHandle_t LED1Task_Handler; //任务句柄
void led1_task(void *p_arg); //任务函数
int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组 4delay_init(); //延时函数初始化 uart_init(115200); //初始化串口LED_Init(); //初始化 LED//创建开始任务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(); //开启任务调度
}
void start_task(void *pvParameters)
{taskENTER_CRITICAL(); //进入临界区// 创建 LED0 任务xTaskCreate((TaskFunction_t )led0_task, (const char* )"led0_task", (uint16_t )LED0_STK_SIZE, (void* )NULL,(UBaseType_t )LED0_TASK_PRIO,(TaskHandle_t* )&LED0Task_Handler); //创建 LED1 任务xTaskCreate((TaskFunction_t )led1_task, (const char* )"led1_task", (uint16_t )LED1_STK_SIZE, (void* )NULL,(UBaseType_t )LED1_TASK_PRIO,(TaskHandle_t* )&LED1Task_Handler); vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL(); //退出临界区
}
//LED0 任务函数
void led0_task(void *pvParameters)
{while(1){LED0=~LED0;vTaskDelay(500);}
} 
//LED1 任务函数
void led1_task(void *pvParameters)
{while(1){LED1=0;vTaskDelay(200);LED1=1;vTaskDelay(800);}
}

测试代码中创建了3个任务:LED0测试任务、LED1测试任务和浮点测试任务,它们的任务函数分别为:led0_task()led1_task()led0_task()led1_task()任务很简单,就是让 LED0

LED1 周期性闪烁。 由于我们只是用测试代码来测试FreeRTOS是否移植成功的,所以关于具体的函数的调用方法这些不要深究,后面会有详细的讲解!

实验程序运行结果分析

编译并下载代码到 STM32F103 开发板中,下载进去以后会看到 LED0 和 LED1 开始闪烁LED0 均匀闪烁,那是因为我们在 LED0 的任务代码中设置好的 LED0 亮 500ms,灭 500ms。

LED1 亮的时间短,灭的时间长,这是因为在 LED1 的任务代码中设置好的亮 200ms,灭 800ms。

总结:

        初学FreeRTOS,基本了解其构成,并进行了初步移植,建议大家还是从官方文档开始看,一步步去解析FreeRTOS,虽然Cubemx可以直接生成FreeRTOS,但从学习者的角度来看,我们更应该深入了解FreeRTOS,发挥其裁剪的功能,这样才能与别人拉开差距!希望这篇文章能帮助到大家!

下面是我所移植成功的代码:

通过百度网盘分享的文件:跑马灯实验--Freertos移植
链接:https://pan.baidu.com/s/1-SY4iWqYZJSkQX5LdAOwJQ 
提取码:j72l

相关文章:

《基于STMF103的FreeRTOS内核移植》

目录 1.FreeRTOS资料下载与出处 1.1官网下载&#xff0c;网址&#xff1a;www.freertos.org 1.2在正点原子官网&#xff0c;任意STM32F1的开发板资料A盘里&#xff0c; 2.FreeRTOS移植重要文件讲解 2.1 FreeRTOS与FreeRTOS-Plus文件夹 2.2 Demo、Lincence、Source ●Demo文件…...

一七二、Vue3性能优化方式

Vue 3 的性能优化相较于 Vue 2 有了显著提升&#xff0c;利用新特性和改进方法可以更高效地构建和优化应用。以下是 Vue 3 的常见性能优化方法及示例。 1. 使用组合式 API (Composition API) Vue 3 引入的组合式 API&#xff0c;通过逻辑拆分和复用来实现更高效的代码组织和性…...

软件测试--BUG篇

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 目录 1. 软件测试的⽣命周期 2. BUG 1. BUG 的概念 2. 描述bug的要素 3.bug级别 4.bug的⽣命周期 5 与开发产⽣争执怎…...

Scikit-learn和Keras简介

一&#xff0c;Scikit-learn是一个开源的机器学习库&#xff0c;用于Python编程语言。它建立在NumPy、SciPy和matplotlib这些科学计算库之上&#xff0c;提供了简单有效的数据挖掘和数据分析工具。Scikit-learn库包含了许多用于分类、回归、聚类和降维的算法&#xff0c;包括支…...

python在word的页脚插入页码

1、插入简易页码 import win32com.client as win32 from win32com.client import constants import osdoc_app win32.gencache.EnsureDispatch(Word.Application)#打开word应用程序 doc_app.Visible Truedoc doc_app.Documents.Add() footer doc.Sections(1).Footers(cons…...

Java面试题十四

一、Java中的JNI&#xff08;Java Native Interface&#xff09;是什么&#xff1f;它有什么用途&#xff1f; Java中的JNI&#xff08;Java Native Interface&#xff09;是Java提供的一种编程框架&#xff0c;它允许Java代码与本地&#xff08;Native&#xff09;代码&#x…...

yarn : 无法加载文件,未对文件 进行数字签名。无法在当前系统上运行该脚本。

执行这个命令时报错&#xff1a;yarn --registryhttps://registry.npm.taobao.org yarn : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\yarn.ps1。未对文件 C:\Users\Administ rator\AppData\Roaming\npm\yarn.ps1 进行数字签名。无法在当前系统上运行该脚本。有…...

Hadoop——HDFS

什么是HDFS HDFS&#xff08;Hadoop Distributed File System&#xff09;是Apache Hadoop的核心组件之一&#xff0c;是一个分布式文件系统&#xff0c;专门设计用于在大规模集群上存储和管理海量数据。它的设计目标是提供高吞吐量的数据访问和容错能力&#xff0c;以支持大数…...

计算机的一些基础知识

文章目录 编程语言 程序 所谓程序&#xff0c;就是 一组指令 以及 这组指令要处理的数据。狭义上来说&#xff0c;程序对我们来说&#xff0c;通常表现为一组文件。 程序 指令 指令要处理的数据。 编程语言发展 机器语言&#xff1a;0、1 二进制构成汇编语言&#xff1a;…...

学习RocketMQ(记录了个人艰难学习RocketMQ的笔记)

一、部署单点RocketMQ Docker 部署 RocketMQ (图文并茂超详细)_docker 部署rocketmq-CSDN博客 这个博主讲的很好&#xff0c;可食用&#xff0c;替大家实践了一遍 二、原理篇 为什么使用RocketMQ&#xff1a; 为什么选择RocketMQ | RocketMQ 关于一些原理&#xff0c;感觉…...

【设计模式】策略模式定义及其实现代码示例

文章目录 一、策略模式1.1 策略模式的定义1.2 策略模式的参与者1.3 策略模式的优点1.4 策略模式的缺点1.5 策略模式的使用场景 二、策略模式简单实现2.1 案例描述2.2 实现代码 三、策略模式的代码优化3.1 优化思路3.2 抽象策略接口3.3 上下文3.4 具体策略实现类3.5 测试 参考资…...

list与iterator的之间的区别,如何用斐波那契数列探索yield

问题 list与iterator的之间的区别是什么&#xff1f;如何用斐波那契数列探索yield&#xff1f; 2 方法 将数据转换成list,通过对list索引和切片操作&#xff0c;以及可以进行添加、删除和修改元素。 iterator是一种对象&#xff0c;用于遍历可迭代对象&#xff08;如列表、元组…...

抖音店铺数据也就是抖店,如何使用小店数据集来挖掘价值?

​ 抖音商家现在基本达到二百多万家抖店&#xff0c;有一些公司可能会根据开放的数据研究行业分布、GMV等等&#xff0c;就像是也出了专业的一些平台如“蝉妈妈”、“达多多”&#xff0c;对我来说受限制就是难受。 当然也有很多大型合法的数据平台有抖店数据集&#xff0c;但…...

KubeVirt 安装和配置 Windows虚拟机

本文将将介绍如何安装 KubeVirt 和使用 KubeVirt 配置 Windows 虚拟机。 前置条件 准备 Ubuntu 操作系统&#xff0c;一定要安装图形化界面。 安装 Docker&#xff08;最新版本&#xff09; 安装 libvirt 和 TigerVNC&#xff1a; apt install libvirt-daemon-system libvir…...

CM API方式设置YARN队列资源

简述 对于CDH版本我们可以参考Fayson的文章,本次是CDP7.1.7 CM7.4.4 ,下面只演示一个设置队列容量百分比的示例,其他请参考cloudera官网。 获取cookies文件 生成cookies.txt文件 curl -i -k -v -c cookies.txt -u admin:admin http://192.168.242.100:7180/api/v44/clusters …...

Mysql常用语法一篇文章速成

文章目录 前言前置环境数据库的增删改查查询数据查询所有条件查询多条件查询模糊查询分页查询排序查询分组查询⭐️⭐️关联查询关联分页查询 添加数据insert插入多条记录不指定列名(适用于所有列都有值的情况) 更新数据更新多条记录更新多个列更新不满足条件的记录 删除统计数…...

Intel nuc x15 重装系统步骤和注意事项(LAPKC71F、LAPKC71E、LAPKC51E)

注意本教程的对象是11代CPU&#xff0c;英伟达独显的nuc x15&#xff0c;不是12代arc显卡的。 x15安装win11 24h2&#xff0c;如果在装系统时联网&#xff0c;windows自动下载的最新驱动有兼容问题&#xff0c;会导致【英特尔显卡控制中心】装不上&#xff0c;或者【英特尔nuc…...

Linux之实战命令59:iwlist应用实例(九十三)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…...

数据库_SQLite3

下载 1、更新软件源&#xff1a; sudo apt-get update 2、下载SQLite3&#xff1a; sudo apt-get install sqlite3 3、验证&#xff1a; sqlite3启动数据库&#xff0c;出现以下界面代表运行正常。输入 .exit 可以退出数据库 4、安装sqlite3的库 sudo apt-get install l…...

.Net Framework里演示怎么样使用StringBuilder、Math.Min和String.Format

StringBuilder、Math.Min和String.Format, 这几个功能都是我们经常使用的功能, 但是怎么样正确地使用,还是得向微软的开发人员学习。 他们在写.Net Framework的源码时,就会大量使用。 因此,我们可以多看看这分代码,就可以理解他们怎么样使用的。 他们的使用方式,一…...

Oracle创建存储过程,创建定时任务

在Oracle数据库中&#xff0c;创建存储过程和定时任务&#xff08;也称为调度任务&#xff09;是常见的数据库管理任务。以下是创建存储过程和定时任务的步骤和说明。 创建存储过程 创建存储过程的sql脚本 create or replace procedure 存储过程名称... is begin脚本逻辑...…...

<HarmonyOS第一课>应用/元服务上架的课后习题

善者&#xff0c;吾善之&#xff1b; 不善者&#xff0c;吾亦善之&#xff0c;德善。 信者&#xff0c;吾信之&#xff1b; 不信者&#xff0c;吾亦信之&#xff0c;德信。 圣人在天下&#xff0c;歙歙焉为天下浑其心&#xff0c;百姓皆注其耳目&#xff0c;圣人皆孩之。 通过&…...

【Python】探索函数的奥秘:从基础到高级的深度解析(下)

目录 &#x1f354; 函数的参数进阶 1、函数的参数 2、函数的参数类型(调用) 2.1 位置参数 2.2 关键词参数&#xff08;Python特有&#xff09; 3、函数定义时缺省参数&#xff08;参数默认值&#xff09; 4、不定长参数 4.1 不定长元组&#xff08;位置&#xff09;参数…...

ima.copilot:智慧因你而生

在数字化时代&#xff0c;信息的获取、处理和创作已经成为我们日常工作和学习中不可或缺的一部分。腾讯公司推出的ima.copilot&#xff08;简称ima&#xff09;正是为了满足这一需求&#xff0c;它是一款由腾讯混元大模型提供技术支持的智能工作台产品&#xff0c;旨在通过智能…...

Vue-$el属性

原博客地址&#xff1a;深入 Vue.js 的心脏&#xff1a;全面剖析 $el 属性_vue $el-CSDN博客 目录 1 $el是什么 1.1 $el本质 1.2 访问$el时机 1.3 $el与模板的关系 2 $el使用场景 2.1 集成第三方库 2.2 操作DOM元素样式 2.3 处理焦点和事件 2.4 实现自定义指令 3 $e…...

LLC Power Switches and Resonant Tank 笔记

1.概述 上面是一个典型的LLC电路。注意Lm是励磁电感&#xff0c;就是次级线圈空载时的主变压器电感&#xff0c;据说在计算谐振频率时无需关心。然后&#xff0c;作为DCDC电源&#xff0c;它通过调整谐振频率&#xff0c;来改变输出的电流。负载越大&#xff0c;频率越低&#…...

Python 如何在 Web 环境中使用 Matplotlib 进行数据可视化

Python Matplotlib 在 Web 环境中的可视化 数据可视化是数据科学和分析中一个至关重要的部分&#xff0c;它能帮助我们更好地理解和解释数据。在现代应用中&#xff0c;越来越多的开发者希望能够将数据可视化结果展示在网页上。Matplotlib 是 Python 中最常用的数据可视化库之…...

C#-数组:一维数组、二维数组、交错数组

数组&#xff1a;声明初始化过后&#xff0c;就不能在原有的基础上进行 添加 或者 删除 了 一&#xff1a;一维数组 一般将一维数组简称为数组 1.1 数组的声明 int[] arr1; 没有分配房间。初始化后就分配房间了int[] arr2 new int[5]; 存在默认值&#xff0c;为0int[] arr3…...

动态规划应该如何学习?

动态规划如何学习 参考灵神的视频和题解做的笔记&#xff08;灵神YYDS&#xff0c;以后也都会用这套逻辑去思考&#xff09; 枚举选哪个&#xff1a; 动态规划入门&#xff1a;从记忆化搜索到递推_哔哩哔哩_bilibili 746. 使用最小花费爬楼梯 - 力扣&#xff08;LeetCode&a…...

【力扣 + 牛客 | SQL题 | 每日4题】牛客SQL热题210,213,212,219

1. 力扣SQL1076&#xff1a;项目员工2 1.1 题目&#xff1a; 表&#xff1a;Project ---------------------- | Column Name | Type | ---------------------- | project_id | int | | employee_id | int | ---------------------- (project_id, employee_id) 是…...