RTOS-F429-HAL-列表创建,写入,读取(2026/8/1)
目录一队列核心概念梳理1、队列是什么2、四个关键特性3、阻塞机制核心4、多个任务挤着等一个队列时谁先醒5、队列操作流程二队列的结构体1结构体分析2联合体分析1含义是2为什么 FreeRTOS 要这么设计3ucQueueType 字段是什么4怎么选择要用哪个三队列的API1、创建队列2、写入队列5 个函数底层都是同一个3、读取队列4 个函数4写入和读取的位置四实验改动清单1freertos_demo.c2main.c五实验总结1、队列概念2、队列结构体3、union队列 ↔ 信号量同一结构体4、核心 API5、阻塞机制6、值拷贝 vs 指针传7、%s 的本质8、工程rtos\10\ 队列实验一队列核心概念梳理1、队列是什么一块有限容量、固定大小的环形缓冲区。队列长度5项目大小10字节 ┌────┬────┬────┬────┬────┐ │ │ │ │ │ │ ← 每个槽 10 字节共 5 个槽 └────┴────┴────┴────┴────┘ ​ 创建时要定两件事能存几个长度、每个多大项目大小字节全局变量容易被胡乱操作2、四个关键特性特性说明FIFO/LIFO默认先进先出可配成后进先出像堆栈值拷贝数据从内存复制进队列不是传指针传大块数据时也可传指针地址节约带宽多任务共享任何任务、中断都可以发/读队列不属于任何一个任务阻塞机制满了写不进去空了读不出来→ 阻塞等3、阻塞机制核心入队队列满了写不进去 ① 任务挂到 pxDelayedTaskList延时列表 ② 任务挂到 xTasksWaitingToSend排队等着写 出队队列空了读不出来 ① 任务挂到 pxDelayedTaskList ② 任务挂到 xTasksWaitingToReceive排队等着读 入队阻塞队列满写不进去 ​ 状态绳(xStateListItem) ReadyList ──摘下来──→ DelayedTaskList 我不跑了等 事件绳(xEventListItem) 空着 ──挂上去──→ Queue.xTasksWaitingToSend 我在等传菜口腾空位 ​ ​ 出队阻塞队列空读不出来 ​ 状态绳(xStateListItem) ReadyList ──摘下来──→ DelayedTaskList 我不跑了等 事件绳(xEventListItem) 空着 ──挂上去──→ Queue.xTasksWaitingToReceive 我在等传菜口出菜 一根绳记录我不跑了另一根绳记录我在等什么。 唤醒时反着来——先把事件绳从 Queue 等待区摘掉再顺着 pvOwner 找到 TCB把状态绳挂回 ReadyList。这就是之前笔记里说的阻塞删 Ready → 插 Waiting唤醒删 Waiting → 插 Ready。阻塞时间三种选择值含义0不等待立刻返回失败1 ~ portMAX_DELAY-1等这么多 tick超时还没戏就返回失败portMAX_DELAY死等等到天荒地老4、多个任务挤着等一个队列时谁先醒优先级高的先拿到优先级相同 →等得最久的先拿到A: xQueueReceive(q, portMAX_DELAY) → 死等等到天荒地老 B: xQueueReceive(q, portMAX_DELAY) → 死等 C: xQueueReceive(q, 100) → 最多等 100 tick ​ 时间轴 → ​ t0 A 先跑到这行xQueueReceive(q, 死等) → A 排在等接收队伍第 1 位 ​ t50 B 才跑到这行xQueueReceive(q, 死等) → B 排在等接收队伍第 2 位 t60 C 才跑到这行xQueueReceive(q, 100) → B 排在等接收队伍第 3 位 ​ SysTick 每 1ms 扫延时列表干活 ​ ​ 第 1msA/B/C 挂进延时列表各自绳上记着到期时间 A/B 到期时间 永远不到期 C 到期时间 当前 100 第 100ms ​ 第 2ms ~ 第 99ms 扫延时列表 → A/B/C 都没到期 → 继续睡 ​ 第 100ms 扫延时列表 → C 到期了 → 把 C 的两根绳都摘掉 → C 拿着超时的结果返回 如果这期间队列一直没来数据 → A 和 B 继续等 下次来数据了 → A 先拿到先来的 就是 SysTick 管着每 1ms 看一眼谁该醒了。 C 等 100 tick 就是 100msSysTick 数到 100 下还没等到数据就把 C 叫醒说你超时了。A/B 填的死等 → 到期时间记成无穷大 → SysTick 扫过去永远不叫醒他们只有数据来了才醒。5、队列操作流程① 创建空队列5 个槽全空 ┌──┬──┬──┬──┬──┐ │ │ │ │ │ │ └──┴──┴──┴──┴──┘ ​ ② taskA 写入 10 ┌──┬──┬──┬──┬────┐ │ │ │ │ │ 10 │ └──┴──┴──┴──┴────┘ 写入指针 → 移到下一个槽 ​ ③ taskA 写入 20 ┌──┬──┬──┬────┬────┐ │ │ │ │ 20 │ 10 │ └──┴──┴──┴────┴────┘ ​ ④ taskB 读取 → 拿走 10先入先出 ┌──┬──┬──┬────┬────┐ │ │ │ │ 20 │ │ └──┴──┴──┴────┴────┘ y 10值拷贝taskA 的x10拷贝进队列taskB 读出来放y。不是传指针是实实在在复制了数据。二队列的结构体typedef struct QueueDefinition { int8_t *pcHead; // 存储区起始地址 int8_t *pcTail; // 存储区结束地址 队列存储区管理 int8_t *pcWriteTo; // 下次写入的位置 ​ union { QueuePointers_t xQueue; SemaphoreData_t xSemaphore; } u; ​ List_t xTasksWaitingToSend; // 等发送的任务排队区 List_t xTasksWaitingToReceive; // 等接收的任务排队区 ​ volatile UBaseType_t uxMessagesWaiting;// 当前队列里有多少条消息 UBaseType_t uxLength; // 队列长度最多存几条 UBaseType_t uxItemSize; // 每条消息的大小字节 ​ volatile int8_t cRxLock; // 接收锁中断安全用 volatile int8_t cTxLock; // 发送锁中断安全用 ​ #if ...条件编译... uint8_t ucStaticallyAllocated; // 是否静态分配 struct QueueDefinition *pxQueueSetContainer; UBaseType_t uxQueueNumber; uint8_t ucQueueType; #endif ​ } xQUEUE; ​ typedef xQUEUE Queue_t;1结构体分析分两拨管数据的 vs 管人排队的管数据的队列缓冲区字段干啥pcHead数据区首地址创建时pvPortMalloc分的pcWriteTo下次往哪写入队时 1 格pcTail数据区末地址判断有没有溢出pcReadFrom上次从哪读的出队时 1 格uxLength最多存几个创建时指定固定不变uxItemSize每个多大创建时指定固定不变uxMessagesWaiting当前排了几个0 ~ uxLength管人排队的任务等待区字段干啥xTasksWaitingToSend满了想写但写不进去的任务挂在这xTasksWaitingToReceive空了想读但读不到的任务挂在这两个都是List_t里面挂的都是任务的xEventListItem那根事件绳。2联合体分析联合体队列 vs 信号量同个结构体两套外套union { QueuePointers_t xQueue; // 当队列用 → 有读写指针 SemaphoreData_t xSemaphore; // 当信号量/互斥锁用 → 有持有者 } u;1含义是u是一个联合体变量xQueue和xSemaphore共用同一段内存同一时刻只能使用其中一个联合体大小 最大成员的大小 也就是说当这个结构表示队列时u.xQueue有意义当这个结构表示信号量时u.xSemaphore有意义二者不会同时存在2为什么 FreeRTOS 要这么设计因为队列和信号量本质上是同一个内核对象只是行为不同类型是否存数据需要的额外字段队列✅ 存数据读指针、写指针互斥信号量❌ 不存数据持有者、递归计数如果不用union就要多占内存用union就可以复用内存。队列 Queue 信号量Semaphore ├── 计数信号量 → 普普通通记数字停车场还有3个位 ├── 二进制信号量 → 计数范围 0~1只有一个位 ├── 互斥锁 → 二进制信号量 记持有者 优先级继承 └── 递归互斥锁 → 互斥锁 同一个人可以锁 N 次所以联合体里只需要两个身份union { QueuePointers_t xQueue; // 队列要存数据 SemaphoreData_t xSemaphore; // 信号量/互斥锁/递归互斥锁不存数据只记持有者 } u;互斥锁需要记录的额外信息持有者、递归次数全都塞在xSemaphore这两个字段里不需要新身份。信号量是爹互斥锁是儿子。3ucQueueType 字段是什么ucQueueType 是 xQUEUE 结构体里的一个 类型标记字段类似“身份证”。靠ucQueueType字段configUSE_TRACE_FACILITY 1时启用从 rtos\7 任务状态查询实验开始我们就设了configUSE_TRACE_FACILITY 1rtos\9 继承了同一个 FreeRTOSConfig.h不用再改。//ucQueueType 这个在结构体中怎么没看到 在列表结构体最下面条件编译包着的typedef struct QueueDefinition { // ... 前面那些你熟悉的字段 ... ​ #if ( configUSE_TRACE_FACILITY 1 ) // ← 开了才存在 UBaseType_t uxQueueNumber; uint8_t ucQueueType; // ← 就在这162 行 #endif ​ } xQUEUE;之前看结构体时被#if包在最底部正点的图里也没画出来。我们configUSE_TRACE_FACILITY 1是开着的所以实际编译时存在不是所有 FreeRTOS 项目都有。4怎么选择要用哪个在你调用创建 API 的那一刻就决定了。✅ 创建队列 QueueHandle_t xQueue xQueueCreate(4, 32); 内部会做这件事简化 pxNewQueue-ucQueueType queueQUEUE_TYPE_BASE; → 说明这是个队列 → 以后只用u.xQueue ✅ 创建互斥信号量 SemaphoreHandle_t xMutex xSemaphoreCreateMutex(); 内部 pxNewQueue-ucQueueType queueQUEUE_TYPE_MUTEX; → 说明这是个互斥量 → 以后只用u.xSemaphore ​ 简单说你调 xQueueCreate 还是 xSemaphoreCreate创建的时候就定了身份ucQueueType 打上标签后面一辈子按标签走对应逻辑三队列的API1、创建队列QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );形参含义uxQueueLength队列长度最多存几条uxItemSize每条消息的大小字节传 0 就是信号量返值成功返回句柄失败返回NULL。// 示例创建一个能存 5 个、每个 32 字节的队列 QueueHandle_t q xQueueCreate(5, 32);静态版本xQueueCreateStatic()需自己提供内存初学不常用用到再说。2、写入队列5 个函数底层都是同一个函数写入位置什么时候用xQueueSend()尾部最常用普通入队xQueueSendToBack()尾部跟上面一模一样xQueueSendToFront()头部插队跳到最前面xQueueOverwrite()覆盖队列长度1 时用直接盖掉旧数据xQueueSendFromISR()尾部中断里专用底层都是调同一个函数只差最后一个参数#define xQueueSend(q, data, wait) xQueueGenericSend(q, data, wait, queueSEND_TO_BACK) #define xQueueSendToBack(q, data, wait) xQueueGenericSend(q, data, wait, queueSEND_TO_BACK) #define xQueueSendToFront(q, data, wait) xQueueGenericSend(q, data, wait, queueSEND_TO_FRONT) #define xQueueOverwrite(q, data) xQueueGenericSend(q, data, 0, queueOVERWRITE)3、读取队列4 个函数函数读了后移除在哪用xQueueReceive()✅ 移除任务中xQueuePeek()❌ 不移除只看不拿任务中xQueueReceiveFromISR()✅ 移除中断里xQueuePeekFromISR()❌ 不移除中断里原型BaseType_t xQueueReceive( QueueHandle_t xQueue, // 从哪读 void * const pvBuffer, // 读到哪输出 TickType_t xTicksToWait ); // 等多久形参含义xQueue队列句柄pvBuffer读出来的数据存到哪xTicksToWait队列空时等多久0不等portMAX_DELAY死等返值pdPASS 拿到了pdFALSE 失败超时/队列空。4写入和读取的位置队列长度5当前有 3 条 读这边 ←←←←←←←←←← 写这边 →→→→→→→→→→ ┌──────┬──────┬──────┬──────┬──────┐ │ 10 │ 20 │ 30 │ │ │ └──────┴──────┴──────┴──────┴──────┘ ↑ ↑ xQueueReceive() xQueueSend() xQueuePeek() xQueueSendToBack() 从头部拿 往尾部放 ​ xQueueSendToFront() → 插到头部挤开别人 xQueueOverwrite() → 只有 1 个槽时直接盖掉明天实验就是用这套 API创建 → 发送 → 接收。四实验改动清单1freertos_demo.c行号内容14新增#include queue.h— 队列 API48-49key_queue(2×1字节) /big_queue(1×4字节) 全局队列句柄69-80freertos_demo()里创建两个队列 打印成功/失败106-134task1扫 KEY1→发 key_queue扫 KEY2→发 big_queue139-158task2xQueueReceive(key_queue, 死等)→ 打印按键值163-177task3xQueueReceive(big_queue, 死等)→ 打印字符串指针传递2main.c行号内容5新增#include ./Key/Key.h17新增Key_Init()26printf 标题 →FreeRTOS Queue Test!五实验总结1、队列概念队列 任务间传数据的管道。先进先出FIFO值拷贝。创建时定好能存几条uxLength和每条多大uxItemSize。2、队列结构体xQUEUE队列结构体 数据缓冲区创建时分配 ┌──────────────────────┐ ┌──────────────────┐ │ pcHead ──────────────┼──────────────→ │ 队列项1 │ 队列项2 │ ... │ │ pcTail │ └──────────────────┘ │ pcWriteTo ───────────┼──→ 下次写到这 │ u.pcReadFrom ────────┼──→ 上次从这读 │ uxLength / uxItemSize│ ← 创建时定死的 │ uxMessagesWaiting │ ← 当前有几条 │ xTasksWaitingToSend │ ← 满了等着写的人的队伍 │ xTasksWaitingToReceive│ ← 空了等着读的人的队伍 └──────────────────────┘3、union队列 ↔ 信号量同一结构体union { 队列用pcReadFrom上次读的位置 互斥锁用xMutexHolder uxRecursiveCallCount谁拿着钥匙 } u;队列有数据区信号量/互斥锁没有uxItemSize 0靠ucQueueType区分身份。4、核心 API操作函数关键点创建xQueueCreate(len, size)返回值是句柄失败返 NULL写入xQueueSend(q, data, wait)值拷贝拷的是指针指向的内容写入插队xQueueSendToFront(q, data, wait)跳到队头覆盖xQueueOverwrite(q, data)长度1 时用读取xQueueReceive(q, buf, wait)值拷贝到 buf同时从队列移除只看不拿xQueuePeek(q, buf, wait)读完数据还在队列里中断版xQueueSendFromISR/ReceiveFromISRISR 里专用5、阻塞机制队列满 → 写入方挂xTasksWaitingToSend事件绳状态绳挂延时列表 队列空 → 读取方挂xTasksWaitingToReceive事件绳状态绳挂延时列表 条件满足 → 顺着pvOwner找回 TCB → 状态绳挂回 ReadyList同优先级排队谁先跑到xQueueReceive谁排前面先到先拿。6、值拷贝 vs 指针传值拷贝指针传递队列大小sizeof(数据类型)sizeof(char *) 4 字节拷进去什么数据本身数据的地址适用场景小数据按键值、传感器值大数据字符串、结构体%s打印—printf(%s, buf)顺着地址找7、%s的本质%s不是打指针值是顺着指针去读内存里的字符串。%p才是打地址值本身。8、工程rtos\10\ 队列实验key_queue存 1 字节按键值值拷贝big_queue存 4 字节指针指针传递指向buff[100]task1 生产者扫 KEY1/KEY2 发队列task2/task3 消费者死等读取读了就打印

相关新闻

ESP32-S3-Tiny设计实战:从芯片选型到低功耗优化的微型物联网模块开发指南

ESP32-S3-Tiny设计实战:从芯片选型到低功耗优化的微型物联网模块开发指南

1. 从“ESP32-S3”到“ESP32-S3-Tiny”:一个芯片的“瘦身”哲学如果你玩过ESP32-S3,大概率会对它又爱又恨。爱的是它强大的双核240MHz处理器、丰富的接口(USB OTG、摄像头、LCD屏)和那令人安心的Wi-Fi 6与蓝牙5连接能力&#xff0…

2026/10/19 23:22:50 阅读更多 →
SQL Server DBA 实用的 100 条命令(建议收藏)

SQL Server DBA 实用的 100 条命令(建议收藏)

前言 做 SQL Server DBA,真正考验能力的不是会不会创建数据库,而是在生产环境出现 CPU 飙高、SQL 卡顿、阻塞堆积、日志暴涨、Always On 延迟时,能快速找到问题原因。 SQL Server 提供了大量 DMV(Dynamic Management Views&#x…

2026/10/20 7:18:16 阅读更多 →
热敏电阻与DS18B20实战指南:从模拟到数字的温度传感器设计

热敏电阻与DS18B20实战指南:从模拟到数字的温度传感器设计

1. 从“感知温度”到“数据世界”:温度传感器的核心价值温度,这个我们每天都能感知到的物理量,在工业自动化、智能家居、环境监测乃至生物医疗等无数领域,却是决定系统成败、影响产品质量、保障人身安全的关键参数。而温度传感器&…

2026/10/19 8:40:50 阅读更多 →

最新新闻

Apple Silicon 虚拟机 EFI_RNG_PROTOCOL 缺失排查

Apple Silicon 虚拟机 EFI_RNG_PROTOCOL 缺失排查

前两天我在一台 M2 的 Mac mini 上用 VMware Fusion 装 Ubuntu 22.04 ARM 版,系统安装完重启,屏幕刷过一长串启动日志,其中一行EFI_RNG_PROTOCOL unavailable特别扎眼。第一反应就是“启动失败了”。结果等了几秒,系统照常进到了登…

2026/10/20 15:10:51 阅读更多 →
LangGraph代理零信任安全实践:从JWT到动态凭证的完整落地

LangGraph代理零信任安全实践:从JWT到动态凭证的完整落地

1. 代理时代的信任危机:传统安全边界为什么全面失效1.1 一次工具凭证泄漏事故的完整复盘我接手过一个LangGraph代理项目,功能不复杂:把内部文档检索、外部工具调用和自然语言问答串在一起。上线前我做了所有“看起来正确”的事——在网关限制…

2026/10/20 15:10:51 阅读更多 →
vsping:一条命令批量检测VPS节点延迟、丢包和端口连通性

vsping:一条命令批量检测VPS节点延迟、丢包和端口连通性

提到 vsping,很多常跟服务器打交道的人应该不陌生。它是个命令行下的网络测试工具,核心功能就是批量检测一组 VPS 节点的延迟、丢包和端口连通性。我第一次见它,是在某个技术社群的闲聊里,有人贴了一张表格,里面整整齐…

2026/10/20 15:10:51 阅读更多 →
SolidWorks拉伸凸台全解析:从草图到实体建模的核心命令

SolidWorks拉伸凸台全解析:从草图到实体建模的核心命令

很多刚接触SolidWorks的朋友,一上来就被界面里密密麻麻的命令按钮吓住了。其实整个软件的学习路径远比想象中线性,你只需要先啃透一个命令——拉伸凸台,后面一大半的建模逻辑都能顺势打通。作为整个SolidWorks体系里最基础、最高频、也是最能…

2026/10/20 15:10:51 阅读更多 →
GitHub前500仓库的Claude Code考古:使用痕迹与渗透率分析

GitHub前500仓库的Claude Code考古:使用痕迹与渗透率分析

GitHub上Star前500的仓库,是整个开源世界的金字塔尖。前阵子我做了一个有点"考古"性质的分析:想搞清楚这些顶尖仓库里,到底有多少真的在用Claude Code。做法不是看网上的讨论热度,而是逐个仓库去翻配置目录、提交历史、…

2026/10/20 15:10:51 阅读更多 →
PySpark与Hadoop图书推荐系统毕设:从环境搭建到答辩全流程

PySpark与Hadoop图书推荐系统毕设:从环境搭建到答辩全流程

计算机毕业设计里,图书推荐系统这个题目几乎年年有人选。它业务场景具体、数据可解释性好、推荐算法能体现技术含量,关键是答辩时老师容易听懂。而一旦在这个题目前面加上 PySpark 和 Hadoop,再配一块可视化大屏,项目定位就从“普…

2026/10/20 15:09:47 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →