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

[STM32]从零开始的STM32 FreeRTOS移植教程

一、前言

        如果能看到这个教程的话,说明大家已经学习嵌入式有一段时间了。还记得嵌入式在大多数时候指的是什么吗?是的,我们所说的学习嵌入式大部分时候都是在学习嵌入式操作系统。从简单的一些任务状态机再到复杂一些的RTOS,再到最复杂的Linux,这些都属于嵌入式操作系统的一种,只是简单与复杂的区别。在之前,我们开发STM32时采用的都是裸机开发所以对实时系统并没有什么概念,接触RTOS会接触到一种新的编程方式。当然,因为RTOS已经引入了系统的概念了,所以代码看起来与调试起来也更加抽象。但,就现在而言,实时操作系统仍然是许多公司要求嵌入式工程师必会的技能之一。所以,如果你准备好了,就让我们一起来移植RTOS吧!

二、在开始之前

        因为已经涉及到嵌入式系统了,所以还请学习这篇教程的小伙伴有一定的STM32基础,我始终不推荐纯小白直接接触RTOS。在这篇教程中,我会教大家如何下载RTOS的代码固件包,如何将RTOS移植到对应的单片机中,以及如何解决一些常见的问题。当然,你也可以下载我下面给的资料,资料中会包含本次会用到的RTOS源码包和我已经移植好的工程:

RTOS移植资料:https://pan.baidu.com/s/1YbfUm1LUSomslaGWqJ-g4w?pwd=clxm 
提取码:clxm

三、芯片的选择        

        因为RTOS是一个嵌入式操作系统,RTOS强调的是代码的实时性,比起裸机开发,它并不能提高芯片的性能,相反,它是一个消耗芯片性能的软件。在运行了RTOS以后,我们芯片的资源就被占用了一部分,这也会让我们的可编程范围变小了。既然是这样,那为什么我们还需要嵌入式操作系统呢?当然是为了实时性呀,裸机在开发时,代码始终顺序执行,这也导致了我们有的步骤要等很久才会执行到,在某些特定的情况下就可能出现问题。如果使用实时操作系统,它会合理分配每一个任务的执行时间,保证我们每一个任务都执行一段时间,不会有任务长期阻塞程序。当然,我们这次的重点并不是RTOS的原理,如果想要了解RTOS详细原理与系统性的学习的话,还是建议大家去看一些视频教程。这里话又说回来,因为RTOS会消耗一部分的性能,所以有的芯片可能无法运行RTOS,这里我会使用STM32F407ZGT6进行RTOS的移植演示,我并不推荐大家使用STM32F103C6T6单片机,这款单片机在移植RTOS时可能会出现你无法解决的错误。在移植RTOS时尽量选择RAM与ROM都比较大的芯片。这样代码在编译时也不容易报错。

四、RTOS系统固件包的下载

        RTOS的虽说是一个操作系统,但是本质上还是代码构成的,在这里面我们仍然可以看到.c .h文件。所以,移植RTOS简单来说,就是将对应的C语言代码在STM32中运行起来。所以我们现在需要下载RTOS的固件包,这里我们直接在浏览器中搜索“FreeRTOS”:

我们可以看到,这里搜索出来的第一个网站就是FreeRTOS的官网了:

当然,如果你没有找到FreeRTOS的官网的话,也可以点击下方的链接前往:

FreeRTOS官网:FreeRTOS™ - FreeRTOS™

进入FreeRTOS的官网以后,就可以看到以下页面了:

如果你这里不是中文的,可以点击右上角这里切换语言:

接着,我们点击网页中的“下载”:

点击了下载以后,弹出的窗口中会让我们选择要下载的版本:

这里我推荐大家使用2022或者2020的版本,这些版本经过了几年的迭代已经非常稳定了。如果你是小白的话,建议下载和我一样的版本,以保证文件的统一。

我们选择好版本以后,直接点击“Download”:

随后浏览器就会弹出下载了:

我们将其下载到我们能找到的地方:

如果你这里无法打开RTOS的官网或者是无法下载RTOS的固件包,那么你就可以打开我给的资料中的RTOS固件包文件夹,这里有我已经下载好的固件包:

下面,我们再将下载的压缩包解压得到以下文件夹:

至此,我们RTOS系统的固件包就已经下载完成了。

五、RTOS的移植

        当我们准备好了RTOS系统的固件包以后,就可以开始移植了,这里我们移植RTOS系统是在原本的工程之上,所以,首先就要保证我们有一个对应芯片的对应工程模板。我这里使用的是STM32F407ZGT6芯片,所以准备的也是STM32F407ZGT6的工程,如图:

我们进入工程,这里需要我们的工程编译没有错误:

下面我们直接写一个LED的代码,证明我们的硬件没有问题,这个地方的点灯代码很简单,就不多说了,我的LED在PA12口上,并且为高电平点亮:

将程序编译下载到芯片后,就可以看到LED已经亮起了,证明我们的硬件方面没有问题:

下面,我们就要在这个原本的工程上移植RTOS。

首先需要在工程的主目录下新建一个RTOS的文件夹用来存放RTOS的相关文件:

我们进入这个RTOS的文件夹,然后新建三个文件夹,分别是“inc”,“src”,“port”:

这里的inc文件夹用来存放RTOS的头文件和配置文件,src用来存放RTOS的源文件,port用来存放RTOS的内存管理文件。

我们现在去RTOS固件包解压出来的文件夹中复制文件,我们进入解压后的文件夹就可以看到以下文件夹和文件:

这里我们再进入“FreeRTOSv202212.01”文件夹下的“FreeRTOS”文件夹,可以看到以下文件和文件夹:

然后我们再进入“FreeRTOS”文件夹下的“Source”文件夹,这里面的文件就是我们要用的了:

这里我们首先将“Source”文件夹下的所有.c的文件复制到刚才工程目录中创建的“RTOS\src”文件夹下:

这里需要注意的是,我们只需要复制.c,多余的文件如果被复制过去了删除就行了。

随后,我们再把“Source”文件夹下的“include”文件夹下的所有.h的文件复制到“RTOS\inc”文件夹下

这里同样的只要.h文件,不能复制别的文件。

随后我们进入“Source”文件夹下的“portable”文件夹,看到以下文件夹:

这里包含了RTOS的内存管理文件和不同编译器的相关文件。这里我们首先来复制内存管理文件,我们进入“portable”文件夹下的“MemMang”文件夹,将“heap_4.c”文件复制到工程目录下的“RTOS\port下”:

这里的内存管理文件我们一般都用4,如果你是小白的话请不要随意修改。

随后我们再打开“portable”文件夹下的“RVDS”文件夹,可以看到以下文件夹:

这里面对应了RVDS集成编译环境不同的ARM内核的编译规则文件。因为我这里使用的是STM32F407ZGT6单片机,所以这里首先肯定要选择M4内核,因为STM32F407ZG系列都不附带MPU所以我们这里直接选择“ARM_CM4F”文件夹,我们将“RVDS\ARM_CM4F”下的文件复制到工程目录下的“RTOS\port”下:

至此,我们RTOS的基本文件就已经复制完成了,这里我们还需要复制一下配置文件。配置文件被放在了“FreeRTOSv202212.01\FreeRTOS\Demo”目录下,进入这个目录,我们就能看到非常多的芯片型号,这些芯片官方都提供的相关的Demo,我们只需要在对应的芯片Demo中寻找配置文件即可:

因为这里我使用的是STM32F407ZGT6的芯片,所以我芯片所对应的配置文件就被存放在了“CORTEX_M4F_STM32F407ZG-SK”文件夹下。大家可以根据自己的芯片型号和对应的IDE寻找相关的Demo:

这里我们进入“CORTEX_M4F_STM32F407ZG-SK”文件夹,文件夹中的“FreeRTOSConfig.h”就是我们需要的配置文件了,我们将其复制到工程目录下的“RTOS\inc”下:

至此,我们RTOS运行所需的所有文件都已经复制完成了,我们直接打开工程:

接着,我们把刚才复制的文件添加的工程中,点击菜单栏中的箱子:

我们这里新建三个文件夹,分别是“RTOS\inc”,“RTOS\src”,“RTOS\port”:

接着将对应文件夹中的文件添加进来,这里一定要对应好,不要添加错了:

这里要注意的是,一定是把对应的所有文件添加进来以后再进行下一步。

我们再在魔术棒中将对应文件夹的路径添加进来,这里路径添加很基础,就不细讲了:

将文件添加进来以后,我们点击编译,这里的编译肯定会报错的,我们慢慢来解决:

这里的错误提示我们“configSYSTICK_CLOCK_HZ”这个变量没有定义。这里我们去到配置文件中,大概在40行左右,可以看到这样一条条件编译:

这里是为了判断是否是使用IAR编译器,我们这里使用的是keil,这条条件编译肯定不会过的。我们将这一条条件编译修改一下,改成下面这样:

#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)

这里修改了条件编译以后就可以兼容keil,IAR, GCC编译器了。

我们再次编译,出现三个重复定义的错误,因为这三个函数在STM32原本的库中已经被定义过了,但是在RTOS的库中又被定义了一次。既然我们要使用RTOS那当然也要用RTOS的处理函数,这里我们直接将原本的函数注释掉:

原本的函数被写在了“stm32f4xx_it.c”中,我们分别将其注释掉,通过报错我们可以得知,这里被重复定义的函数分别是“PendSV_Handler”,“SVC_Handler”,“SysTick_Handler”:

注释后如图:

这里将重复定义的函数注释掉以后,我们再次编译,我们可以看到这几个函数没有被定义:

这里又需要我们修改配置文件了,我们同样的打开配置文件我们将配置文件中的如下几项的值改为0:

#define configUSE_IDLE_HOOK				0
#define configUSE_TICK_HOOK				0
#define configCHECK_FOR_STACK_OVERFLOW	0
#define configUSE_MALLOC_FAILED_HOOK	0

修改完配置文件以后,我们再次编译:

可以看到,现在已经没有报错了,我们现在就算是移植完成了,我们可以写一点代码来试一下,首先回到“main.c”,这里我们先在main.c中引入RTOS相关的头文件:

#include "freertos.h"
#include "task.h"

然后我们创建一个任务函数:

void LED(void* age)
{while(1){GPIO_ResetBits(GPIOA,GPIO_Pin_12);vTaskDelay(500);GPIO_SetBits(GPIOA,GPIO_Pin_12);vTaskDelay(500);}
}

这里就是我们的任务函数了,控制了LED的亮灭,注意,任务函数进入以后一定是在一个死循环中,任务函数不能返回,不然可能引发一些错误。在使用了RTOS以后,我们的所以延时都要使用RTOS中的相对延时。

在主函数中,我们写引脚的初始化和任务的创建:

int main(void)
{TaskHandle_t myTaskHandle_t;GPIO_InitTypeDef  GPIO_InitStructure;delay_init(168);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_12);xTaskCreate(LED,"LED",128,NULL,2,&myTaskHandle_t);vTaskStartScheduler();while(1){}
}

这里主要解释一下“xTaskCreate”函数。xTaskCreate用于创建RTOS中的任务。这里的第一个参数为任务函数的名称,我们这里任务函数名为“LED”所以第一个参数就传入LED,第二个参数是任务的名字,要求传入字符串格式的,我们这里传入一个字符串即可。第三个参数是为任务分配的内存,我们这里的任务只是点灯而已,所以不用分配太大,直接128就已经很充足了。第四个参数是向任务中传入的参数,我们这里没有参数要传入,直接写NULL,第五个参数是任务的优先级,因为只有一个任务,也不存在谁优先的问题,随便写个优先级即可。最后要我们传入一个“TaskHandle_t ”类型的结构体指针,我们直接定义一个结构体,取它的地址传入即可。

随后,我们再使用vTaskStartScheduler函数启动任务调度器。当调度器启动以后,STM32就已经被系统接管了。

我们将代码编译下载到开发板中,可以看到LED正常闪烁:

至此,我们的RTOS已经算是移植成功了。当然RTOS的知识还很多,能够运用只是第一步。

六、结语

        本次我们讲解了如何下载RTOS的固件包,以及如何复制RTOS的相关文件,以及在遇到错误以后如何解决。内容比较多,还是希望大家多吸收一下。那么最后,感谢大家的观看!

相关文章:

[STM32]从零开始的STM32 FreeRTOS移植教程

一、前言 如果能看到这个教程的话,说明大家已经学习嵌入式有一段时间了。还记得嵌入式在大多数时候指的是什么吗?是的,我们所说的学习嵌入式大部分时候都是在学习嵌入式操作系统。从简单的一些任务状态机再到复杂一些的RTOS,再到最…...

软件团队的共担责任

问责制被认为是个人与其社会系统之间的纽带,它创造了一种将个人与其行为和绩效联系起来的身份关系。在入门系列的第一篇文章《超越工具和流程:成功软件开发团队的策略》中,我们介绍了问责制的概念,并提出了以下定义: …...

代码美学:MATLAB制作渐变色

输入颜色个数n,颜色类型: n 2; % 输入颜色个数 colors {[1, 0, 0], [0, 0, 1]}; createGradientHeatmap(n, colors); 调用函数: function createGradientHeatmap(n, colors)% 输入检查if length(colors) ~ nerror(输入的颜色数量与n不一…...

Perforce SAST专家详解:自动驾驶汽车的安全与技术挑战,Klocwork、Helix QAC等静态代码分析成必备合规性工具

自动驾驶汽车安全吗?现代汽车的软件包含1亿多行代码,支持许多不同的功能,如巡航控制、速度辅助和泊车摄像头。而且,这些嵌入式系统中的代码只会越来越复杂。 随着未来汽车的互联程度越来越高,这一趋势还将继续。汽车越…...

大模型中常见的微调方法有哪些?

我整理了1000道算法面试题: 获取 这里说的微调主要是指参数微调,参数微调的方法主要有以下几种: - Adapter 在预训练模型每一层(或某些层)中添加Adapter模块(如上图左侧结构所示),微调时冻结预训练模型主体,由Ada…...

MATLAB支持的距离度量

距离度量是用于量化两个点或样本之间差异的一种方法。在不同的领域和应用场景中,距离度量的选择可能会有所不同。 欧几里得距离(Euclidean Distance):这是最直观的距离定义,适用于n维空间中的两点。对于二维空间中的点…...

c++编程玩转物联网:使用芯片控制8个LED实现流水灯技术分享

在嵌入式系统中,有限的GPIO引脚往往限制了硬件扩展能力。74HC595N芯片是一种常用的移位寄存器,通过串行输入和并行输出扩展GPIO数量。本项目利用树莓派Pico开发板与74HC595N芯片,驱动8个LED实现流水灯效果。本文详细解析项目硬件连接、代码实…...

LSA详情与特殊区域

LSA是构成LSDB的重要原材料,在OSPF中发挥很大作用。 报文 通用头部 LS age:LSA寿命,0-3600s Options:可选项 LS type:LSA类型,三要素之一 Link State ID:LSAID 三要素之一 Advertising Ro…...

Leecode刷题C语言之交替组①

执行结果:通过 执行用时和内存消耗如下&#xff1a; 代码如下&#xff1a; int numberOfAlternatingGroups(int* colors, int colorsSize) {int res 0;for (size_t i 0; i < colorsSize; i) {if (colors[i] ! colors[(i - 1 colorsSize) % colorsSize] && col…...

深入解析 Django 中数据删除的最佳实践:以动态管理镜像版本为例

文章目录 引言场景与模型设计场景描述 删除操作详解1. 删除单个 Tag2. 批量删除 Tags3. 删除前确认4. 日志记录 高阶优化与问题分析1. 外键约束与误删保护2. 并发删除的冲突处理3. 使用软删除 结合 Django Admin 的实现总结与实践思考 引言 在现代应用开发中&#xff0c;服务和…...

4457数字示波器 2Gpts的深度存储

4457数字示波器 2Gpts的深度存储 256级灰度等级及四种波形色彩显示 4457M系列数字示波器&#xff0c;带宽从1GHz到4GHz&#xff0c;采样率10GSa/s、20GSa/s&#xff0c;垂直分辨率12bit&#xff0c;存储深度1Gpts&#xff0c;最快波形捕获率70万个波形/秒&#xff0c;独创的…...

【笔记】轻型民用无人驾驶航空器安全操控

《轻型民用无人驾驶航空器安全操控》 理论考试培训材料 法规部分 【民用无人驾驶航空器的分类】 1、如何定义微型、轻型无人驾驶航空器&#xff1f; 微型无人驾驶航空器&#xff0c;是指空机重量小于0.25千克&#xff0c;最大平飞速度不超过40千米/小时&#xff0c;无线电发…...

【leetcode】动态规划

31. 873. 最长的斐波那契子序列的长度 题目&#xff1a; 如果序列 X_1, X_2, ..., X_n 满足下列条件&#xff0c;就说它是 斐波那契式 的&#xff1a; n > 3对于所有 i 2 < n&#xff0c;都有 X_i X_{i1} X_{i2} 给定一个严格递增的正整数数组形成序列 arr &#xff0…...

嵌入式linux系统中图像处理基本方法

目录 2.1 BMP图像处理 2.1.1 BMP文件格式解析 2.1.2 代码实现:将BMP文件解析为RGB格式,在LCD上显示 2.2 JPEG图像处理 2.2.1 JPEG文件格式和libjpeg编译 2.2.2 libjpeg接口函数的解析和使用 2.2.3 使用libjpeg把JPEG文件解析为RGB格式,在LCD上显示 …...

Qt SQL模块概述

Qt SQL支持的数据库 要在项目中使用 Qt SQL 模块&#xff0c;需要在项目配置文件中添加下面一条设置语句&#xff1a; Qt sql在头文件或源文件中使用 Qt SQL 模块中的类&#xff0c;可以使用包含语句&#xff1a; #include <QtSql>这样会将某个 Qt SQL 模块中的所有类…...

PVE相关名词通俗表述方式———多处细节实验(方便理解)

PVE设置初期&#xff0c;对CIDR、 网关、 LinuxBridge、VLAN等很有困惑的朋友一定很需要一篇能够全面通俗易懂的方式去理解PVE 中Linux网桥的工作方式&#xff0c;就像操作一个英雄&#xff0c;多个技能&#xff0c;还是需要一点点去学习理解的&#xff0c;如果你上来就对着别人…...

C语言实现冒泡排序:从基础到优化全解析

一、什么是冒泡排序&#xff1f; 冒泡排序&#xff08;Bubble Sort&#xff09;是一种经典的排序算法&#xff0c;其工作原理非常直观&#xff1a;通过多次比较和交换相邻元素&#xff0c;将较大的元素“冒泡”到数组的末尾。经过多轮迭代&#xff0c;整个数组会变得有序。 二…...

ReentrantLock(可重入锁) Semaphore(信号量) CountDownLatch

目录 ReentrantLock(可重入锁) &Semaphore(信号量)&CountDownLatchReentrantLock(可重入锁)既然有了synchronized&#xff0c;为啥还要有ReentrantLock?Semaphore(信号量)如何确保线程安全呢&#xff1f;CountDownLatch ReentrantLock(可重入锁) &Semaphore(信号量…...

Zookeeper选举算法与提案处理概览

共识算法(Consensus Algorithm) 共识算法即在分布式系统中节点达成共识的算法&#xff0c;提高系统在分布式环境下的容错性。 依据系统对故障组件的容错能力可分为&#xff1a; 崩溃容错协议(Crash Fault Tolerant, CFT) : 无恶意行为&#xff0c;如进程崩溃&#xff0c;只要…...

Jmeter中的断言

7&#xff09;断言 1--响应断言 功能特点 数据验证&#xff1a;验证响应数据是否包含或不包含特定的字符串、模式或值。多种匹配类型&#xff1a;支持多种匹配类型&#xff0c;如文本、正则表达式、文档等。灵活配置&#xff1a;可以设置多个断言条件&#xff0c;满足复杂的测…...

【通俗理解】隐变量的变分分布探索——从公式到应用

【通俗理解】隐变量的变分分布探索——从公式到应用 关键词提炼 #隐变量 #变分分布 #概率模型 #公式推导 #期望最大化 #机器学习 #变分贝叶斯 #隐马尔可夫模型 第一节&#xff1a;隐变量的变分分布的类比与核心概念【尽可能通俗】 隐变量的变分分布就像是一场“捉迷藏”游戏…...

Vivado程序固化到Flash

在上板调试FPGA时&#xff0c;通常使用JTAG接口下载程序到FPGA芯片中&#xff0c;FPGA本身是基于RAM工艺的器件&#xff0c;因此掉电后会丢失芯片内的程序&#xff0c;需要重新烧写程序。但是当程序需要投入使用时不能每一次都使用JTAG接口下载程序&#xff0c;一般FPGA的外围会…...

铲屎官进,2024年宠物空气净化器十大排行,看看哪款吸毛最佳?

不知道最近换毛季&#xff0c;铲屎官们还承受的住吗&#xff1f;我家猫咪每天都在表演“天女散花”&#xff0c;家里没有一块干净的地方&#xff0c;空气中也都是堆积的浮毛&#xff0c;幸好有宠物空气净化器这种清理好物。宠物空气净化器针对宠物浮毛设计&#xff0c;可以有效…...

SpringBoot 项目中使用 spring-boot-starter-amqp 依赖实现 RabbitMQ

文章目录 前言1、application.yml2、RabbitMqConfig3、MqMessage4、MqMessageItem5、DirectMode6、StateConsumer&#xff1a;消费者7、InfoConsumer&#xff1a;消费者 前言 本文是工作之余的随手记&#xff0c;记录在工作期间使用 RabbitMQ 的笔记。 1、application.yml 使…...

嵌入式硬件实战提升篇(二)PCB高速板设计 FPGA核心板带DDR3 PCB设计DDR全面解析

引言&#xff1a;设计一款高速板&#xff0c;供读者学习&#xff0c;FPGA核心板&#xff0c;带一颗DDR3内存&#xff0c;FPGA型号&#xff1a;XC6SLX16-2FTG256C。 随着嵌入式硬件技术的快速发展&#xff0c;高速板设计逐渐成为嵌入式系统设计中的核心技术之一。高速板的设计要…...

2044:【例5.12】回文字串

【题目描述】 输入一串字符,字符个数不超过100,且以“.”结束。 判断它们是否构成回文。 【输入】 一行字符串。 【输出】 是否为回文串。是输出“Yes”&#xff0c;否输出“No。” 【输入样例】 abccb 【输出样例】 No 代码实现 #include <stdio.h> /*2044&#x…...

Sui 链游戏开发实战:用 Move 写一个链上剪刀石头布游戏!

系列文章目录 Task1&#xff1a;hello move&#x1f6aa; Task2&#xff1a;move coin&#x1f6aa; Task3&#xff1a;move nft&#x1f6aa; Task4&#xff1a;move game&#x1f6aa; 更多精彩内容&#xff0c;敬请期待&#xff01;✌️ 文章目录 系列文章目录前言什么是 …...

Prometheus告警带图完美解决方案

需求背景 告警分析处理流程 通常我们收到 Prometheus 告警事件通知后&#xff0c;往往都需要登录 Alertmanager 页面查看当前激活的告警&#xff0c;如果需要分析告警历史数据信息&#xff0c;还需要登录 Prometheus 页面的在 Alerts 中查询告警 promQL 表达式&#xff0c;然…...

深度学习模型:循环神经网络(RNN)

一、引言 在深度学习的浩瀚海洋里&#xff0c;循环神经网络&#xff08;RNN&#xff09;宛如一颗独特的明珠&#xff0c;专门用于剖析序列数据&#xff0c;如文本、语音、时间序列等。无论是预测股票走势&#xff0c;还是理解自然语言&#xff0c;RNN 都发挥着举足轻重的作用。…...

分布式在线评测系统

OnlineJudge 前言所用技术开发环境 1. 需求分析2. 项目宏观结构3. compile_server服务设计3.1 compiler服务设计3.2 runner服务设计3.3 compile_run3.4 compile_server.cpp 4. oj_server服务设计4.1 model设计4.2 view设计4.3 control设计4.3.1 获取题目列表功能4.3.2 获取单个…...

Unity中动态生成贴图并保存成png图片实现

实现原理&#xff1a; 要生成长x宽y的贴图&#xff0c;就是生成x*y个像素填充到贴图中&#xff0c;如下图&#xff1a; 如果要改变局部颜色&#xff0c;就是从x1到x2(x1<x2),y1到y2(y1<y2)这个范围做处理&#xff0c; 或者要想做圆形就是计算距某个点&#xff08;x1,y1&…...

鸿蒙多线程开发——sendable共享容器

1、异步锁机制 在介绍共享容器之前&#xff0c;先介绍异步锁机制。 为了解决多线程并发任务间的数据竞争问题&#xff0c;ArkTS引入了异步锁能力。异步锁可能会被类对象持有&#xff0c;因此为了更方便地在并发实例间获取同一个异步锁对象&#xff0c;AsyncLock对象支持跨线程…...

五天SpringCloud计划——DAY1之mybatis-plus的使用

一、引言 咱也不知道为啥SpringCloud课程会先教mybatis-plus的使用&#xff0c;但是教都教了&#xff0c;就学了吧&#xff0c;学完之后觉得mybatis-plus中的一些方法还是很好用了&#xff0c;本文作为我学习mybatis-plus的总结提升&#xff0c;希望大家看完之后也可以熟悉myba…...

Vue.js基础——贼简单易懂!!(响应式 ref 和 reactive、v-on、v-show 和 v-if、v-for、v-bind)

Vue.js是一个渐进式JavaScript框架&#xff0c;用于构建用户界面。它专门设计用于Web应用程序&#xff0c;并专注于视图层。Vue允许开发人员创建可重用的组件&#xff0c;并轻松管理状态和数据绑定。它还提供了一个虚拟DOM系统&#xff0c;用于高效地渲染和重新渲染组件。Vue以…...

警钟长鸣,防微杜渐,遨游防爆手机如何护航安全生产?

近年来&#xff0c;携非防爆手机进入危险作业区引发爆炸的新闻屡见报端。2019年山西某化工公司火灾&#xff0c;2018年延安某煤业瓦斯爆炸&#xff0c;均因工人未用防爆手机产生静电打火引发。涉爆行业领域企业量大面广&#xff0c;相当一部分企业作业场所人员密集&#xff0c;…...

中国科学院大学研究生学术英语读写教程 Unit7 Materials Science TextA 原文和翻译

中国科学院大学研究生学术英语读写教程 Unit7 Materials Science TextA 原文和翻译 Why Is the Story of Materials Really the Story of Civilisation? 为什么材料的故事实际上就是文明的故事&#xff1f; Mark Miodownik 1 Everything is made of something. Take away co…...

win10中使用ffmpeg和MediaMTX 推流rtsp视频

在win10上测试下ffmpeg推流rtsp视频&#xff0c;需要同时用到流媒体服务器MediaMTX 。ffmpeg推流到流媒体服务器MediaMTX &#xff0c;其他客户端从流媒体服务器拉流。 步骤如下&#xff1a; 1 下载MediaMTX github: Release v1.9.3 bluenviron/mediamtx GitHub​​​​​…...

代码美学2:MATLAB制作渐变色

效果&#xff1a; %代码美学&#xff1a;MATLAB制作渐变色 % 创建一个10x10的矩阵来表示热力图的数据 data reshape(1:100, [10, 10]);% 创建热力图 figure; imagesc(data);% 设置颜色映射为“cool” colormap(cool);% 在热力图上添加边框 axis on; grid on;% 设置热力图的颜色…...

gitlab:使用脚本批量下载项目,实现全项目检索

目的 当需要知道gitlab中所有项目是否存在某段代码时&#xff0c;gitlab免费版只提供了当个项目内的检索&#xff0c;当项目过多时一个个查太过繁琐。下面通过 GitLab API 将指定 Group 下的所有项目克隆到本地。此脚本会自动获取项目列表并逐一克隆它们&#xff0c;再在本地进…...

大型语言模型LLM - Finetuning vs Prompting

资料来自台湾大学李宏毅教授机器学课程ML 2023 Spring&#xff0c;如有侵权请通知下架 台大机器学课程ML 2023 Springhttps://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.php2023/3/10 课程 機器如何生成文句 内容概要 主要探讨了大型语言模型的两种不同期待及其导致的两类…...

【Python中while循环】

一、深拷贝、浅拷贝 1、需求 1&#xff09;拷贝原列表产生一个新列表 2&#xff09;想让两个列表完全独立开&#xff08;针对改操作&#xff0c;读的操作不改变&#xff09; 要满足上述的条件&#xff0c;只能使用深拷贝 2、如何拷贝列表 1&#xff09;直接赋值 # 定义一个…...

Selenium 包介绍

诸神缄默不语-个人CSDN博文目录 Selenium 是一个强大的工具&#xff0c;主要用于自动化 Web 浏览器的操作。它支持多种编程语言&#xff08;如 Python、Java、C# 等&#xff09;和主流浏览器&#xff08;如 Chrome、Firefox、Safari、Edge 等&#xff09;&#xff0c;广泛应用…...

量化交易系统开发-实时行情自动化交易-4.4.做市策略

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说做市策略原理。 做市策…...

C++设计模式(单例模式)

一、介绍 1.动机 在软件系统中&#xff0c;经常有这样一些特殊的类&#xff0c;必须保证它们在系统中只存在一个实例&#xff0c;才能确保它们的逻辑正确性、以及良好的效率。 如何绕过常规的构造器&#xff0c;提供一种机制来保证一个类只有一个实例? 这应该是类设计者的…...

图的深度优先搜索算法DFS

深度优先搜索&#xff08;DFS&#xff09;就是一种寻找图中各个顶点的方法。想象一下&#xff0c;如果你在一个迷宫里探险&#xff0c;你会怎么做呢&#xff1f;你可能会选择一直走到尽头&#xff0c;直到找不到路为止&#xff0c;然后再回过头来试试其他的路&#xff0c;这就是…...

自动泊车“哐哐撞大墙”,小米SU7智驾功能bug缠身?

文/王俣祺 导语&#xff1a;小米SU7&#xff0c;自带热度与科技光环的“流量神车”&#xff0c;近日却以一种极为“狼狈”的方式闯入大众视野。多达70余辆小米SU7陷入“泊车魔咒”&#xff0c;瞬间在网络上炸开了锅。从“科技控”到“惹祸精”的背后&#xff0c;究竟藏着怎样的…...

Linux宝塔部署wordpress网站更换服务器IP后无法访问管理后台和打开网站页面显示错乱

一、背景&#xff1a; wordpress网站搬家&#xff0c;更换服务器IP后&#xff0c;如果没有域名时&#xff0c;使用服务器IP地址无法访问管理后台和打开网站页面显示错乱。 二、解决方法如下&#xff1a; 1.wordpress搬家后&#xff0c;在新服务器上&#xff0c;新建站点时&am…...

Http文件上传

方式一&#xff1a;HttpClient public static String uploadFile(String url, Map<String, FileWrapper> fileParam, Map<String,String> otherParam){long start System.currentTimeMillis();log.info("uploadFile url: {}.",url);HttpClient client …...

哈希C++

文章目录 一.哈希的概念1.直接定址法2.负载因子 二.哈希函数1.除法散列法 / 除留余数法2.乘法散列法3.全域散列法&#xff08;了解&#xff09; 三.处理哈希冲突哈希冲突&#xff1a;1.开放定址法&#xff08;1&#xff09;线性探测&#xff1a;&#xff08;2&#xff09;二次探…...

C++11(中)

C11&#xff08;中&#xff09; 1.可变参数模板1.1.使用场景 2.lambda表达式&#xff08;重要&#xff09;2.1.使用说明2.2.函数对象与lambda表达式 3.线程库3.1.thread3.2.atomic原子库操作3.3.mutex3.3.1.mutex的种类3.3.2.lock_guard3.3.3.unique_lock &#x1f31f;&#x…...