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

Zephyr OS 中的 FIFO 接口应用介绍

目录

概述

1 FIFO的接口函数

1.1 K_FIFO_DEFINE函数

1.2 k_fifo_init函数

 1.3 k_fifo_put函数

1.4 k_fifo_get 函数

1.5  k_fifo_is_empty 函数

2  应用验证 

2.1  UART中使用FIFO范例

2.2 生产-消费类型范例

3 注意事项

3.1 内存管理

3.2 线程安全边界


概述

Zephyr RTOS 提供了多种 FIFO (First-In-First-Out) 实现方式,适用于不同场景的数据缓冲需求。以下是主要的 FIFO 接口和使用方法。

1 FIFO的接口函数

FIFO 接口主要API如下这些,其具体函数如下:

函数描述
K_FIFO_DEFINE(name)定义并初始化FIFO
k_fifo_init(fifo)运行时初始化FIFO
k_fifo_put(fifo, data)向FIFO放入数据
k_fifo_get(fifo, timeout)从FIFO获取数据
k_fifo_is_empty(fifo)检查FIFO是否为空

1.1 K_FIFO_DEFINE函数

K_FIFO_DEFINE 是 Zephyr RTOS 中用于定义和初始化 FIFO(先进先出队列)的宏,它是 Zephyr 内核提供的一种线程安全的数据传递机制。

1) 基本语法

K_FIFO_DEFINE(name)

2)功能说明

  1. 作用

    • 静态定义并初始化一个 FIFO 队列

    • 创建的 FIFO 可以被多个线程安全地访问

    • 支持阻塞和非阻塞操作

  2. 特性

    • 线程安全:内置同步机制,无需额外锁

    • 动态扩展:基于链表实现,理论上无大小限制

    • 支持超时等待:消费者可以阻塞等待数据

3) 内部实现原理

K_FIFO_DEFINE 实际上创建了一个 struct k_fifo 结构体,其核心实现基于:

  1. 链表结构:使用 Zephyr 的 sys_slist_t 单链表

  2. 同步机制:内置内核信号量保证线程安全

  3. 等待队列:当 FIFO 为空时,允许消费者线程阻塞等待

1.2 k_fifo_init函数

k_fifo_init 是 Zephyr RTOS 中用于运行时初始化 FIFO(先进先出队列)的函数,与静态初始化宏 K_FIFO_DEFINE 相对应,提供了动态初始化 FIFO 的能力。

1)函数原型

void k_fifo_init(struct k_fifo *fifo);

2)参数说明

参数说明

参数类型描述
fifostruct k_fifo*指向要初始化的FIFO结构体的指针

3) 核心功能

  1. 初始化FIFO内部状态

    • 初始化链表头(用于存储数据项)

    • 初始化等待队列(用于阻塞的消费者线程)

    • 重置所有内部状态标志

  2. 线程安全保证

    • 初始化后的FIFO可安全用于多线程环境

    • 内置同步机制,无需额外锁

 3)使用范例

1. 动态创建FIFO

#include <zephyr/kernel.h>struct k_fifo my_fifo;void init_my_fifo(void)
{k_fifo_init(&my_fifo);
}

2. 模块化设计中的FIFO初始化

// 模块头文件
struct data_processor {void *fifo_reserved;// 其他成员...
};// 模块实现
int data_processor_init(struct data_processor *proc)
{if (proc == NULL) {return -EINVAL;}k_fifo_init(&proc->input_fifo);// 其他初始化...return 0;
}

4) 与K_FIFO_DEFINE对比

特性k_fifo_initK_FIFO_DEFINE
初始化方式运行时动态初始化编译时静态初始化
存储位置需自行管理内存自动分配在全局数据区
使用场景动态创建的对象需要FIFO时全局或模块级FIFO
线程安全
初始化时机显式调用时系统启动时自动初始化

 1.3 k_fifo_put函数

k_fifo_put 是 Zephyr RTOS 中用于向 FIFO (先进先出队列) 放入数据项的核心函数,它实现了线程安全的数据生产者-消费者模式。

1)函数原型

void k_fifo_put(struct k_fifo *fifo, void *data);

2)参数说明

参数类型描述
fifostruct k_fifo*指向已初始化的FIFO对象的指针
datavoid*要放入队列的数据项指针

 3)核心功能与特性

  1. 线程安全操作

    • 内部使用内核锁保证多线程/中断环境下的安全访问

    • 支持多生产者并发写入

  2. 唤醒机制

    • 如果有线程在 k_fifo_get 上阻塞等待数据,会自动唤醒最早等待的线程

    • 唤醒的线程将获得刚放入的数据项

  3. 无阻塞设计

    • 函数立即返回,不会阻塞调用线程

    • 适合在中断上下文使用(需配合 K_NO_WAIT 内存分配)

  4. 数据所有权转移

    • 数据项所有权从生产者转移到FIFO,再由消费者获取

    • 放入后生产者不应再访问该数据项

 4)使用示例

-1) 基础使用模式

#include <zephyr/kernel.h>// 定义数据结构
struct sensor_data {void *fifo_reserved;int32_t temperature;uint32_t timestamp;
};K_FIFO_DEFINE(sensor_fifo);void sampling_thread(void)
{while (1) {// 动态分配数据项struct sensor_data *data = k_malloc(sizeof(*data));// 填充数据data->temperature = read_temperature();data->timestamp = k_uptime_get_32();// 放入FIFOk_fifo_put(&sensor_fifo, data);k_sleep(K_MSEC(1000));}
}

-2) 中断上下文使用

void isr_handler(const struct device *dev, void *user_data)
{static struct event_data *evt;if (!evt) {// 预分配避免ISR中动态分配evt = k_malloc(sizeof(*evt));}if (evt) {evt->event_type = DEVICE_EVENT;evt->event_code = read_event_code();// ISR中只能使用非阻塞操作if (k_fifo_put(&event_fifo, evt) == 0) {evt = NULL;  // 成功放入后重置指针}}
}

 5) 与相关函数对比

函数特点适用场景
k_fifo_put单数据项放入通用场景
k_fifo_put_list批量放入多个数据项批量生产场景
k_fifo_put_slist使用系统单链表批量放入已有链表结构的场景
k_queue_alloc_append带内存分配的放入需要自动分配内存的场景

1.4 k_fifo_get 函数

k_fifo_get 是 Zephyr RTOS 中用于从 FIFO (先进先出队列) 获取数据项的核心函数,它实现了线程安全的消费者接口,支持阻塞和非阻塞两种模式。

1)函数原型

void *k_fifo_get(struct k_fifo *fifo, k_timeout_t timeout);

2)参数说明

参数类型描述
fifostruct k_fifo*指向已初始化的FIFO对象的指针
timeoutk_timeout_t指定等待超时时间,可以是:
K_NO_WAIT(非阻塞)
K_FOREVER(永久阻塞)
具体时间值

3)返回值

  • 成功时:返回获取到的数据项指针

  • 超时或失败:返回 NULL

 4)核心功能和特性

  1. 线程安全操作

    • 内部使用内核锁保证多线程环境下的安全访问

    • 支持多消费者并发获取

  2. 灵活的等待策略

    • 非阻塞模式(K_NO_WAIT):立即返回,不等待

    • 阻塞模式:可以指定超时时间或无限等待(K_FOREVER)

    • 定时等待:如 K_MSEC(100) 表示最多等待100毫秒

  3. 优先级继承

    • 当多个线程等待同一个FIFO时,高优先级线程会优先被唤醒

  4. 内存所有权转移

    • 获取到的数据项所有权从FIFO转移到消费者

    • 消费者负责后续的内存管理(通常需要释放)

 5)使用范例

-1)基础使用模式

#include <zephyr/kernel.h>K_FIFO_DEFINE(data_fifo);void consumer_thread(void)
{while (1) {// 阻塞等待数据,最多等待200msstruct sensor_data *data = k_fifo_get(&data_fifo, K_MSEC(200));if (data != NULL) {// 处理数据process_data(data);// 释放内存k_free(data);} else {// 超时处理handle_timeout();}}
}

-2)多消费者协作模式

void consumer_group(void)
{struct k_fifo *fifo = &shared_fifo;while (1) {void *data = k_fifo_get(fifo, K_FOREVER);// 根据数据类型分发处理if (is_type_a(data)) {process_type_a(data);} else if (is_type_b(data)) {process_type_b(data);}k_free(data);}
}

 -3)检查返回值

// 错误:未检查返回值
struct data *item = k_fifo_get(&fifo, K_MSEC(100));
item->value = 0;  // 可能解引用NULL// 正确:必须检查返回值
struct data *item = k_fifo_get(&fifo, K_MSEC(100));
if (item != NULL) {// 安全访问process(item);k_free(item);
}

-4)内存管理责任

void *data = k_fifo_get(&fifo, K_FOREVER);
process(data);
k_free(data);  // 必须释放

1.5  k_fifo_is_empty 函数

k_fifo_is_empty 是 Zephyr RTOS 中用于检查 FIFO (先进先出队列) 是否为空的辅助函数,它提供了一种非破坏性的方式来查询 FIFO 的当前状态。

1)函数原型

bool k_fifo_is_empty(struct k_fifo *fifo);

2)参数说明

参数类型描述
fifostruct k_fifo*指向已初始化的FIFO对象的指针

3) 返回值

  • true:FIFO 为空(没有数据项)

  • false:FIFO 不为空(至少有一个数据项)

 4)核心功能与特性

  1. 非破坏性检查

    • 仅查询状态,不会修改FIFO内容

    • 不会影响任何等待线程

  2. 线程安全

    • 内部使用内核锁保证多线程环境下的安全访问

    • 可以在任何上下文中调用(包括中断)

  3. 轻量级操作

    • 比 k_fifo_get 更轻量,适合状态检查

    • 无阻塞,立即返回结果

5)使用范例

-1)基本使用模式

#include <zephyr/kernel.h>K_FIFO_DEFINE(data_fifo);void consumer_thread(void)
{// 先检查是否有数据if (!k_fifo_is_empty(&data_fifo)) {struct data_item *item = k_fifo_get(&data_fifo, K_NO_WAIT);process_item(item);k_free(item);} else {printk("No data available\n");}
}

-2) 中断上下文使用

void isr_handler(const struct device *dev, void *user_data)
{// 在ISR中安全检查FIFO状态if (!k_fifo_is_empty(&isr_fifo)) {// 可以安全地从ISR中获取数据(非阻塞)struct isr_event *evt = k_fifo_get(&isr_fifo, K_NO_WAIT);handle_isr_event(evt);}
}

-3) 多线程协调

void worker_thread(void)
{while (1) {// 先非阻塞检查if (k_fifo_is_empty(&work_queue)) {// 无工作时休眠k_sleep(K_MSEC(100));continue;}// 有工作则获取处理struct work_item *item = k_fifo_get(&work_queue, K_NO_WAIT);process_work_item(item);k_free(item);}
}

5) 关键注意事项

-1)  竞态条件

// 错误用法:检查和使用之间存在时间间隙
if (!k_fifo_is_empty(&fifo)) {// 在这期间可能有其他线程取走数据item = k_fifo_get(&fifo, K_NO_WAIT);  // 可能得到NULL
}// 正确用法:直接使用k_fifo_get的超时机制
item = k_fifo_get(&fifo, K_NO_WAIT);
if (item != NULL) {// 安全处理
}

-2)  性能考虑:不应作为主要的数据获取机制

// 优化:避免不必要的阻塞
if (!k_fifo_is_empty(&fifo)) {item = k_fifo_get(&fifo, K_NO_WAIT);// 处理item...
}

-3) 与 k_fifo_get 的关系

函数特点适用场景
k_fifo_is_empty仅检查状态,不修改FIFO需要预先知道状态的场景
k_fifo_get获取数据并修改FIFO状态实际消费数据的场景

6)  特性

k_fifo_is_empty 作为 Zephyr FIFO 机制的辅助函数,虽然简单但非常实用。它最适合用于状态监控、性能优化和资源管理场景,而不应作为数据消费的主要机制。正确使用时可以构建出更高效和响应性更好的系统,但需要注意避免常见的竞态条件陷阱。

2  应用验证 

2.1  UART中使用FIFO范例

Step-1:  定义FIFO

 /* UART payload buffer element size. */#define UART_BUF_SIZE 20struct uart_data_t {void *fifo_reserved;uint8_t  data[UART_BUF_SIZE];uint16_t len;};static K_FIFO_DEFINE(fifo_uart_tx_data);static K_FIFO_DEFINE(fifo_uart_rx_data);

Step-2: 使用k_fifo_put准备数据

  struct uart_data_t *tx = k_malloc(sizeof(*tx));err = uart_tx(uart, tx->data, tx->len, SYS_FOREVER_MS);if (err) {k_fifo_put(&fifo_uart_tx_data, tx);}

Step-3: 使用k_fifo_get消费数据

 buf = k_fifo_get(&fifo_uart_tx_data, K_NO_WAIT);if (!buf) {return;}if (uart_tx(uart, buf->data, buf->len, SYS_FOREVER_MS)) {LOG_WRN("Failed to send data over UART");}

2.2 生产-消费类型范例

3 注意事项

3.1 内存管理

// 正确:确保数据项在消费前有效
struct data_item *item = k_malloc(sizeof(*item));
k_fifo_put(fifo, item);// 错误:栈变量在离开作用域后无效
struct data_item item;
k_fifo_put(fifo, &item);  // 严重错误!

3.2 线程安全边界

  • FIFO操作本身是线程安全的

  • 但数据内容的安全性需要开发者自己保证

示例安全模式:

// 生产者
struct data *item = k_malloc(sizeof(*item));
item->value = compute_value();  // 在放入FIFO前完成所有数据准备
k_fifo_put(fifo, item);        // 之后不再修改item// 消费者
struct data *item = k_fifo_get(fifo, K_FOREVER);
use_value(item->value);        // 安全使用数据
k_free(item);

相关文章:

Zephyr OS 中的 FIFO 接口应用介绍

目录 概述 1 FIFO的接口函数 1.1 K_FIFO_DEFINE函数 1.2 k_fifo_init函数 1.3 k_fifo_put函数 1.4 k_fifo_get 函数 1.5 k_fifo_is_empty 函数 2 应用验证 2.1 UART中使用FIFO范例 2.2 生产-消费类型范例 3 注意事项 3.1 内存管理 3.2 线程安全边界 概述 Zephy…...

前端基础之CSS

基本语法规范 引入方式 1.内部引入 <style>p{color:blue ;font-size:30px;}</style> 2.行级引入 <p style "color : green ;font-size : 40px;">hello ,wyx</p><p>hello , wyx1</p><h1>hello , wyx2</h1> 3.外…...

【Linux网络】DNS与ICMP

DNS(Domain Name System) DNS是一整套从域名映射到IP的系统。 DNS背景 TCP/IP使用IP地址和端口号来确定网络上的一台主机的一个程序。但是IP地址不方便记忆。 于是人们发明了一种叫主机名的东西&#xff0c;是一个字符串&#xff0c;并且使用hosts文件来描述主机名和IP地址的…...

第二十七天打卡

一些函数 for i in range(2, 10000):if is_prime(i):print(i) if ...: 这是 Python 里的条件判断语句&#xff0c;当 is_prime(i) 的返回值为 True 时&#xff0c;就会执行 if 语句块里的代码。 func.__name__ 的作用 func.__name__ 是 Python 中函数对象的一个特殊属性&am…...

38-日语学习小程序

系统功能特点&#xff1a; 技术栈: springBootVueMysqlUni-app 功能点: 用户端 管理员端 用户端: 1.首页: 轮播图展示、N2词汇列表、网站公告列表 2.学习模块: 有五十音图 词汇 语法 3.社区模块: 可进行发帖 也可查看帖子进行回复 可查看小组 4.我的: N2词汇(点击查看详情…...

信贷风控笔记6——风控常用指标(面试准备14)

一、PSI&#xff1a; 1.计算过程&#xff1a;变量分箱10-20箱&#xff1b;统计各分箱内样本占比&#xff1b; 算各个分箱的index&#xff08;实际占比-预期占比&#xff09;*ln&#xff08;实际占比/预期占比&#xff09;&#xff1b; 将各分箱index求和得PSI 2.情况分类&…...

UDP三种通信方式

单播&#xff08;Unicast&#xff09; 单播是最常见的通信方式&#xff0c;数据从一个发送方传输到一个特定的接收方。发送方将数据包发送到接收方的IP地址和端口号&#xff0c;接收方通过监听指定的端口接收数据。单播适用于一对一的通信场景。 import java.net.DatagramPac…...

Windows运维工具批处理版

测试环境&#xff1a;windows10 必看&#xff1a; 1.新建记事本&#xff0c;另存为&#xff1a;文件类型所有文件&#xff0c;文件名运维.bat&#xff0c;编码ansi&#xff0c;复制代码&#xff0c;保存&#xff0c;双击运行 2.有的功能需要输入管理员密码&#xff0c;如果没…...

无需配置光猫,使用网管交换机配合路由器的IPTV功能实现单线复用

一、背景 弱电箱和电视柜只预留了一根网线&#xff0c;路由器放在电视柜&#xff0c;想实现既可以上网又可以正常观看iptv&#xff0c;本文提供了一种方法。 二、准备工作 1、带iptv功能的路由器&#xff1b;2、水星sg105pro网管交换机&#xff1b;3、网线若干&#xff1b; …...

Elasticsearch 官网阅读之 Term-level Queries

Term-level Queries 参考&#xff1a;https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-exists-query 一、Term Query Term Query 是 term 精准查询。需要注意的是&#xff0c;在进行 Term Query 的时候&#xff0c;要避免 text 类型的字段&#x…...

医疗大模型技术演进与行业应用全景

摘要 本文系统梳理医疗大模型技术架构的三大演进阶段,深度解析Transformer架构优化、多模态融合、模型压缩等核心技术突破。结合Google Med-PaLM、启真医疗大模型等16个典型行业案例,揭示医疗大模型在诊断辅助、药物研发、医院管理等九大场景的应用成效。基于权威评测数据,…...

【软考 McCabe度量法】

McCabe度量法&#xff08;McCabe’s Cyclomatic Complexity&#xff09;是由Thomas McCabe提出的一种用于衡量程序模块环路复杂性的软件度量方法。它通过分析代码的控制流结构来评估程序的复杂度&#xff0c;帮助开发者识别难以维护或测试风险较高的代码区域。 一、McCabe度量法…...

LabVIEW光谱信号仿真与数据处理

在光谱分析领域&#xff0c;LabVIEW 凭借其图形化编程、丰富函数库及强大数据处理能力&#xff0c;成为高效工具。本案例将介绍如何利用 LabVIEW 仿真光谱信号&#xff0c;并对实际采集的光谱数据进行处理&#xff0c;涵盖信号生成、数据采集、滤波、分析及显示等环节。 ​ 一…...

从零开始认识 Node.js:异步非阻塞的魅力

Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境&#xff0c;用于在服务器端运行 JavaScript 代码。它的设计目标是让开发者能够用 JavaScript 构建高性能、可扩展的网络应用。以下是关于 Node.js 的详细介绍&#xff1a; 1. 核心特点 事件驱动与非阻塞 I/O&…...

ECMAScript 2018(ES2018):异步编程与正则表达式的深度进化

1.版本背景与发布 发布时间&#xff1a;2018年6月&#xff0c;由ECMA International正式发布&#xff0c;标准编号为ECMA-262 9th Edition。历史意义&#xff1a;作为ES6之后的第三次年度更新&#xff0c;ES2018聚焦于异步编程、正则表达式和对象操作的标准化&#xff0c;推动…...

【gitee 初学者矿建仓库】

简易的命令行入门教程: Git 全局设置: git config --global user.name "你的名字"触摸 git config --global user.email "你的邮箱"创建 git 仓库: mkdir codestore cd codestore git init -b "main" touch README.md # 选择运行 git add REA…...

Java 类和对象

文章目录 类和对象实例化对象this构造和初始化封装访问修饰限定符包自定义包 static代码块 类和对象 Java当中一切皆对象对象是什么呢&#xff1f; 比如是一个人&#xff0c;手机等怎么描述对象呢&#xff1f; 可以用类描述对象&#xff0c;可以理解类为一个模版&#xff0c;用…...

湖北理元理律师事务所:科学债务管理模型构建实录

债务问题本质是资源错配问题。湖北理元理律师事务所基于400案例的司法大数据&#xff0c;提炼出一套“三阶九步”债务管理模型&#xff0c;本文从技术视角解析其运作逻辑与实操价值。 模型架构&#xff1a;从诊断到执行的全周期管理 阶段一&#xff1a;债务体检&#xff08;1…...

JavaScript vs Python 用于 Web Scraping(2025):终极对比指南

1. 引言 在不断发展的 Web Scraping 领域&#xff0c;选择合适的编程语言对于项目的成功至关重要。虽然 JavaScript 和 Python 在 2025 年仍然是 Web Scraping 领域的热门选择&#xff0c;但它们各自具备不同的优势和挑战。 本指南将深入分析 JavaScript 和 Python 的核心特性…...

数据结构day3

一、gdb调试 gcc -g main.c linklist.c // 对两个.c文件进行编译,生成 a.out 文件 gdb a.out //调试可执行文件 a.out b linklist.c:36 // 在该.c文件第 36 行设置断点 r // 运行程序,但会在断点前停…...

VSCode launch.json 配置参数详解

使用 launch.json 配置调试环境时&#xff0c;会涉及到多个参数&#xff0c;用于定义调试器的行为和目标执行环境。以下是一些常用的配置参数&#xff1a; 1、"type" &#xff1a;指定调试器的类型&#xff0c;例如 "node" 表示 Node.js 调试器&#xff0…...

[已解决] LaTeX “Unicode character“ 报错 (中文字符处理)

问题&#xff1a; 写 LaTeX 文档&#xff0c;特别是包含中文时&#xff0c;经常遇到类似下图的 “Unicode character XXXXXX” 报错 (X) Unicode character 本 (U672C) LaTeX [行 xx, 列 x] (X) Unicode character 报 (U62A5) LaTeX [行 xx, 列 x] ...这通常意味着我们的 LaTe…...

c++成员函数返回类对象引用和直接返回类对象的区别

c成员函数返回类对象引用和直接返回类对象的区别 成员函数直接返回类对象&#xff08;返回临时对象&#xff0c;对象拷贝&#xff09; #include <iostream> class MyInt { public:int value;//构造函数explicit MyInt(int v0) : value(v){}//加法操作,返回对象副本&…...

python项目参考文献

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

Go语言实现链式调用

在 Go 语言中实现链式调用&#xff08;Method Chaining&#xff09;&#xff0c;可以通过让每个方法返回对象本身&#xff08;或对象的指针&#xff09;来实现。这样每次方法调用后可以继续调用其他方法。 示例&#xff1a;实现字符串的链式操作 假设你想对一个字符串连续执行…...

深入解析SpringMVC:从入门到精通

上文了解到SpingBoot的相关知识&#xff0c;此文开启Sping家族下的新篇章 1. 什么是SpringWebMVC&#xff1f; 官方对于SpringMVC的描述是这样的&#xff1a; 什么是Servlet呢? Servlet 是⼀种实现动态页面的技术.准确来讲Servlet是⼀套JavaWeb开发的规范&#xff0c;或者说…...

Java-Collections类高效应用的全面指南

Java-Collections类高效应用的全面指南 前言一、Collections 类概述二、Collections 类的基础方法2.1 排序操作2.1.1 sort方法2.1.2 reverse方法2.1.3 shuffle方法 2.2 查找与替换操作2.2.1 binarySearch方法2.2.2 max和min方法2.2.3 replaceAll方法 三、Collections 类的高级应…...

微软家各种copilot的AI产品:Github copilot、Microsoft copilot

背景 大家可能听到很多copilot&#xff0c;比如 Github Copilot&#xff0c;Microsoft Copilot、Microsoft 365 Copilot&#xff0c;有什么区别 Github Copilot&#xff1a;有网页版、有插件&#xff08;idea、vscode等的插件&#xff09;&#xff0c;都是面向于程序员的。Mi…...

JAVA EE_HTTP

为什么意气风发的少年&#xff0c;总是听不进去别人的劝解。 ​​​​​​​ ​​​​​​​ ----------陳長生. ❀主页&#xff1a;陳長生.-CSDN博客❀ &#x1f4d5;上一篇&#xff1a;JAVA EE_网络原理_数据链路层-CSDN博客 1.HTTP 1.1.HTTP是什么 H…...

SEO 优化实战:ZKmall模板商城的 B2C商城的 URL 重构与结构化数据

在搜索引擎算法日益复杂的今天&#xff0c;B2C商城想要在海量信息中脱颖而出&#xff0c;仅靠优质商品和营销活动远远不够。ZKmall模板商城以实战为导向&#xff0c;通过URL 重构与结构化数据优化两大核心策略&#xff0c;帮助 B2C 商城实现从底层架构到搜索展示的全面升级&…...

使用HtmlAgilityPack采集墨迹天气中的天气数据

需要解析对应的HTML源码&#xff1a; <div class"left"><div class"wea_alert clearfix"><ul><li><a href "https://tianqi.moji.com/aqi/china/jiangxi/hukou-county" >< span class"level level_2&qu…...

广和通L610模块通过AT指令访问服务器方案:嵌赛使用

实现步骤及关键点&#xff1a; 网络连接配置 ATCGDCONT1,"IP","APN名称" // 设置APN ATCGACT1,1 // 激活PDP上下文 ATCGATT1 // 附着GPRS网络 HTTP协议支持验证 L610支持HTTP客户端功能&#xff0c;关键指…...

nodejs快速入门到精通1

参考 nodejs快速入门到精通 菜鸟教程-nodejs nodejs官方文档 原因 视频免费 资料收费 笔记还是自己写吧 安装 nodejs官网 windows下&#xff1a; #查看nodejs版本 node -v #查看npm版本 npm -v #设置npm为淘宝镜像源 npm config set registry https://registry.npmmirror.…...

Linux下软件安装

一、软件安装方式 在 Linux 系统中&#xff0c;常见的软件安装方式有以下几种&#xff1a; 包管理器安装&#xff08;如 yum、apt&#xff09; 这是最便捷的安装方式&#xff0c;通过系统自带的包管理器从官方软件源下载并安装软件。 # CentOS/RHEL系统使用yum安装 yum insta…...

React Fiber 架构深度解析:时间切片与性能优化的核心引擎

文章目录 前言一、Fiber 架构的诞生背景二、Fiber 架构的核心概念1. Fiber 节点2. Fiber 节点的结构3. 双缓存机制4. 增量渲染与优先级调度 三、时间切片技术详解1. 时间切片的定义与原理2. 时间切片与 JavaScript 事件循环3. 时间切片的实现方式4. 时间切片的优势 四、Fiber 架…...

mcp学习笔记

MCP&#xff08;Model Context Protocol&#xff09;是一种由Anthropic推出的开放协议&#xff0c;旨在统一大型语言模型&#xff08;LLM&#xff09;与外部数据源/工具之间的交互。其核心组件包括 ​MCP Client、MCP Server​ 和 ​Function Calling​ 机制&#xff0c;三者协…...

鸿蒙北向源码开发: 检查应用接口dts文件api规范性

开源鸿蒙5.0.2对应的api版本是14 5.0社区仓有工具检查接口规范性报告工具: interface/sdk-js/build-tools/api_check_plugin api_check_plugin是什么? 在解释api_check_plugin是什么之前得先知道 应用调用的api接口都是文件名后缀为.d.ts的文件,这些文件内部声明了arkts的a…...

Redis设计与实现——分布式Redis

Redis Sentinel&#xff08;哨兵&#xff09; Sentinel 的工作机制 故障检测&#xff08;Failure Detection&#xff09; 主观下线&#xff08;Subjective Down&#xff09;&#xff1a;单个 Sentinel 实例检测到主节点在30 秒内无响应&#xff0c;标记其为 SDOWN。 客观下线…...

【Redis】Hash 哈希

文章目录 常用命令hsethgethmgethexistshkeyshvalshgetallhdelhlenhsetnxhincrbyhincrbyfloat 内部编码应用场景 Redis 存储键值对&#xff0c;也就是 key - value&#xff0c;不过同时也允许 value 也为键值对&#xff0c;但此时为了避免冲突&#xff0c;为 field - value PS…...

【matlab技巧】通过手绘的方法设计二维运动轨迹,附MATLAB程序

代码提供了一种直观的方式来使用鼠标在图形窗口中绘制线条&#xff0c;同时能够记录并显示用户绘制的轨迹坐标。用户通过左键点击绘制点&#xff0c;右键点击结束绘制&#xff0c;适合用于简单的图形交互和数据可视化。 文章目录 代码作用运行MATLAB源代码代码详解 代码作用 这…...

游戏引擎学习第290天:完成分离渲染

game_sim_region.cpp&#xff1a;在BeginSim中移除EntityOverlapsRectangle调用 现在我们接近一个关键点&#xff0c;虽然还没完全结束&#xff0c;但我们已经把所有东西迁移到了一个新概念上——即那些临时创建的控制器结构&#xff0c;称为“脑”&#xff08;brains&#xf…...

uniapp-商城-61-后台 新增商品(添加商品到数据库)

完成商品的布局&#xff0c;完成商品的属性添加&#xff0c;最后的目的还是要完成数据添加&#xff0c;将我们前台的数据添加后台的数据库。 1、界面 2、点击提交完成商品添加 点击下方的提交按钮&#xff0c;将数据添加到数据库。 onSubmit 使用该函数---见3 <view cla…...

深入浅出IIC协议 - 从总线原理到FPGA实战开发 -- 第一篇:I2C总线协议深度解剖

第一篇&#xff1a;I2C总线协议深度解剖 副标题 : 两根线如何征服千亿设备&#xff1f;详解硬件工程师必须掌握的通信奥义 1. 为什么I2C仍是嵌入式经典&#xff1f; 1.1 总线拓扑的哲学 拓扑对比图 SPI需4线N片选 vs I2C仅2线级联 UART点对点 vs I2C多主从架构 成本控制实…...

QT之LayOut布局

文章目录 QFormLayoutQGridLayoutQFormLayout、QGridLayout、QHBoxLayout、QVBoxLayout综合案例用QFormLayout 代替 界面左边部分的QGridLayout QFormLayout #include "widget.h"#include <QFormLayout> #include <QLineEdit>Widget::Widget(QWidget *p…...

ubuntu 24.04安装ros1 noetic

为了后续能够找到安装方法&#xff0c;记录一下&#xff1a; 参考如下链接安装&#xff1a; https://www.reddit.com/r/ROS/comments/158icpy/compiling_ros1_noetic_from_source_on_ubuntu_2204/ 安装步骤如下&#xff1a; 1.获取apt 包 sudo apt-get install python3-ros…...

动态规划-64.最小路径和-力扣(LetCode)

一、题目解析 从左上角到右下角使得数字总和最小且只能向下或向右移动 二、算法原理 1.状态表示 我们需要求到达[i,j]位置时数字总和的最小值&#xff0c;所以dp[i][j]表示&#xff1a;到达[i,j]位置时&#xff0c;路径数字总和的最小值。 2.状态转移方程 到达[i,j]之前要先…...

Python爬虫(29)Python爬虫高阶:动态页面处理与云原生部署全链路实践(Selenium、Scrapy、K8s)

目录 引言&#xff1a;动态爬虫的技术挑战与云原生机遇一、动态页面处理&#xff1a;Selenium与Scrapy的协同作战1.1 Selenium的核心价值与局限1.2 Scrapy-Selenium中间件开发1.3 动态分页处理实战&#xff1a;京东商品爬虫 二、云原生部署&#xff1a;Kubernetes架构设计与优化…...

FauxGen:一款由 CodeBuddy 主动构建的假数据生成器

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 在前端开发中&#xff0c;经常需要一些「假数据」来模拟真实接口&#xff0c;便于开发阶段的界面构建和功能测试…...

chrome 浏览器插件 myTools, 日常小工具。

1. 起因&#xff0c; 目的: 比如&#xff0c;chatgpt, google&#xff0c; 打开网页&#xff0c;就能直接输入文字&#xff0c;然后 grok 就不行&#xff0c;必须用鼠标点一下&#xff0c;才能输入文字。 对我而言&#xff0c;是个痛点&#xff01;写个插件&#xff0c;自动点…...

从代码学习深度学习 - 词嵌入(word2vec)PyTorch版

文章目录 前言1. 为什么需要词嵌入?2. 早期尝试:独热向量 (One-Hot Vectors)独热向量的局限性3. 自监督的 word2vec4. 跳元模型 (Skip-Gram Model)4.1. 训练5. 连续词袋 (CBOW) 模型5.1. 训练总结前言 自然语言处理(NLP)是人工智能领域中一个充满活力和挑战的分支。要让计…...