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。
相关文章:
Linux UWB Stack实现——MCPS帧处理
MCPS帧处理 用于处理IEEE 802.15.4中的相关帧,Frame Processing,简写为:fproc。 在实现中,维护了关于帧处理的有限状态机(FSM)。本文从帧处理的数据结构和部分典型处理实现上进行简要的介绍。 1. 数据结构定义 关于帧处理状态…...
【面试经典150 | 区间】插入区间
文章目录 Tag题目解读题目来源解题思路方法一:合并区间方法二:模拟 其他语言python3 写在最后 Tag 【模拟】【数组】 题目解读 给定一个含有多个无重叠区间的数组,并且数组已经按照区间开始值升序排序。在列表中插入一个新的区间࿰…...
前端 js 之 浏览器工作原理 和 v8引擎 01
嘿,老哥,来了就别跑 !学完 ,不亏 😂 文章目录 一、输入url 之后做了什么二、简单了解下浏览器内核三、浏览器渲染过程 (渲染引擎)四、js 引擎五、chrome五、v8 引擎原理八、浏览器性能优化九、前…...
全波形反演培训的思考与总结
一. InversionNet 最简单的端到端DL_FWI 1. 网络结构: 图1 构建了一个具有编码器-解码器结构的卷积神经网络,根据地震波动数据模拟地下速度结构。编码器主要由卷积层构建,它从输入地震数据中提取高级特征并将其压缩为单个高维向量。解码器然后…...
Arcgis聚合工具——实现简单的升尺度
找到Aggregate工具 按如下设置进行操作 注意:如有需要对应的低分辨率影像,必须点开右下角环境Environments选项,进行栅格的捕捉选项设置,以防止升尺度后的影像与需对应的低分辨率影像的栅格单元存在偏移。 点击OK,即可…...
专题:链表常考题目汇总
文章目录 反转类型:206.反转链表完整版二刷记录 25. K个一组反转链表1 :子链表左闭右闭反转版本2 : 子链表左闭右开反转版本(推荐)⭐反转链表左闭右闭和左闭右开 合并类型:21.合并两个有序链表1: 递归法2: …...
记一次mysql事务并发优化
记一次mysql事务并发优化 背景 事情的情况大致是这样的。一个扣减库存的业务上线以后,隔几天会报一次错,错误内容如下: ERROR - exception: UncategorizedSQLException,"detail":"org.springframework.jdbc.UncategorizedSQ…...
GEO生信数据挖掘(九)WGCNA分析
第六节,我们使用结核病基因数据,做了一个数据预处理的实操案例。例子中结核类型,包括结核,潜隐进展,对照和潜隐,四个类别。第七节延续上个数据,进行了差异分析。 第八节对差异基因进行富集分析。…...
Python 中,单例模式的5种实现方式(使用模块、使用装饰器、使用类方法、基于new方法实现、基于metaclass方式实现)
单例模式的5种实现方式 1 使用模块 2 使用装饰器 3 使用类方法 4.基于new方法实现 5 基于metaclass方式实现 单例模式的5种实现方式 什么是单例模式? 单例模式是指:保证一个类仅有一个实例,并提供一个访问它的全局访问点# 线程1 执行&#x…...
超低延迟直播技术路线,h265的无奈选择
超低延迟,多窗显示,自适应编解码和渲染,高分辨低码率,还有微信小程序的标配,这些在现今的监控和直播中都成刚需了,中国的音视频技术人面临着困境,核心门户浏览器不掌握在自己手上,老…...
openstack 云主机 linux报 login incorrect
还未输入密码就提示login incorrect 不给输密码位置 完全不给输密码的机会 关机进入单用户 检查登录安全记录 vi /var/log/secure 发现 /usr/lib64/security/pam_unix.so 报错 将正常的机器提取/usr/lib64/security/pam_unix.so 比对MD5一致, 另外判断 libtir…...
Selenium:Web自动化框架
Selenium自动化入门 1、Selenium概述2、Selenium环境搭建3、Selenium基本操作4、网页元素定位5、操作Cookie6、标签页管理 1、Selenium概述 Selenium(Web Browser Automation)的初衷是Web应用自动化测试。Selenium广泛应用于爬虫,爬虫需要让浏…...
Android11 添加adb后门
软件平台:Android11 硬件平台:QCS6125 需求:通过设备的物理组合按键,直接打开adb功能,我们这里确定的是Volume-up、Volume-down、camera三个按键在短时间内各按三次即可触发,具体代码改动如下:…...
福昕阅读器打开pdf文档时显示的标题不是文件名
0 Preface/Foreword 1 现象 文件名为:Demo-20231017 打开效果:显示名字为 word template 2 解决方法 2.1 利用打印方式将word生产pdf 在word生成pdf文件时,使用打印方式生成pdf文档。 2.2 删除word文档设置的标题 文件---》信息---》标…...
Python自创项目—《数字帝国》更新日志
Inscode项目地址:https://inscode.csdn.net/2302_76241188/lxzn 或者点这里访问 更新时间:2023-10-04 更新内容:新增加四个地区 附:预计下次更新将会增加几个新的地区,修复一些已知bug...
【STM32】---存储器,电源核时钟体系
一、STM32的存储器映像 1 文中的缩写 2 系统构架(原理图) 3. 存储器映像 (1)STM32是32位CPU,数据总线是32位的 (2)STM232的地址总线是32位的。(其实地址总线是32位不是由数据总线是…...
Flink中的时间和窗口操作
1.窗口概念 在大多数场景下,我们需要统计的数据流都是无界的,因此我们无法等待整个数据流终止后才进行统计。通常情况下,我们只需要对某个时间范围或者数量范围内的数据进行统计分析:如每隔五分钟统计一次过去一小时内所有商品的点击量;或者每发生1000次点击后,都去统计一…...
【算法|前缀和系列No.5】leetcode1314. 矩阵区域和
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【Leetcode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…...
python知识:从PDF 提取文本
一、说明 PDF 到文本提取是自然语言处理和数据分析中的一项基本任务,它允许研究人员和数据分析师从 PDF 文件中包含的非结构化文本数据中获得见解。Python 是一种通用且广泛使用的编程语言,它提供了多个库和工具来促进提取过程。 二、各种PDF操作库 让我…...
基于MATLAB的GPS卫星绕地运行轨迹动态模拟仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 Prn NavData(PRNS_SEL,1);%识别导航数据中的PRNiode NavData(PRNS_SEL,11);%企…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
