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.pswp.cn/pingmian/81320.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81320.shtml
英文地址,請注明出處:http://en.pswp.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…