Linux UWB Stack实现——MCPS调度接口(数据结构)
MCPS(MAC Common Part Sublayer,媒介访问控制(Medium Access Control)公共部分子层)调度接口,文件:include\net\mcps802154_schedule.h。
MCPS访问方法
// MCPS 802154 访问方法
enum mcps802154_access_method {MCPS802154_ACCESS_METHOD_NOTHING,MCPS802154_ACCESS_METHOD_IMMEDIATE_RX, //立即接收访问方法MCPS802154_ACCESS_METHOD_IMMEDIATE_TX, //立即发送访问方法MCPS802154_ACCESS_METHOD_MULTI, //多帧访问方法MCPS802154_ACCESS_METHOD_VENDOR, //供应商操作方法
};
mcps802154_access_vendor_ops
该结构体定义了一些函数指针,用于实现供应商特定的访问协议的回调函数,在访问方法为MCPS802154_ACCESS_METHOD_VENDOR时使用。
每个回调函数都可以返回0以继续访问,返回1以停止访问,或者返回错误。
- 如果访问被停止,则使用
mcps802154_access.timestamp_dtu和mcps802154_access.duration_dtu来计算下一次访问,除非duration为0,当在该情况下,将从驱动程序请求当前日期。 - 在发生错误的情况下,设备将转换到broken状态。
- 如果回调函数缺失,将视为错误,但
&mcps802154_access_vendor_ops.handle与.schedule_change缺失除外,被忽略。
struct mcps802154_access_vendor_ops {/** 匿名结构体,需要在所有访问操作之前声明,与mcps802154_access_ops之中情况相似,均为access_done函数指针*/struct {void (*access_done)(struct mcps802154_access *access);};int (*handle)(struct mcps802154_access *access);int (*rx_frame)(struct mcps802154_access *access);int (*rx_timeout)(struct mcps802154_access *access);int (*rx_error)(struct mcps802154_access *access,enum mcps802154_rx_error_type error);int (*tx_done)(struct mcps802154_access *access);int (*broken)(struct mcps802154_access *access);int (*schedule_change)(struct mcps802154_access *access);
};
- 匿名结构成员->access_done,该结构有一个匿名结构成员,在所有操作访问之前都需要声明。该成员定义了一个名为access_done的函数指针。无论访问操作是否成功,都会在访问操作完成后调用此函数。即,对于所有MCPS访问,都需要为访问操作设定一个访问完成回调函数。
其他函数指针: - handle,一旦访问开始即调用,为NULL时,忽略;
- rx_frame,当接收到帧时进行回调。为NULL时,报错。
- rx_timeout,当接收超时时回调,为NULL时,报错。
- rx_error,当接收错误时回调,为NULL时,报错。
- tx_done,当发送完成之后调用。
- broken,当发生不可修复的错误时调用,若为NULL,报错。
- schedule_change,当调度改变时调用,为NULL时,忽略。
mcps802154域
struct mcps802154_region {/*** @ops: 域回调函数*/const struct mcps802154_region_ops *ops;
};
struct mcps802154_region,用于表示一个开放域实例。域处理程序(region handlers)可以在它的后面添加私有数据(private data)。
当前的mcps802154域仅定义了一个指向域回调函数操作的指针。
通过域的定义,不同的域处理程序可以实现在同一统一接口下,实现不同区域处理程序,并且各自管理自己的数据。
struct mcps802154_region_ops {/*** @owner: 指向拥有此域的模块的指针,大多数情况下为THIS_MODULE。*/struct module *owner;/*** @name: 域名称*/const char *name;/*** @registered_entry: Entry in list of registered regions.*/struct list_head registered_entry;/*** @open: 打开域的一个实例,返回一个新的域实例。若发生错误返回NULL。*/struct mcps802154_region *(*open)(struct mcps802154_llhw *llhw);/*** @close: Close a region instance.*/void (*close)(struct mcps802154_region *region);/*** @set_parameters: Set region parameters, may be NULL.*/int (*set_parameters)(struct mcps802154_region *region,const struct nlattr *attrs,struct netlink_ext_ack *extack);/*** @call: Call region procedure, may be NULL.*/int (*call)(struct mcps802154_region *region, u32 call_id,const struct nlattr *attrs, const struct genl_info *info);/*** @get_access: Get access for a given region at the given timestamp.* Access is valid until &mcps802154_access_ops.access_done() callback* is called. Return NULL if access is not possible.*/struct mcps802154_access *(*get_access)(struct mcps802154_region *region, u32 next_timestamp_dtu,int next_in_region_dtu, int region_duration_dtu);
};
通过定义struct mcps802154_region_ops结构体类型,定义域对应的回调函数,该结构体类型包含以下成员:
- owner:指向拥有此域的模块的指针,通常为THIS_MODULE。
- name:域的名称,为const char类型指针。
- registered_entry:已注册域列表入口。
- open:打开该域的一个实例,返回一个新的域实例,如果出现错误,则返回NULL。
- close:关闭域实例。
- set_parameters:设置域参数,可能为NULL。
- call:调用域过程,可能为NULL。
- get_access:获取给定时间戳下给定域的访问权限。访问直到
mcps802154_access_ops.access_done()调用之前都是有效的。如果访问不可行,返回NULL。
调度相关定义
调度更新
当调度更新时,上下文环境有效。
struct mcps802154_schedule_update {/*** @expected_start_timestamp_dtu: 基于当前访问日期,以及新调度安排在已有调度计划之后,得到的期望开始时间戳。*/u32 expected_start_timestamp_dtu;/*** @start_timestamp_dtu: 调度开始日期,对于无限调度可能会太远*/u32 start_timestamp_dtu;/*** @duration_dtu: 调度持续时间,无限调度时为0。当调度为空时,也为0。*/int duration_dtu;/*** @n_regions: 调度中域的数量*/size_t n_regions;
};
调度器
一个开放的调度器实例。调度器可以在此结构之后附加私有数据。
struct mcps802154_scheduler {/*** @ops: 调度器回调函数指针*/const struct mcps802154_scheduler_ops *ops;
};
调度器操作(回调)
调度器回调函数。调度器向MCPS提供一个调度计划(schedule),并在特定帧接收或调度不再有效时更新该调度。
struct mcps802154_scheduler_ops {struct module *owner;const char *name;struct list_head registered_entry;/*** @open: 为设备附加一个调度器*/struct mcps802154_scheduler *(*open)(struct mcps802154_llhw *llhw);/*** @close: 实现与调度器分离并关闭调度器*/void (*close)(struct mcps802154_scheduler *scheduler);/*** @set_parameters: Configure the scheduler.*/int (*set_parameters)(struct mcps802154_scheduler *scheduler,const struct nlattr *attrs,struct netlink_ext_ack *extack);/*** @set_region_parameters: Configure the region inside the scheduler.*/int (*set_region_parameters)(struct mcps802154_scheduler *scheduler,u32 region_id, const char *region_name,const struct nlattr *attrs,struct netlink_ext_ack *extack);/*** @call: 调用调度器的特定处理流程的函数指针。*/int (*call)(struct mcps802154_scheduler *scheduler, u32 call_id,const struct nlattr *attrs, const struct genl_info *info);/*** @call_region: Call region specific procedure.*/int (*call_region)(struct mcps802154_scheduler *scheduler,u32 region_id, const char *region_name, u32 call_id,const struct nlattr *attrs,const struct genl_info *info);/*** @update_schedule: 该函数指针完成schedule初始化以及更新.*/int (*update_schedule)(struct mcps802154_scheduler *scheduler,const struct mcps802154_schedule_update *schedule_update,u32 next_timestamp_dtu);/*** @ranging_setup: 调用配置测距,为临时接口。*/int (*ranging_setup)(struct mcps802154_scheduler *scheduler,const struct mcps802154_nl_ranging_request *requests,unsigned int n_requests);
};
调度器回调函数结构体struct mcps802154_scheduler_ops,包括以下成员:
owner:指向拥有这个调度器的模块的指针。name:调度器的名称。registered_entry:注册的调度器列表入口。open:为设备附加一个调度器,通过open函数指针,底层设备返回指向调度器的指针。close:将调度器分离并关闭调度器。set_parameters:配置调度器的函数指针。set_region_parameters:配置调度器内部区域的函数指针。call:调用调度器的特定处理流程的函数指针。call_region:调用特定域的过程的函数指针。update_schedule: 该函数指针完成schedule初始化以及更新。ranging_setup: 调用配置测距,为临时接口。
此外,结构体成员中还包括一些参数,例如attrs和extack用于确定调度器的参数设置等。
补充知识
Linux内核模块——THIS_MODULE
THIS_MODULE 是一个宏,它用于在 Linux 内核模块中获取对当前模块的引用。定义在linux/module.h头文件中,用于获取当前正在执行的模块的指针。
#define THIS_MODULE (&__this_module)
__this_module是一个全局变量,其类型是struct module,表示当前模块的信息。
THIS_MODULE 可以用于获取模块的一些重要信息,例如模块的名称、模块的版本、模块的作者和许可证等。通过THIS_MODULE宏,可以获取执行代码的模块指针,进而可以获取或修改模块的各种功能属性。
在 Linux 内核模块编程中,THIS_MODULE 经常与其他内核函数和宏一起使用,例如 module_init() 和 module_exit() 函数。
相关文章:
Linux UWB Stack实现——MCPS调度接口(数据结构)
MCPS(MAC Common Part Sublayer,媒介访问控制(Medium Access Control)公共部分子层)调度接口,文件:include\net\mcps802154_schedule.h。 MCPS访问方法 // MCPS 802154 访问方法 enum mcps8021…...
2023Q3数据安全政策、法规、标准及报告汇总(附下载)
数据安全处罚事件逐年升高,2023年呈爆发式增长。 截至2023年8月31日,南都大数据研究院通过各地行政执法公示平台、媒体报道等公开渠道收集到146起依据《数据安全法》作出行政处罚决定的案例。2021年公示5起,2022年公示11起,2023年…...
Ceph入门到精通-iptables 限制多个ip 的多个端口段访问
要使用iptables限制多个IP的多个端口范围的访问,可以使用以下命令: iptables -A INPUT -p tcp -m multiport --dports 端口段 -m iprange --src-range 起始IP-结束IP -j DROP上面的命令将添加一条规则到INPUT链中,该规则将禁止指定IP范围访问…...
【C/C++】STL——深度剖析vector容器
👻内容专栏: C/C编程 🐨本文概括:vector的介绍与使用、深度剖析及模拟实现。 🐼本文作者: 阿四啊 🐸发布时间:2023.10.8 一、vector的介绍与使用 1. vector的介绍 像string的学习…...
如何在idea中隐藏文件或文件夹
例如我想要隐藏如下文件 只需要点击file->settings editor->file types->ignores Files and Folders-> 然后按照图片点击顺序操作即可 添加完毕点击apply->ok 隐藏成功后效果如下:...
Scala第二十章节
Scala第二十章节 scala总目录 文档资料下载 章节目标 理解Akka并发编程框架简介掌握Akka入门案例掌握Akka定时任务代码实现掌握两个进程间通信的案例掌握简易版spark通信框架案例 1. Akka并发编程框架简介 1.1 Akka概述 Akka是一个用于构建高并发、分布式和可扩展的基于事…...
redis的持久化消息队列
Redis Stream Redis Stream 是 Redis 5.0 版本新增加的数据结构。 Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法…...
分类预测 | MATLAB实现KOA-CNN开普勒算法优化卷积神经网络数据分类预测
分类预测 | MATLAB实现KOA-CNN开普勒算法优化卷积神经网络数据分类预测 目录 分类预测 | MATLAB实现KOA-CNN开普勒算法优化卷积神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现KOA-CNN开普勒算法优化卷积神经网络数据分类预测࿰…...
用 Pytorch 自己构建一个Transformer
一、说明 用pytorch自己构建一个transformer并不是难事,本篇使用pytorch随机生成五千个32位数的词向量做为源语言词表,再生成五千个32位数的词向量做为目标语言词表,让它们模拟翻译过程,transformer全部用pytorch实现,具备一定实战意义。 二、论文和概要 …...
Docker安装ActiveMQ
ActiveMQ简介 官网地址:https://activemq.apache.org/ 简介: ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,…...
【二】spring boot-设计思想
spring boot-设计思想 简介:现在越来越多的人开始分析spring boot源码,拿到项目之后就有点无从下手了,这里介绍一下springboot源码的项目结构 一、项目结构 从上图可以看到,源码分为两个模块: spring-boot-project&a…...
系统架构设计:7 论企业集成架构设计及应用
目录 一 企业集成 1 企业集成分类:按照集成点分 (1)界面集成(表示集成)...
【pytorch】多GPU同时训练模型
文章目录 1. 基本原理单机多卡训练教程——DP模式 2. Pytorch进行单机多卡训练步骤1. 指定GPU2. 更改模型训练方式3. 更改权重保存方式 摘要:多GPU同时训练,能够解决单张GPU显存不足问题,同时加快模型训练。 1. 基本原理 单机多卡训练教程—…...
Git 学习笔记 | Git 基本理论
Git 学习笔记 | Git 基本理论 Git 学习笔记 | Git 基本理论Git 工作区域Git 工作流程 Git 学习笔记 | Git 基本理论 在开始使用 Git 创建项目前,我们先学习一下 Git 的基础理论。 Git 工作区域 Git本地有三个工作区域:工作目录(Working Di…...
滚动表格封装
滚动表格封装 我们先设定接收的参数 需要表头内容columns,表格数据data,需要currentSlides来控制当前页展示几行 const props defineProps({// 表头内容columns: {type: Array,default: () > [],required: true,},// 表格数据data: {type: Array,d…...
【LeetCode高频SQL50题-基础版】打卡第3天:第16~20题
文章目录 【LeetCode高频SQL50题-基础版】打卡第3天:第16~20题⛅前言 平均售价🔒题目🔑题解 项目员工I🔒题目🔑题解 各赛事的用户注册率🔒题目🔑题解 查询结果的质量和占比🔒题目&am…...
系统压力测试:保障系统性能与稳定的重要措施
压力测试简介 在当今数字化时代,各种系统和应用程序扮演着重要角色,从企业的核心业务系统到在线服务平台,都需要具备高性能和稳定性,以满足用户的需求。然而,随着用户数量和业务负载的增加,系统可能会面临…...
常用数据结构和算法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、时间复杂度二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 这里面有10个数据结构࿱…...
C++中使用引用避免内存复制
C中使用引用避免内存复制 引用让您能够访问相应变量所在的内存单元,这使得编写函数时引用很有用。典型的函数声明类似于下面这样: ReturnType DoSomething(Type parameter);调用函数 DoSomething() 的代码类似于下面这样: ReturnType Resu…...
计算机网络(第8版)-第4章 网络层
4.1 网络层的几个重要概念 4.1.1 网络层提供的两种服务 如果主机(即端系统)进程之间需要进行可靠的通信,那么就由主机中的运输层负责(包括差错处理、流量控制等)。 4.1.2 网络层的两个层面 4.2 网际协议 IP 图4-4 网…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
