FIFO的应用案例(基于Zephyr OS )

目录

概述

1.  软硬件环境

1.1 软件开发环境

1.2 硬件环境 

2 FIFO的函数接口

3 FIFO的应用函数实现

3.1 实现步骤

3.2  代码设计 

3.3 测试代码实现

3.4 源代码文件

4 编译和测试

4.1 编译代码

 4.2 测试


概述

本文介绍了在nRF52832开发板上使用Zephyr操作系统进行FIFO(先进先出队列)功能开发的软硬件环境及实现步骤。软件开发环境基于Nordic提供的nRF Connect SDK,集成了Zephyr平台、编译工具链和VS Code开发环境。硬件环境为nRF52832开发板,具备丰富的接口和调试功能。文章详细描述了FIFO的API函数及其使用方法,包括初始化、数据放入和获取等操作。通过生产者-消费者模型,展示了如何在Zephyr中实现FIFO功能,并提供了完整的代码示例。最后,文章介绍了使用VS Code编译和测试代码的过程,确保功能正常运行。

1.  软硬件环境

1.1 软件开发环境

nordic提供了基于zephyr平台sdk, 其提供了大量的demo可供开发者参考和使用,同时nordi还提供一个集成的软件库工具,方便开发者安装相应的SDK和编译工具链。集成环境同时包含了其他的一些软件,非常便于进行项目开发。

软件工具功能版本信息
nRF Connect SDK nordic提供基于zephyr的代码库v2.9.0 
nRF Connect SDK Toolchain代码编译工具v2.9.1
VS-CODE集成开发环境v1.99.3 
nRF Connect for Desktopnordic集成工具链v5.1.0
nRF Connect手机App

手机App下载地址:

https://nav.nordicsemi.com/search?query=nRF%20Connect

1.2 硬件环境 

本案例是在nRF52832开发板(nRF52-DK)上实现的,该开发板nRF52832的主要特点如下:

1)板载j-link调试接口

2)引出所有 IO接口,用户可根据实际应用,外载其他设备

3)支持4个LED

4)支持4路Key接口

5)板载UART调试接口,方便打印调试信息

2 FIFO的函数接口

zephyr OS提供了操作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是否为空

 具有使用方法可以参考原文:

Zephyr OS 中的 FIFO 接口应用介绍-CSDN博客

3 FIFO的应用函数实现

3.1 实现步骤

在zephyr OS使用FIFO功能的步骤如下:

Step-1: 使用K_FIFO_DEFINE初始化一个FIFO

Step-2:   使用k_fifo_put接口发送数据

Step-3:   使用 k_fifo_get 函数接收数据,同时释放内存 


注意点:
在在zephyr OS使用FIFO需要包括如下头文件:

#include <zephyr/kernel.h>

3.2  代码设计 

1)定义User的数据格式

struct user_data_t {void *fifo_reserved;int value;
};

2)创建和初始化FIFO

static K_FIFO_DEFINE(fifo_tx_data);

 3) 设计Producer用于生产数据

void producer_thread( void )
{printk(" \r\n");printk(" \r\n");printk("Produced: run thread \r\n ");for (int i = 0; i < 300; i++) {// 动态分配数据项struct user_data_t *tx = k_malloc(sizeof(*tx));tx->value = i;// 放入FIFOk_fifo_put(&fifo_tx_data, tx);printk("Produced: %d \r\n", i);k_sem_give(&nus_write_sem);k_sleep(K_MSEC(100));}
}

4)设计consumer用于使用数据

void consumer_thread( void )
{int err;printk(" \r\n");printk(" \r\n");err = k_sem_take(&nus_write_sem, K_MSEC(1000));if (err) {printk("Consumed: NUS send timeout  \r\n");}struct user_data_t *item = k_fifo_get(&fifo_tx_data, K_NO_WAIT);if (item != NULL) {printk("Consumed: %d \r\n", item->value);k_free(item);} else {printk("Consumed: Timeout waiting for data \r\n");}
}

3.3 测试代码实现

1)定义生产者线程 

 /***    producer */int main_producer_handler(void){for (;;) {producer_thread();}}#define STACKSIZE                        1024#define PRIORITY                         7K_THREAD_DEFINE(  main_producer_id, STACKSIZE, main_producer_handler, NULL, NULL,NULL, PRIORITY, 0, 0);

2) 定义消费者线程 

 /***    consumer  */int main_customers_handler(void){for (;;) {consumer_thread();}}#define STACKSIZE_CUSTOMER               1024#define PRIORITY_CUSTOMER                8K_THREAD_DEFINE(  main_customers_id, STACKSIZE_CUSTOMER, main_customers_handler, NULL, NULL,NULL, PRIORITY_CUSTOMER, 0, 0);      

3.4 源代码文件

/* USER CODE BEGIN Header */
/********************************************************************************* File Name        :  test_fifo.h* Description      :  FIFO test demo ******************************************************************************* @attention**  COPYRIGHT:    Copyright (c) 2025  mingfei_tang*  DATE:         MAR 27th, 2025*******************************************************************************/
/* USER CODE END Header */
#include "test_fifo.h"
#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>K_SEM_DEFINE(nus_write_sem, 0, 1);// 数据项结构
struct user_data_t {void *fifo_reserved;int value;
};static K_FIFO_DEFINE(fifo_tx_data);void producer_thread( void )
{printk(" \r\n");printk(" \r\n");printk("Produced: run thread \r\n ");for (int i = 0; i < 300; i++) {// 动态分配数据项struct user_data_t *tx = k_malloc(sizeof(*tx));tx->value = i;// 放入FIFOk_fifo_put(&fifo_tx_data, tx);printk("Produced: %d \r\n", i);k_sem_give(&nus_write_sem);k_sleep(K_MSEC(100));}
}void consumer_thread( void )
{int err;printk(" \r\n");printk(" \r\n");err = k_sem_take(&nus_write_sem, K_MSEC(1000));if (err) {printk("Consumed: NUS send timeout  \r\n");}struct user_data_t *item = k_fifo_get(&fifo_tx_data, K_NO_WAIT);if (item != NULL) {printk("Consumed: %d \r\n", item->value);k_free(item);} else {printk("Consumed: Timeout waiting for data \r\n");}
}/***    producer */int main_producer_handler(void){for (;;) {producer_thread();}}#define STACKSIZE                        1024#define PRIORITY                         7K_THREAD_DEFINE(  main_producer_id, STACKSIZE, main_producer_handler, NULL, NULL,NULL, PRIORITY, 0, 0);/***    consumer  */int main_customers_handler(void){for (;;) {consumer_thread();}}#define STACKSIZE_CUSTOMER               1024#define PRIORITY_CUSTOMER                8K_THREAD_DEFINE(  main_customers_id, STACKSIZE_CUSTOMER, main_customers_handler, NULL, NULL,NULL, PRIORITY_CUSTOMER, 0, 0);                   /** End of  */

4 编译和测试

4.1 编译代码

使用Vs-code创建工程,并且编写代码,其软件架构如下:

 4.2 测试

编译完成后,下载代码至MCU,运行代码,其运行结果如下:

1) 启动过程

2) 使用FIFO生产和消费数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/81320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWS Elastic Beanstalk部署极简Spring工程(EB CLI失败版)

弃用 这里我没有走通EB CLI方式部署。 问题 最近又加入了AWS项目组&#xff0c;又要再次在AWS云上面部署Spring服务&#xff0c;我这里使用的使用AWS中国云。需要使用AWS Elastic Beanstalk部署一个极简Spring工程。 EB CLI安装 安装EB CLI之前需要先在本地安装好Git&…

粒子群算法(PSO算法)

粒子群算法概述 1.粒子群优化算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;。粒子群优化算法是在1995年由Kennedy博士和Eberhart博士一起提出的&#xff0c;它源于对鸟群捕食行为的研究。 2.基本核心是利用群体中的个体对信息的共享从而使得整…

leetcode2934. 最大化数组末位元素的最少操作次数-medium

1 题目&#xff1a;最大化数组末位元素的最少操作次数 官方标定难度&#xff1a;中 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;这两个数组的长度都是 n 。 你可以执行一系列 操作&#xff08;可能不执行&#xff09;。 在每次操作中&#xff0c;你可以选…

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…

信贷域——互联网金融业务

摘要 本文深入探讨了信贷域全托与半托业务的定义、特点、适用场景及注意事项&#xff0c;并分析了互联网金融核心信息流的多个方面&#xff0c;包括资金流、信息流、风险流、合规流、物流、技术流和商流&#xff0c;还阐述了金融系统“断直连”业务的相关内容&#xff0c;以及…

科技晚报 AI 速递:今日科技热点一览 丨 2025 年 5 月 17 日

科技晚报AI速递:今日科技热点一览 丨2025年5月17日 我们为您汇总今日的科技领域最新动向&#xff0c;带您快速了解前沿技术、突破性研究及行业趋势。 黄仁勋劝特朗普&#xff1a;AI 芯片出口规则得改&#xff0c;中国紧追其后&#xff1a;英伟达 CEO 黄仁勋在华盛顿 “山与谷论…

使用streamlit实现vLLM多实例信息统一监控

本文代码和配置文件实现了一个基于 Streamlit 和 FastAPI 的前后端分离的应用程序&#xff0c;用于管理和展示 VLLM&#xff08;Very Large Language Model&#xff09;实例的信息。以下是代码和配置文件的总结摘要&#xff1a; 概要 功能概述 前后端启动方式&#xff1a; 使用…

搭建一个WordPress网站需要多少成本

WordPress 最初可能只是一个简单的博客平台。但近年来&#xff0c;它不仅成为了最好的博客平台&#xff0c;还成为了一个全面的内容管理系统。白宫、jQuery、NGINX、《纽约时报》等企业都把 WordPress 作为自己的网上家园。 不过&#xff0c;它们只是其中的佼佼者。根据 Built…

飞帆控件 post or get it when it has get

我在这里分享两个链接&#xff1a; post_get_it 设计 - 飞帆 有人看出来这个控件是干什么用吗&#xff1f; 控件的配置&#xff1a;

AI智能体 | 使用Coze一键制作“假如书籍会说话”视频,18个作品狂吸17.6万粉,读书博主新标杆!(附保姆级教程)

目录 一、整体工作流设计 二、制作工作流 2.1 开始节点 2.2 大模型_生成对话文案 2.3 代码_字幕切割 2.4 画板_对话背景 2.5 循环_对话语音01 2.5.1 选择器_2 2.5.2 语音合成02 2.5.3 语音合成03 2.5.4 变量聚合_1 2.5.5 视频合成01 2.6 循环_3 2.6.1 选择器_3 …

mysql中4种扫描方式和聚簇索引非聚簇索引【爽文一篇】

目录 一 mysql的聚簇索引&非聚簇索引 1.1 数据表 1.2 聚簇索引 1.3 非聚簇索引 1.4 覆盖索引 二 mysql的4种扫描查询 2.1 全表扫描 2.2 索引扫描 2.3 覆盖索引扫描 2.4 回表扫描 2.5 总结 三 mysql的回表查询详解 3.1 回表查询 一 mysql的聚簇索引&非聚簇…

泛微对接金蝶云星空实战案例技术分享

前言 在企业信息化建设中&#xff0c;OA系统与ERP系统对接往往是一个复杂而关键的环节。OA系统通常具有高度的自定义性&#xff0c;其基础资料和单据可能与ERP系统存在字段不一致等问题。同时&#xff0c;OA系统涉及审批流程及流程发起方定义&#xff0c;增加了对接的复杂性。…

一种资源有限单片机处理cJSON数据的方法

一般单片机处理cJSON格式的数据都直接使用cJSON库&#xff0c;但对于Ram较小的单片机&#xff0c;由于资源有限&#xff0c;这并不合适&#xff0c;但我们可以根据cJSON数据的特定格式&#xff0c;使用土方法&#xff0c;直接对字符进行查找裁剪即可 //截取字符串str中字符a与…

关于软件测试开发的一些有趣的知识

文章目录 一、什么是测试&#xff1f;二、为什么要软件测试软件测试三、测试的岗位有哪些四 、软件测试和开发的区别五、走测试岗位为什么还要学开发。4、优秀的测试人员具备的素质我为什么走测试岗位 一、什么是测试&#xff1f; 其实这个问题说简单也不简单&#xff0c;说难…

【C++ 基础数论】质数判断

质数判断 质数&#xff1a;对于所有大于 1 的自然数而言&#xff0c;如果该数除 1 和自身以外没有其它因数 / 约数&#xff0c;则该数被称为为质数&#xff0c;质数也叫素数。 如何判定一个数是否为质数呢&#xff1f; 一个简单的方法是 试除法 &#xff1a; 对于一个数 n&…

6to4、6over4的类比解释

本文由deepseek生成&#xff0c;特此声明 1. 6to4&#xff1a;自动的“快递中转站” 类比场景&#xff1a; 假设你住在一个偏远的小镇&#xff08;IPv6网络&#xff09;&#xff0c;周围被大海&#xff08;IPv4互联网&#xff09;包围&#xff0c;你想给另一个偏远小镇&#…

数字化工厂升级引擎:Modbus TCP转Profinet网关助力打造柔性生产系统

在当今的工业自动化领域&#xff0c;通信协议扮演着至关重要的角色。Modbus TCP和Profinet是两种广泛使用的工业通信协议&#xff0c;它们分别在不同的应用场景中发挥着重要作用。然而&#xff0c;有时我们可能需要将这两种协议进行转换&#xff0c;以实现不同设备之间的无缝通…

计算机网络-MPLS LDP基础实验配置

前面我们学习了LDP的会话建立、标签发布与交换、LDP的工作原理&#xff0c;今天通过一个基础实验来加深记忆。 一、LDP基础实验 实验拓扑&#xff1a; 1、IGP使用OSPF进行通告&#xff0c;使用Lookback接口作为LSR ID&#xff0c;LDP ID自动生成。 2、实验目的&#xff1a;使…

Ocean: Object-aware Anchor-free Tracking

领域&#xff1a;Object tracking It aims to infer the location of an arbitrary target in a video sequence, given only its location in the first frame 问题/现象&#xff1a; Anchor-based Siamese trackers have achieved remarkable advancements in accuracy, yet…

[Java] 方法和数组

目录 1. 方法 1.2 什么是方法 1.2 方法的定义 1.3 方法的调用 1.4 方法的重载 1.5 递归 2. 一维数组 2.1 什么是数组 2.2 数组的创建 2.3 数组的初始化 2.4 遍历数组 2.5 引用数据类型 2.6 关于null 2.7 数组转字符串 2.8 数组元素的查找 2.9 数组的排序 2.10…