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

使用FreeRTOS解决单片机串口异步打印

单片机串口异步打印

文章目录

  • 单片机串口异步打印
    • 前言
      • 设计思路
      • 准备
      • 队列创建
      • 完整代码
    • 总结

前言

🌊在单片机开发中串口的异步打印异步打印允许单片机在执行其他任务的同时进行打印操作,无需等待打印完成后再继续执行后续代码,避免了在多处调用的时候数据覆盖的问题。

设计思路

  • 👍通过创建环形缓冲区队列,设计任务调度或缓冲区管理机制,在FreeRTOS中创建队列来进行数据的接收,新建一个打印任务优先级设置为最低优先级,用来检测FIFO中是否有数据,如果有数据就将FIFO中的数据打印出来。
  • 通过定时器定时检测实现非阻塞数据打印。

准备

  • 移植好FreeRTOS操作系统
  • 串口输出重定向到printf

队列创建

🚗队列的创建涉及到了数据结构,详解可以参考数据结构与算法书籍。

/* 定义环形缓冲区结构体 */ 
typedef struct {uint8_t  buffer[BUFFER_SIZE];    /* 缓冲区            */ volatile uint32_t head;   		 /* 写入指针          */ volatile uint32_t tail;          /* 读取指针          */ SemaphoreHandle_t mutex;         /* 互斥锁,保证线程安全 */ 
} ringbuffer_t;

这里新建了ringbuffer_t里面包含了buffer数据包,它的大小由BUFFER_SIZE这个宏来决定,可以通过这个宏来修改预期的buffer大小。👌

😁实例化结构体,给结构体的成员进行赋值操作。

ringbuffer_t ringBuffer = {.head = 0,.tail = 0,.mutex = NULL
};

🎈初始化环形缓冲区队列。通过创建RingBuffer_Init函数来实现,传入的参数是ringbuffer_trb的结构体指针。这时队列的headtail为0表示这个队列是空的,接着创建了一个互斥量,用来保护线程安全。

/* 初始化环形缓冲区 */ 
void RingBuffer_Init(ringbuffer_t *rb) {rb->head = 0;rb->tail = 0;rb->mutex = xSemaphoreCreateMutex();if (rb->mutex == NULL) {printf("Mutex creation failed.\n");while (1);}
}

🥣判断队列是否为空,传入环形缓冲区的结构体,如果队列的head和队列的tail相等那代表这个队列是空的。

/* 判断环形缓冲区是否为空 */ 
int32_t RingBuffer_IsEmpty(ringbuffer_t *rb) {/* head == tail 为空 */return (rb->head == rb->tail);
}

📡判断队列是否是满,传入缓冲区结构体,如果满足head + 1 %buffer的大小求余数,如果余数等于tail那么就代表这个队列已经填满数据了。

/* 判断环形缓冲区是否已满 */ 
int32_t RingBuffer_IsFull(ringbuffer_t *rb) {return ((rb->head + 1) % BUFFER_SIZE == rb->tail);
}

😍向队列写入数据,是按照字节进行写入,传入的参数的ringbuffer_t 结构体指针,和写入的数据data

/* 向环形缓冲区写入数据 */ 
int32_t RingBuffer_Write(ringbuffer_t *rb, char data) {int32_t result = pdFALSE;if (xSemaphoreTake(rb->mutex, portMAX_DELAY) == pdTRUE) {if (!RingBuffer_IsFull(rb)) {rb->buffer[rb->head] = data;rb->head = (rb->head + 1) % BUFFER_SIZE;result = pdTRUE;}xSemaphoreGive(rb->mutex); /* 释放互斥锁 */}return result;
}

😘从环形缓冲区读取数据,思路是传入ringbuffer_t 的结构体指针,和需要读取的指针类型字符,在读取函数中先判断是否获取到了互斥锁,如果是就判断队列是否非空,如果队列非空,就将buffer数据指针就指向尾部每读取队列的一个数就指针向前偏移一位,直到读取完成,满足if语句每次读取完成之后返回true,读取而结束就释放互斥锁🔒。

/* 从环形缓冲区读取数据 */ 
int32_t RingBuffer_Read(ringbuffer_t *rb, uint8_t *data) {int32_t result = pdFALSE;if (xSemaphoreTake(rb->mutex, portMAX_DELAY) == pdTRUE) {if (!RingBuffer_IsEmpty(rb)) {*data = rb->buffer[rb->tail];rb->tail = (rb->tail + 1) % BUFFER_SIZE;result = pdTRUE;}xSemaphoreGive(rb->mutex); /* 释放互斥锁 */}return result;
}

在这里插入图片描述

😊在填充数据的时候参考了C语言中标准格式化输出,需要进行标准的格式化输出需要先引入其头文件#include"stdarg.h"之后就可以进行标准的格式化输出了。在函数内部,其中可以使用 va_start()va_end() 宏来访问变长参数列表中的值,创建临时的缓冲区来存放格式化的数据,然后再通过vsnprintf函数将可变的数据存到locabuffer中,返回写入的长度。

/* 格式化并写入数据的函数 */ 
void RingBufferWriteFormatted(ringbuffer_t* rb, const uint8_t* format, ...) {va_list args;va_start(args, format);/* 使用 vsnprintf 来格式化字符串到局部缓冲区 */ uint8_t localBuffer[BUFFER_SIZE]; // 根据需要调整大小uint32_t written = vsnprintf(localBuffer, sizeof(localBuffer), format, args);/* 检查格式化是否成功 */ if (written > 0) {/* 将格式化后的字符串逐字符写入环形缓冲区 */ for (int i = 0; i < written; ++i) {     if (!RingBuffer_Write(rb, localBuffer[i])) {break;}}}va_end(args);
}

😄创建打印任务不断的取读取环形缓冲区的数据如果有数据就打印出来。

/* 数据读取和打印任务 */ 
void PrintTask(void *pvParameters) {char data;while (1) {/* 读取缓冲区,有数据就打印 */if (RingBuffer_Read(&ringBuffer, &data)) {printf("%c",data);} }
}

完整代码

/* FreeRTOS kernel includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include "stdarg.h"#define BUFFER_SIZE 1024           /* 环形缓冲区大小 根据实际的数据大小进行调整 */ /* 定义环形缓冲区结构体 */ 
typedef struct {uint8_t  buffer[BUFFER_SIZE];  /* 缓冲区   */ volatile uint32_t head;    /* 写入指针 */ volatile uint32_t tail;    /* 读取指针 */ SemaphoreHandle_t mutex;   /* 互斥锁,保证线程安全 */ 
} ringbuffer_t;/* 创建一个全局环形缓冲区实例 */ 
ringbuffer_t ringBuffer = {.head = 0,.tail = 0,.mutex = NULL
};/* 初始化环形缓冲区 */ 
void RingBuffer_Init(ringbuffer_t *rb) {rb->head = 0;rb->tail = 0;rb->mutex = xSemaphoreCreateMutex();if (rb->mutex == NULL) {printf("Mutex creation failed.\n");while (1);}
}/* 判断环形缓冲区是否为空 */ 
int32_t RingBuffer_IsEmpty(ringbuffer_t *rb) {/* head == tail 为空 */return (rb->head == rb->tail);
}/* 判断环形缓冲区是否已满 */ 
int32_t RingBuffer_IsFull(ringbuffer_t *rb) {return ((rb->head + 1) % BUFFER_SIZE == rb->tail);
}/* 向环形缓冲区写入数据 */ 
int32_t RingBuffer_Write(ringbuffer_t *rb, char data) {int32_t result = pdFALSE;if (xSemaphoreTake(rb->mutex, portMAX_DELAY) == pdTRUE) {if (!RingBuffer_IsFull(rb)) {rb->buffer[rb->head] = data;rb->head = (rb->head + 1) % BUFFER_SIZE;result = pdTRUE;}xSemaphoreGive(rb->mutex); /* 释放互斥锁 */}return result;
}/* 从环形缓冲区读取数据 */ 
int32_t RingBuffer_Read(ringbuffer_t *rb, char *data) {int32_t result = pdFALSE;if (xSemaphoreTake(rb->mutex, portMAX_DELAY) == pdTRUE) {if (!RingBuffer_IsEmpty(rb)) {*data = rb->buffer[rb->tail];rb->tail = (rb->tail + 1) % BUFFER_SIZE;result = pdTRUE;}xSemaphoreGive(rb->mutex); /* 释放互斥锁 */}return result;
}
/* 格式化并写入数据的函数 */ 
void RingBufferWriteFormatted(ringbuffer_t* rb, const char* format, ...) {va_list args;va_start(args, format);/* 使用 vsnprintf 来格式化字符串到局部缓冲区 */ char localBuffer[BUFFER_SIZE]; // 根据需要调整大小int written = vsnprintf(localBuffer, sizeof(localBuffer), format, args);// 检查格式化是否成功if (written > 0) {// 将格式化后的字符串逐字符写入环形缓冲区for (int i = 0; i < written; ++i) {     if (!RingBuffer_Write(rb, localBuffer[i])) {break;}}}va_end(args);
}
/* 数据填充任务 测试任务向队列填充数据依次进行添加 */ 
void DataFillTask(void *p) {RingBufferWriteFormatted(&ringBuffer," 1 test test test %d\r\n",0x88);RingBufferWriteFormatted(&ringBuffer, "2 test size value %d\r\n", 0x88);RingBufferWriteFormatted(&ringBuffer, "3 xx size value %d\r\n", 0x88);RingBufferWriteFormatted(&ringBuffer, "4 00 size value %d\r\n", 0x88);RingBufferWriteFormatted(&ringBuffer, "5 11 size value %d\r\n", 0x88);RingBufferWriteFormatted(&ringBuffer, "6 22 size value %d\r\n", 0x88);RingBufferWriteFormatted(&ringBuffer, "7 33 size value %d\r\n", 0x88);RingBufferWriteFormatted(&ringBuffer, "8 44 size value %d\r\n", 0x88);RingBufferWriteFormatted(&ringBuffer, "9 55 size value %d\r\n", 0x88);RingBufferWriteFormatted(&ringBuffer, "10 66 size value %d\r\n", 0x88);RingBufferWriteFormatted(&ringBuffer, "11 ww size value %d\r\n", 0x88);RingBufferWriteFormatted(&ringBuffer, "12 xiao size value %d\r\n", 0x88);RingBufferWriteFormatted(&ringBuffer, "13 bai size value %d\r\n", 0x88);RingBufferWriteFormatted(&ringBuffer,"*************DataFillTask******************\n");while (1) {vTaskDelay(200);}
}/* 数据读取和打印任务 */ 
void PrintTask(void *pvParameters) {char data;while (1) {/* 读取缓冲区,有数据就打印 */if (RingBuffer_Read(&ringBuffer, &data)) {printf("%c",data);// printf("Data '%c' read from buffer.\n", data);  /* 从缓冲区去取数据并打印 */} }
}/* 创建任务 */ 
void app_CreateTasks(void) {if(pdPASS != xTaskCreate(DataFillTask, "DataFillTask", 512, NULL, 1, NULL)) {printf("Task DataFillTask creation failed!\r\n");}/* 设置打印任务为最低优先级 */if (pdPASS != xTaskCreate(PrintTask, "PrintTask", 256, NULL, 0, NULL)) {printf("Task PrintTask creation failed!\r\n");}
}
/* 函数入口 */
int main(void) {/* 在这里进行硬件的初始化操作 */printf("rtos_log print\r\n");/* 初始化环形缓冲区*/ RingBuffer_Init(&ringBuffer);/* 创建任务 */ app_CreateTasks();/* 启动调度器*/ vTaskStartScheduler();/* 如果调度器启动失败 */while (1) {};return 0;
}

总结

本文主要介绍了在单片机中实现串口的异步打印,避免了数据覆盖的问题。

相关文章:

使用FreeRTOS解决单片机串口异步打印

单片机串口异步打印 文章目录 单片机串口异步打印前言设计思路准备队列创建完整代码 总结 前言 &#x1f30a;在单片机开发中串口的异步打印异步打印允许单片机在执行其他任务的同时进行打印操作&#xff0c;无需等待打印完成后再继续执行后续代码&#xff0c;避免了在多处调用…...

飞算 JavaAI 与 Spring Boot:如何实现微服务开发效率翻倍?

微服务架构凭借其高内聚、低耦合的特性&#xff0c;成为企业构建复杂应用系统的首选方案。然而&#xff0c;传统微服务开发流程中&#xff0c;从服务拆分、接口设计到代码编写、调试部署&#xff0c;往往需要耗费大量时间与人力成本。Spring Boot 作为 Java 领域最受欢迎的微服…...

Python 列表与元组深度解析:从基础概念到函数实现全攻略

在 Python 编程的广袤天地中&#xff0c;列表&#xff08;List&#xff09;和元组&#xff08;Tuple&#xff09;是两种不可或缺的数据结构。它们如同程序员手中的瑞士军刀&#xff0c;能高效地处理各类数据。从简单的数值存储到复杂的数据组织&#xff0c;列表和元组都发挥着关…...

vue 修改路由动态选择路由 改文件位置

vue 修改路由动态选择路由 改文件位置 main.jspermission.js...

Nginx openresty web服务 与 Go 原生web服务性能对比

1 概述 Nginx采用的是IO复用模型&#xff0c;能处理超高并发。 Go语言采用协程&#xff0c;能轻量级的处理超高并发。 那么在不考虑业务逻辑复杂的前提下&#xff0c;即假如将Nginx和Go都提供一个/test接口&#xff0c;并在接口逻辑中都只是让其做20毫秒的耗时操作&#xff0c…...

【音视频】FFmpeg解封装

解封装 复用器&#xff0c;比如MP4/FLV 解复用器&#xff0c;MP4/FLV 封装格式相关函数 avformat_alloc_context(); 负责申请一个AVFormatContext结构的内存,并进行简单初始化avformat_free_context(); 释放该结构里的所有东西以及该结构本身avformat_close_input();关闭解复…...

autohue.js - 基于 JavaScript 开发的图片背景色提取开源库,能让图片和背景融为一体

图片提取主题色的工具库&#xff0c;可以实现一些酷炫的界面效果。 本文不是 AI 生成&#xff0c;大部分文字都是我自己敲键盘&#xff0c;部分文字摘自 autohue.js 作者主页&#xff0c;请各位放心舒适阅读。 autohue.js 是一个图片背景色提取库&#xff0c;基于提出来的颜色…...

bgp实验.包括联盟,隧道相关,以及一个低级错误

实验拓扑 低级错误 在配置隧道时,目标的单词是destination,我自动补全为description了,这个问题花了我40分钟 划分ip AS2内骨干网,一个网段需要两个地址,主机位2位,掩码30 需要6个 172.16.0.000000 00 172.16.0.0/30 172.16.0.000001 00 172.16.0.4/30 172.16.0.000010 00 1…...

科普动画短视频制作:角色塑造的魅力法则

宝子们&#xff0c;在科普动画短视频的世界里&#xff0c;角色塑造可是让作品出彩的关键&#xff01;今天就来和大家唠唠那些超实用的角色塑造法则&#xff0c;还会给大家推荐一款超好用的工具哦~ 一、独特外形&#xff0c;吸睛第一步 在科普动画短视频制作中&#xff0c;角色…...

【飞渡科技数字孪生虚拟环境部署与集成教程 - CloudMaster实战指南】

飞渡科技数字孪生虚拟环境部署与集成教程 - CloudMaster实战指南 前言 本教程详细记录了飞渡科技的数字孪生平台CloudMaster的配置过程&#xff0c;以及如何将三维数字孪生场景集成到前端项目中。数字孪生技术能够在虚拟环境中精确复现物理实体的数据、特性和行为&#xff0c…...

MongoDB 集合名称映射问题

项目场景 在使用 Spring Data MongoDB 进行开发时&#xff0c;定义了一个名为 CompetitionSignUpLog 的实体类&#xff0c;并创建了对应的 Repository 接口。需要明确该实体类在 MongoDB 中实际对应的集合名称是 CompetitionSignUpLog 还是 competitionSignUpLog。 问题描述 …...

禁止ubuntu自动更新

由于ubuntu server和desktop版本都默认 启动了&#xff0c;自动更新内核的操作。这对于生 产环境来说是不友好的。容易导致亿赛通 无法启动 默认开启了内核自动更新所以我们关闭自 动内核更新。 1.禁止更新执行 sudo apt-mark hold linux-image-generic linux-headers-generic…...

【C++】——入门基础(一)

前言 这是我C的第一篇文章&#xff0c;如果你想从事入门C行业&#xff0c;可以看看这幅漫画 当然&#xff0c;这只是一个玩笑&#xff0c;但如过你真的想学习C&#xff0c;和我一起学习吧 本人其他博客;恋风诗 本文出现的代码见gitte:mozhengy 这里写目录标题 前言1. C发展历史…...

[原创](现代Delphi 12指南):[macOS 64bit App开发]:在Mac App Store外创建、部署与公证

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...

美乐迪电玩客户端打包与资源替换实战教程

本篇为《美乐迪电玩全套系统搭建》系列的第二篇&#xff0c;聚焦客户端层的实战操作&#xff0c;主要面向前端开发者、美术资源替换人员及整体项目的打包部署人员。教程将涵盖安卓客户端的构建、资源目录说明、动画素材替换方式及常见适配问题处理等。 一、客户端项目结构说明&…...

多态以及多态底层的实现原理

本章目标 1.多态的概念 2.多态的定义实现 3.虚函数 4.多态的原理 1.多态的概念 多态作为面对三大特性之一,它所指代的和它的名字一样,多种形态.但是这个多种形态更多的指代是函数的多种形态. 多态分为静态多态和动态多态. 静态多态在前面已经学习过了,就是函数重载以及模板,…...

描述城市出行需求模式的复杂网络视角:大规模起点-目的地需求网络的图论分析

描述城市出行需求模式的复杂网络视角&#xff1a;大规模起点-目的地需求网络的图论分析 原文&#xff1a; A complex network perspective for characterizing urban travel demand patterns: graph theoretical analysis of large-scale origin–destination demand networks…...

文件操作函数

本文是小编巩固自身而作&#xff0c;如有错误&#xff0c;欢迎指出&#xff01; 1.使用文件的原因 我们编写的程序都是有生命周期的&#xff0c;储存在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就会丢失&#xff0c;等程序再次运行&#xf…...

Java高频面试之并发编程-05

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;线程有哪些调度方法&#xff1f; 在Java中&#xff0c;线程的调用方法主要包括以下几种方式&#xff0c;每种方式适用于…...

LeetCode 1292 元素和小于等于阈值的正方形的最大边长

最大正方形边长问题详解 一、问题描述 给定一个大小为 mn 的矩阵 mat 和一个整数阈值 threshold&#xff0c;要求返回元素总和小于或等于阈值的正方形区域的最大边长&#xff1b;如果没有这样的正方形区域&#xff0c;则返回 0。 二、解题思路 前缀和矩阵的概念与构建 前缀…...

测试开发 - Java 自动化测试核心函数详解

目录 1. 元素定位 1.1 By.xpath 1.1.1 //* 1.1.2 //[指定节点] 1.1.3 / 1.1.4 /.. 1.1.5 [...] 1.1.6 指定索引获取对应元素 1.2 By.cssSelector 1.2.1 # 1.2.2 . 1.2.3 > 1.2.4 标签名:nth-child(n) 2. 获取元素 2.1 findElement 2.2 findElements 3. 操…...

【HarmonyOS】ArKUI框架

目录 概述 声明式开发范式 基于ArKUI的项目 • 1&#xff0e;创建资源文件 • 2&#xff0e;引用资源 • 3&#xff0e;引用系统资源&#xff1a; • 系统资源有哪些 • 4. 在配置和资源中引用资源 声明式语法 UI描述规范 UI组件概述 组件化 组件渲染控制语法 修改…...

【MQ篇】RabbitMQ之简单模式!

目录 引言一、 初识 RabbitMQ 与工作模式二、 简单模式 (Simple Queue) 详解&#xff1a;最直接的“点对点快递” &#x1f4ee;三、 Java (Spring Boot) 代码实战&#xff1a;让小兔子跑起来&#xff01; &#x1f430;&#x1f3c3;‍♂️四、 深入理解&#xff1a;简单模式的…...

K8S节点出现Evicted状态“被驱逐”

在Kubernetes集群中&#xff0c;Pod状态为“被驱逐&#xff08;evicted&#xff09;”表示Pod无法在当前节点上继续运行&#xff0c;已被集群从节点上移除。 问题分析&#xff1a; 节点磁盘空间不足 &#xff0c;使用df -h查看磁盘使用情况 可以看到根目录 / 已100%满&#x…...

NumPyro:概率编程的现代Python框架深度解析

引言 概率编程作为统计学与机器学习的交叉领域&#xff0c;正在重塑我们构建不确定性模型的方式。在众多概率编程语言&#xff08;PPL&#xff09;中&#xff0c;NumPyro凭借其简洁的语法、强大的性能和与PyTorch生态系统的无缝集成&#xff0c;已经成为研究者和数据科学家的首…...

java进阶之git

git git介绍git常用命令代码回滚操作 git 介绍 工作区 改动&#xff08;增删文件和内容&#xff09;暂存区 输入命令&#xff1a;git add改动的文件名&#xff0c;此次改动就放到了"暂存区“本地仓库 输入命令&#xff1a;git commit 此次修改的描述&#xff0c;此次改动…...

负载阻尼效应及其作用解析

负载阻尼效应是指负载&#xff08;如电路、机械系统或控制系统中连接的设备&#xff09;对系统动态变化&#xff08;如电压波动、机械振动等&#xff09;产生的抑制或衰减作用。 其核心是通过消耗或吸收能量&#xff0c;减少系统中的振荡、波动或瞬态响应&#xff0c;从而提高…...

面向组织的网络安全措施

一、安全措施概述 在一个组织中&#xff0c;技术人员可以利用一系列强大的网络安全工具进行安全检测和防范&#xff0c;以保护组织的网络基础设施、数据和资产免受各种威胁。这些工具通常涵盖了从主动防御、威胁检测、漏洞管理到事件响应和安全分析的各个方面。 以下是一些关…...

Unity 跳转资源商店,并打开特定应用

需求&#xff1a; 打开资源商店&#xff0c;并定位到特定应用. 代码&#xff1a; #if UNITY_ANDROIDApplication.OpenURL("market://details?idcom.tencent.mm"); #elif UNITY_IPHONEApplication.OpenURL(“itms-apps://apps.apple.com/app/id333903271”); #end…...

2025年五大ETL数据集成工具推荐

ETL工具作为打通数据孤岛的核心引擎&#xff0c;直接影响着企业的决策效率与业务敏捷性。本文精选五款实战型ETL解决方案&#xff0c;从零门槛的国产免费工具到国际大厂企业级平台&#xff0c;助您找到最适合的数据集成利器。 一、谷云科技ETLCloud&#xff1a;国产数据集成工…...

基于 PaddleOCR对pdf文件中的文字提取

一、基于 PaddleOCR 提取 PDF 文件中的文字流程 1. 安装必要的依赖库&#xff1a;包括 PaddleOCR 和 PyMuPDF pip install paddlepaddle paddleocr pymupdf 2. 将 PDF 转换为图像&#xff1a;使用 PyMuPDF 将 PDF 的每一页转换为图像 3. 使用 PaddleOCR 进行文字识别&a…...

鸿蒙移动应用开发--渲染控制实验

任务&#xff1a;使用“对象数组”、“ForEach渲染”、“Badge角标组件”、“Grid布局”等相关知识&#xff0c;实现生效抽奖卡案例。如图1所示&#xff1a; 图1 生肖抽奖卡实例图 图1(a)中有6张生肖卡可以抽奖&#xff0c;每抽中一张&#xff0c;会通过弹层显示出来&#xf…...

【漫话机器学习系列】215.处理高度不平衡数据策略(Strategies For Highly Imbalanced Classes)

处理高度不平衡数据的四大策略详解 在机器学习与数据挖掘任务中&#xff0c;“类别不平衡”问题几乎无处不在。无论是信用卡欺诈检测、医疗异常诊断&#xff0c;还是网络攻击识别&#xff0c;正负样本的比例往往严重失衡。比如一个欺诈检测数据集中&#xff0c;可能只有不到 1…...

在离线 Ubuntu 环境下部署双 Neo4j 实例(Prod Dev)

在许多开发和生产场景中&#xff0c;我们可能需要在同一台服务器上运行多个独立的 Neo4j 数据库实例&#xff0c;例如一个用于生产环境 (Prod)&#xff0c;一个用于开发测试环境 (Dev)。本文将详细介绍如何在 离线 的 Ubuntu 服务器上&#xff0c;使用 tar.gz 包部署两个 Neo4j…...

Windows下Golang与Nuxt项目宝塔部署指南

在Windows下将Golang后端和Nuxt前端项目打包&#xff0c;并使用宝塔面板部署的步骤如下 一、Golang后端打包 交叉编译为Linux可执行文件 在Windows PowerShell中执行&#xff1a; powershell复制下载 $env:GOOS "linux" $env:GOARCH "amd64" go build…...

基于贝叶斯优化的Transformer多输入单输出回归预测模型Bayes-Transformer【MATLAB】

Bayes-Transformer 在机器学习和深度学习领域&#xff0c;Transformer模型已经广泛应用于自然语言处理、图像识别、时间序列预测等多个领域。然而&#xff0c;在一些实际应用中&#xff0c;我们面临着如何高效地优化模型超参数的问题。贝叶斯优化&#xff08;Bayesian Optimiz…...

ibus输入法微软词库分享

链接: https://pan.baidu.com/s/1aC-UvV-UDHEpxg5sZcAS2Q?pwddxpq 提取码: dxpq --来自百度网盘超级会员v8的分享 链接: https://pan.baidu.com/s/1aC-UvV-UDHEpxg5sZcAS2Q?pwddxpq 提取码: dxpq --来自百度网盘超级会员v8的分享 # 更改ibus输入法字体大小 sudo apt insta…...

Sharding-JDBC 系列专题 - 第五篇:分布式事务

Sharding-JDBC 系列专题 - 第五篇:分布式事务 本系列专题旨在帮助开发者全面掌握 Sharding-JDBC,一个轻量级的分布式数据库中间件。本篇作为系列的第五篇文章,将深入探讨 分布式事务(Distributed Transactions),包括其概念、支持的事务类型、配置方法、工作原理以及实战…...

力扣每日打卡17 49. 字母异位词分组 (中等)

力扣 49. 字母异位词分组 中等 前言一、题目内容二、解题方法1. 哈希函数2.官方题解2.1 前言2.2 方法一&#xff1a;排序2.2 方法二&#xff1a;计数 前言 这是刷算法题的第十七天&#xff0c;用到的语言是JS 题目&#xff1a;力扣 49. 字母异位词分组 (中等) 一、题目内容 给…...

深入解析C++ STL List:双向链表的特性与高级操作

一、引言 在C STL容器家族中&#xff0c;list作为双向链表容器&#xff0c;具有独特的性能特征。本文将通过完整代码示例&#xff0c;深入剖析链表的核心操作&#xff0c;揭示其底层实现机制&#xff0c;并对比其他容器的适用场景。文章包含4000余字详细解析&#xff0c;适合需…...

在 master 分支上进行了 commit 但还没有 push,怎么安全地切到新分支并保留这些更改

确保你的 commit 确实没有 push&#xff08;否则会覆盖远程分支&#xff09;&#xff1a; git log --oneline # 查看本地 commit git log --oneline origin/master # 查看远程 master 的 commit 确保你的 commit 只存在于本地&#xff0c;远程 origin/master 没有…...

spark jar依赖顺序

1. 执行顺序 spark-submit --config "spark.{driver/executor}.extraClassPathsomeJar"提交的依赖包SystemClasspath – Spark安装时候提供的依赖包spark-submit --jars 提交的依赖包 2. 依赖解释 提交任务时指定的依赖 Spark-submit --config "spark.{drive…...

docker 国内源和常用命令

Ubuntu | Docker Docs 参考docker官方安装docker # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt…...

【目标检测】对YOLO系列发展的简单理解

目录 1.YOLOv12.YOLOv23.YOLOv34.YOLOv45.YOLOv66.YOLOv77.YOLOv9 YOLO系列文章汇总&#xff1a; 【论文#目标检测】You Only Look Once: Unified, Real-Time Object Detection 【论文#目标检测】YOLO9000: Better, Faster, Stronger 【论文#目标检测】YOLOv3: An Incremental …...

C# AppContext.BaseDirectory 应用程序的启动目录

Application.StartupPath定义与用途局限性示例 Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)定义与用途局限性示例 Directory.GetCurrentDirectory()定义与用途局限性示例 关键区别总结推荐使用场景需要应用程序安装目录需要动态工作目录插件或模块化应用…...

Sentinel数据S2_SR_HARMONIZED连续云掩膜+中位数合成

在GEE中实现时&#xff0c;发现简单的QA60是无法去云的&#xff0c;最近S2地表反射率数据集又进行了更新&#xff0c;原有的属性集也进行了变化&#xff0c;现在的SR数据集名称是“S2_SR_HARMONIZED”。那么&#xff1a; 要想得到研究区无云的图像&#xff0c;可以参考执行以下…...

探索Cangjie Magic:仓颉编程语言原生的LLM Agent开发新范式

引言&#xff1a;智能体开发的革命性突破 2025年3月&#xff0c;仓颉社区开源了Cangjie Magic——这是首个基于仓颉编程语言原生构建的LLM Agent开发平台&#xff0c;标志着智能体开发领域的一次重大突破。作为一名长期关注AI发展的技术爱好者&#xff0c;我有幸第一时间体验了…...

css三大特性

css三大特性&#xff1a;层叠性 继承性 优先性 一.层叠性 二.继承性 子标签会继承父标签的某些样式 恰当地使用继承性&#xff0c;减少代码复杂性子元素会继承父元素地某些样式(text-&#xff0c;font-&#xff0c;line-这些元素开头的可以继承&#xff0c;以及color属性) 2…...

Centos7安装Jenkins(图文教程)

本章教程,主要记录在centos7安装部署Jenkins 的详细过程。 [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 一、基础环境安装 内存大小要求:256 MB 内存以上 硬盘大小要求:10 GB 及以上 安装基础java环境:Java 17 ( JRE 或者 JDK 都可…...

Hyper-V 管理工具

什么是 Hyper-V Microsoft Hyper-V是一个虚拟化平台&#xff0c;可在Windows客户端和服务器上创建并运行虚拟计算机。操作系统&#xff08;OS&#xff09;被称为“监管程序”&#xff08;supervisor&#xff09;&#xff0c;因为它负责为程序分配物理资源。在虚拟环境中&#…...