Linux UWB Stack实现——MCPS帧处理

MCPS帧处理

用于处理IEEE 802.15.4中的相关帧,Frame Processing,简写为:fproc。

在实现中,维护了关于帧处理的有限状态机(FSM)。本文从帧处理的数据结构和部分典型处理实现上进行简要的介绍。

1. 数据结构定义

关于帧处理状态机相关的事件回调定义为struct mcps802154_fproc_state,用于处理从活跃状态的转换。

struct mcps802154_fproc_state {/** @name: State name. */const char *name;/** @enter: Run when the state is entered. */void (*enter)(struct mcps802154_local *local);/** @leave: Run when the state is left. */void (*leave)(struct mcps802154_local *local);/** @rx_frame: Handle frame reception. */void (*rx_frame)(struct mcps802154_local *local);/** @rx_timeout: Handle reception timeout. */void (*rx_timeout)(struct mcps802154_local *local);/** @rx_error: Handle reception error. */void (*rx_error)(struct mcps802154_local *local,enum mcps802154_rx_error_type error);/** @tx_done: Handle end of transmission. */void (*tx_done)(struct mcps802154_local *local);/** @broken: Handle unrecoverable error. */void (*broken)(struct mcps802154_local *local);/** @timer_expired: Handle timer expiration. */void (*timer_expired)(struct mcps802154_local *local);/** @schedule_change: Handle schedule change. */void (*schedule_change)(struct mcps802154_local *local);
};

主要包括了entered、left、rx_frame、rx_timeout、rx_error、tx_done、broken、timer_expired、schedule_change几个状态,通过该结构体定义了相关状态切换对应的回调函数。

在MCPS的私有数据struct mcps802154_local中,定义了帧处理的私有数据,通过结构体struct mcps802154_fproc实现。

struct mcps802154_fproc {/** 指向当前状态的指针 */const struct mcps802154_fproc_state *state;/** 指向正在处理中访问的指针 */struct mcps802154_access *access;/** 发送帧的buffer指针 */struct sk_buff *tx_skb;/** 多帧方法下的帧索引 */size_t frame_idx;
};

由于fproc的相关处理大多会涉及到MCPS私有数据的访问,因此在文件中通过对结构体进行声明struct mcps802154_local(未直接引用头文件的方式)。
帧处理相关操作包括:

  • mcps802154_fproc_init,初始化;
  • mcps802154_fproc_uninit,去初始化;
  • mcps802154_fproc_change_state,更换活跃状态;
  • mcps802154_fproc_access,获取访问access并处理,需要下一访问机会的时间信息;
  • mcps802154_fproc_access_now,与上一接口的区别在于,直接获取当前时间的访问,并进行处理,可以理解为上一函数的封装;
  • mcps802154_fproc_access_done,访问完成,释放;
  • mcps802154_fproc_access_reset,当出现错误后,复位一个access;当接收到意外事件时,当前专属的帧和当前访问被保留,可能被底层驱动使用。当驱动器重启或停止时,缓冲区和访问可被释放。
  • mcps802154_fproc_stopped_handle,进入Stopped状态处理,fproc_stopped.c中定义;
  • mcps802154_fproc_broken_handle,进入broken状态处理,fproc_broken.c中定义;
  • mcps802154_fproc_nothing_handle,处理非活跃状态,fproc_nothins.c文件;
  • mcps802154_fproc_rx_handle,处理一个接收访问及改变状态;
  • mcps802154_fproc_tx_handle,除了第一个发送访问及改变状态;
  • mcps802154_fproc_multi_handle,处理多帧访问,改变状态;
  • mcps802154_fproc_vendor_handle,处理一个有供应商管理的多帧访问。

2. 相关代码实现

关于MCPS802154的帧,通过分配sk_buff来存储,主要构成包括:帧头 + 载荷 + FCS(IEEE802154_FCS_LEN)。
通过struct sk_buff *mcps802154_frame_alloc(struct mcps802154_llhw *llhw, unsigned int size, gfp_t flags)函数实现。

2.1 帧处理状态切换

通过调用mcps802154_fproc_change_state函数,主要操作:当前的状态调用leave回调函数(若有),并将MCPS私有域的状态切换为新的状态,若定义了enter函数,则调用enter回调函数。

void mcps802154_fproc_change_state( struct mcps802154_local *local, const struct mcps802154_fproc_state *new_state)
{if (local->fproc.state->leave)local->fproc.state->leave(local);local->fproc.state = new_state;if (local->fproc.state->enter)local->fproc.state->enter(local);
}

2.2 帧处理访问

通过函数void mcps802154_fproc_access(struct mcps802154_local *local, u32 next_timestamp_dtu)实现帧处理的访问,通过mcps802154_ca_get_access函数,获取access指针,进行处理。

关于帧的访问操作,根据不同的访问方式来调用不同的帧处理,主要包括rx、tx、multi以及vendor。

	switch (access->method) {case MCPS802154_ACCESS_METHOD_NOTHING:mcps802154_fproc_nothing_handle(local);r = 0;break;case MCPS802154_ACCESS_METHOD_IMMEDIATE_RX:r = mcps802154_fproc_rx_handle(local, access);break;case MCPS802154_ACCESS_METHOD_IMMEDIATE_TX:r = mcps802154_fproc_tx_handle(local, access);break;case MCPS802154_ACCESS_METHOD_MULTI:r = mcps802154_fproc_multi_handle(local, access);break;case MCPS802154_ACCESS_METHOD_VENDOR:r = mcps802154_fproc_vendor_handle(local, access);break;default:r = -1;}

2.3 帧接收

void mcps802154_rx_frame(struct mcps802154_llhw *llhw)
{// 基于底层硬件获取当前的MCPS802154本地私有数据指针struct mcps802154_local *local = llhw_to_local(llhw);// 状态机加锁mutex_lock(&local->fsm_lock);trace_llhw_event_rx_frame(local);// 调用当前状态的rx_frame回调函数if (local->fproc.state->rx_frame)local->fproc.state->rx_frame(local);elsemcps802154_broken_safe(local);trace_llhw_event_done(local);mutex_unlock(&local->fsm_lock);
}
EXPORT_SYMBOL(mcps802154_rx_frame);

对于rx_timeout、rx_error、tx_done等均为类似的处理方式,最后都通过EXPORT_SYMBOL宏,就符号导出供其他模块使用。

  • mcps802154_rx_timeout
  • mcps802154_rx_error
  • mcps802154_tx_done

2.4 帧接收状态

可以看到在帧处理获得访问之后,将调用mcps802154_fpoc_rx_handle来处理对应状态下的操作,对于接收的帧处理状态定义如下:

static const struct mcps802154_fproc_state mcps802154_fproc_rx = {.name = "rx",.rx_frame = mcps802154_fproc_rx_rx_frame,.rx_error = mcps802154_fproc_rx_rx_error,.schedule_change = mcps802154_fproc_rx_schedule_change,
};int mcps802154_fproc_rx_handle(struct mcps802154_local *local,struct mcps802154_access *access)
{int r;struct mcps802154_rx_info rx_info = {.flags = MCPS802154_RX_INFO_AACK,.timeout_dtu = -1,};r = llhw_rx_enable(local, &rx_info, 0);if (r)return r;mcps802154_fproc_change_state(local, &mcps802154_fproc_rx);return 0;
}

状态定义中,仅定义了rx_frame、rx_error以及schedule_change,分别处理帧接收、帧接收错误处理以及调度切换。

接收帧处理中,底层硬件使能接收,然后将帧处理状态切换到mcps802154_fproc_rx

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

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

相关文章

如何使用 MiniGPT-v2

MiniGPT-v2 是一个基于视觉语言模型(LLM)的多任务学习系统。它可以用于各种视觉语言任务,包括图像描述、图像识别、图像-文本对话等。 本文将介绍如何使用 MiniGPT-v2。 MiniGPT-v2 提供了一个简单的在线演示,可以用于测试模型。…

如何取消a链接点击时的背景颜色

引言 在网页设计中,链接是非常重要的元素之一。当用户点击链接时,通常会出现一个背景颜色或者下划线来表示链接的状态。然而,有时候我们可能希望取消链接点击时出现的背景颜色,以便更好地控制链接的外观。本文将介绍如何取消a链接…

2023.10.18

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();private slot…

手机怎么监控电脑?

随着企业对电脑监控需求的增加&#xff0c;越来越多的管理者意识到使用电脑监控电脑的不便性&#xff0c;一旦外出就无法实时查看监控。其实可以用手机实现监控电脑的需求&#xff0c;只需在被监控端安装电脑监控软件后&#xff0c;将电脑设备和员工信息进行绑定&#xff0c;使…

npm 执行命令时报错npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve

npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While resolving: vue-office/docx1.3.0 npm ERR! Found: vue-demi0.14.6 npm ERR! node_modules/vue-demi npm ERR! vue-demi“^0.14.6” from the root project npm ERR! vue-demi“*” from …

linux系统编程之一

1&#xff09;fcntl的使用方法 fcntl作用:可以用fcntl函数改变一个已打开的文件属性而不必重新打开文件&#xff1b; 堆排序是完全二叉树&#xff0c;但不是排序二叉树&#xff1b; 排序二叉树要求兄弟节点之间有大小关系&#xff0c;比如说左小右大&#xff1b; 堆排序仅要求…

神经网络硬件加速器-DPU分析

一 DPU概述 DPU是专为卷积神经网络优化的可编程引擎&#xff0c;其使用专用指令集&#xff0c;支持诸多卷积神经网络的有效实现。 1、关键模块 卷积引擎&#xff1a;常规CONV等ALU&#xff1a;DepthwiseConvScheduler&#xff1a;指令调度分发Buffer Group&#xff1a;片上数据…

加深我对typeScript的印象(、|、Partial、Required、Pick、Omit)

发现有错误、或者理解错误&#xff0c;及时联系我&#xff0c;感谢&#xff01;&#xff01; 文章目录 1、‘&’符号2、‘|’符号3、‘‘Partial’’4、‘Required’5、‘Pick’6、 ‘Omit’ testA、testB、testC是我下面要用到的类 type testA {name: string,age: numbe…

Can Language Models Make Fun? A Case Study in Chinese Comical Crosstalk

本文是LLM系列文章&#xff0c;针对《Can Language Models Make Fun? A Case Study in Chinese Comical Crosstalk》的翻译。 语言模型能制造乐趣吗?中国滑稽相声个案研究 摘要1 引言2 问题定义3 数据集4 使用自动评估生成基准5 人工评估6 讨论7 结论与未来工作 摘要 语言是…

旧版Mac如何装新系统

macOS Ventura 最低系统需要&#xff0c;17年序列电脑。老电脑15年的&#xff0c;无法安装新系统。使用方法直接采用大佬方法 一.在GitHub下载 OpenCore、Hackintool OpenCore 用来修改系统的机型&#xff0c;修改后可直接在软件更新中更新macOS Ventura。 Hackintool 用来生…

基于JAVA+SpringBoot+UniApp+Vue的前后端分离的手机移动端图书借阅平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会信息化的快速…

Pandas与数据库交互详解

Pandas 是一个强大的数据分析库&#xff0c;可以与各种数据库进行交互&#xff0c;从而可以方便地从数据库中读取数据、分析数据&#xff0c;并将结果写回数据库中。以下是使用 Pandas 与数据库交互的一般步骤&#xff1a; 一 、数据库交互 安装必要的库&#xff1a;首先&…

标签页的使用

目录 1、引用TabSheet.h和TabSheet.cpp文件&#xff1a; 2、主窗口添加标签页&#xff1a; &#xff08;1&#xff09;、标签页的创建和属性更改 &#xff08;2&#xff09;、添加俩个标签页的类 &#xff08;3&#xff09;、主窗口添加成员变量 &#xff08;4&#xff09…

AI爆文变现-写作项目-脚本配置教程-解放双手

之前给大家分享过AI爆文的写作教程&#xff0c;没看过的可以看下对应的教程&#xff1a; AI爆文撸流量主保姆级教程2.0 因为是怼量&#xff0c;为了高效完成文章&#xff0c;我用python脚本实现了自动写文章的功能&#xff0c;发布文章目前还是要手动进行。 AI爆文教程参考&…

【论文阅读】点云地图动态障碍物去除基准 A Dynamic Points Removal Benchmark in Point Cloud Maps

【论文阅读】点云地图动态障碍物去除基准 A Dynamic Points Removal Benchmark in Point Cloud Maps 终于一次轮到了讲自己的paper了 hahaha&#xff0c;写个中文的解读放在博客方便大家讨论 Title Picture Reference and prenotes paper: https://arxiv.org/abs/2307.07260 …

中国社科院与美国杜兰大学金融管理硕士---不将就的人生

“万般皆下品&#xff0c;惟有读书高”、“书中自有颜如玉&#xff0c;书中自有黄金屋”&#xff0c;古往今来&#xff0c;读书的好处为人们所重视。从而想拿到学历没有知识的沉淀&#xff0c;没有一定的学识水平&#xff0c;又怎么能拿到含金量颇高的学历呢&#xff1f;退一步…

vue图片懒加载

Vue图片懒加载是一种优化页面性能的技术&#xff0c;它可以延迟加载页面上的图片&#xff0c;直到它们进入可见区域。这可以减少页面的加载时间&#xff0c;提高用户体验。 在Vue中实现图片懒加载可以使用第三方库vue-lazyload。首先需要安装该库&#xff1a; npm install vu…

高校教务系统登录页面JS分析——华东交通大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

【LeetCode刷题(数据结构与算法)】:合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的 **思路&#xff1a;定义一个头尾指针置为NULL while循环依次比较两个链表的值的大小 遍历链表 比较完数值大小过后连接到tail的尾部 然后各自的链表的节点的next指针指向下一…

电脑开不了机用U盘重装系统Win10教程

如果我们遇到了电脑开不起机的问题&#xff0c;这给我们的正常使用带来了很大的影响。这时候我们可以借助U盘重装系统的方法&#xff0c;轻松应对这一问题。下面小编给大家详细介绍关于用U盘给开不机的电脑重装Win10系统的教程步骤&#xff0c;操作后用户就能正常使用电脑了。 …