BLE 4.2 Controller:高精度调度器与冲突仲裁

由于芯片通常只有一个 Radio(单射频),我们不能同时进行广播、扫描和保持连接。如果我在 37 信道广播时,连接的锚点(Anchor Point)也到了,该怎么办?如果我正在扫描,突然需要回复一个连接请求,怎么保证时间差精确在 150µs?

这就是我们需要一个高精度调度器(High-Precision Scheduler)的原因。通用的 RTOS(如 FreeRTOS)基于 SysTick 的 1ms 调度精度在这里完全不够看,我们需要的是微秒级的控制。

1 设计哲学:时间轴上的俄罗斯方块

BLE Controller 的调度本质上是时分复用(TDM)。我们可以把时间看作一条无限延伸的单行铁轨,而每一个任务(广播一次、连接交互一次)就是一列列火车。

我们的调度器只有两个核心目标:

  1. 不撞车:保证任意两个任务在时间轴上不重叠。
  2. 准点率:任务必须在预定的微秒时刻触发(误差 < 2µs)。

为了实现这一点,我们需要抛弃“线程优先级”的概念,转而使用基于绝对时间的有序链表

2 冲突仲裁

显然,这样插入非常容易出现时间上的重叠。但幸好,蓝牙中并不是所有事件都对时间要求非常严格,为了解决冲突,可以根据事件的优先级一定的策略调整不同事件开始的时间。

下面以 Cordio 源码为例,分析不同情况的处理方法。

2.1.1 新事件优先级更高

如果新事件优先级更高,新事件获胜,则移除旧的事件,插入新的事件,然后通过回调函数abortCback通知旧事件被取消了。回调函数针对不同的事件单独实现。

/* by yours.tools - online tools website : yours.tools/zh/quchong.html */ static bool_t SchResolveConflict(BbOpDesc_t *pItem, BbOpDesc_t *pTgt) { schRemoveForConflict(pTgt); schInsertToEmptyList(pItem); if (pDeleted->abortCback) { pDeleted->abortCback(pDeleted); } return TRUE; }

2.1.2 优先级相同

如果新事件优先级相同,就使用冲突回调函数conflictCback来决定怎么处理。回调函数针对不同的事件单独实现。

/* by yours.tools - online tools website : yours.tools/zh/quchong.html */ static bool_t SchIsBodResolvable( BbOpDesc_t *pItem, // 新BOD BbOpDesc_t *pTgt, // 现有BOD BbConflictAct_t conflictCback ) { // 策略1: 比较重调度策略(优先级) if (pItem->reschPolicy < pTgt->reschPolicy) { return TRUE; // 新BOD优先级更高,可以抢占 } // 策略2: 优先级相同,使用冲突回调 else if ((pItem->reschPolicy == pTgt->reschPolicy) && conflictCback) { if (conflictCback(pItem, pTgt) == pItem) { return TRUE; // 回调选择了新BOD } } // 策略3: 新BOD优先级更低或相同但无回调 else { LL_TRACE_WARN2("!!! Scheduling conflict: existing=%u vs incoming=%u", pTgt->reschPolicy, pItem->reschPolicy); return FALSE; // 保留现有BOD } return FALSE; }

2.1.3 新事件优先级更低

如果新事件优先级更低,则保留旧事件,调整新事件的事件重新尝试插入。
例如一个普通的广播事件在调度时碰到了更高优先级的连接事件,广播事件重新计算下一次的广播事件,然后重新尝试调度。对于广播,错过一次几乎不影响用户体验。

static bool_t SchResolveConflict( BbOpDesc_t *pItem, // 要插入的BOD BbOpDesc_t *pTgt // 冲突的BOD ) { BbOpDesc_t *pCur = pTgt; int numDeletedBod = 0; BbOpDesc_t *pDeleted[SCH_MAX_DELETE_BOD]; // 最多删除8个 // 1. 遍历并移除所有冲突的BOD while (TRUE) { // 防止删除过多 if (numDeletedBod == SCH_MAX_DELETE_BOD) { result = FALSE; break; } pDeleted[numDeletedBod++] = pCur; // 如果只与pCur冲突 if ((pCur->pNext == NULL) || SCH_IS_DONE_BEFORE(pItem, pCur->pNext)) { result = schRemoveForConflict(pCur); break; } // 继续移除下一个冲突的BOD if (!schRemoveForConflict(pCur)) { result = FALSE; break; } pCur = pCur->pNext; } // 2. 如果成功移除,插入新BOD if (result == TRUE) { if (pCur->pNext) { schInsertBefore(pItem, pCur->pNext); } else if (pTgt->pPrev) { schInsertAfter(pItem, pTgt->pPrev); } else { schInsertToEmptyList(pItem); } // 3. 调用所有被移除BOD的中止回调 for (int i = 0; i < numDeletedBod; i++) { if (pDeleted[i]->abortCback) { pDeleted[i]->abortCback(pDeleted[i]); } } } return result; }

本文版权归作者:ixbwer所有,转载请注明原文链接:https://www.cnblogs.com/ixbwer/p/19451924,否则保留追究法律责任的权利。

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

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

相关文章

Cloudera CDH5、CDH6、CDP7现状及替代方案

Cloudera CDH5、CDH6、CDP7现状及替代方案Cloudera 的 CDH5、CDH6 和 CDP7 系列产品已处于生命周期末期或战略转型阶段&#xff0c;其现状与替代路径对仍在使用这些平台的企业具有重大影响。以下从产品现状、停服时间线、风险分析及主流替代方案四个方面进行系统梳理。一、各版…

基于python和flask框架的汽车零件运输管理信息系统设计及实现_3xy1sjvu

目录摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 该系统基于Python和Flask框架开发&#xff0c;旨在优化汽车零件运输管理流程&#xff0c;提升物流效率与数据透明度。…

网络安全攻防演练分为哪几步?

攻防演练是网络安全领域中的重要环节&#xff0c;而且开展一场攻防演练是一项复杂且重要的任务&#xff0c;它旨在检验和提升组织在面对真实网络攻击时的防护、检测、响应和恢复能力&#xff0c;那么网络安全攻防演练有几个步骤?我们一起来探讨一下吧。 攻防演练是一种模拟性质…

综合能源系统优化调度:基于MATLAB与CPLEX+Yalmip的创新实践

MATLAB程序&#xff1a;综合能源系统优化调度&#xff0c;考虑了阶梯型碳机制和氢能&#xff0c;具有一定的创新。 采用CPLEXYalmip求解&#xff0c;基本复现。在能源领域不断探索的道路上&#xff0c;综合能源系统优化调度成为了研究的热点。最近我在研究中实现了一个颇为有趣…

175.vivado 防止信号被优化

(* keep "true" *) wire [31:0] user;(* keep "true" *) (*DONT_TOUCH"YES"*)(*mark_debug"true"*)wire [31:0] s_axis_ireq_tuser ;

Node.js用isMainThread轻松区分主线程与worker

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Node.js中的isMainThread&#xff1a;解锁多线程编程的精准控制 目录 Node.js中的isMainThread&#xff1a;解锁多线程编程的精准…

0基础可以自学Python吗?

Python是公认的入门最友好编程语言&#xff0c;语法简洁易懂、贴近自然语言&#xff0c;无需前置编程基础也能快速上手。相比其他编程语言&#xff0c;Python学习门槛更低、生态丰富且应用场景广泛&#xff0c;是新手入门编程的首选。那么编程零基础可以自学Python吗?具体请看…

企业级应用验证:MGeo在银行网点地址标准化中的成功落地

企业级应用验证&#xff1a;MGeo在银行网点地址标准化中的成功落地 引言&#xff1a;银行地址数据治理的痛点与破局之道 在金融行业&#xff0c;尤其是大型商业银行的日常运营中&#xff0c;网点地址信息的准确性与一致性直接影响到客户管理、风险控制、监管报送和地理服务集成…

若依框架整合Hunyuan-MT-7B实现后台系统多语言自动切换

若依框架整合Hunyuan-MT-7B实现后台系统多语言自动切换 在政务、医疗和跨国企业信息化建设中&#xff0c;一个常见的痛点是&#xff1a;系统用户遍布全国甚至全球&#xff0c;语言习惯差异巨大。某地卫健委的信息平台曾面临这样的尴尬——基层维吾尔族医务人员因看不懂中文界面…

Fibronectin Adhesion-promoting Peptide;WEPPRARI

一、基础性质英文名称&#xff1a;Fibronectin Adhesion-promoting Peptide&#xff1b;FN Adhesion Peptide&#xff1b;WEPPRA RI peptide中文名称&#xff1a;纤维连接蛋白粘附促进肽&#xff1b;FN 来源 8 肽粘附功能域多肽序列&#xff1a;H-Trp-Glu-Pro-Pro-Arg-Ala-Arg-…

数据安全平台:迈向精细化、多模态、全景式治理的理论建构与实践演进

一、概要随着《数据安全法》《网络数据安全管理条例》等法规的深入实施与国家数据治理体系的持续完善&#xff0c;数据安全监测已从单一的合规检查工具&#xff0c;演进为支撑组织数字化转型的核心战略能力。当前&#xff0c;各类组织在构建监测体系时&#xff0c;普遍面临覆盖…

基于单片机的车辆超载报警系统设计及人数检测设计

1、基于单片机的车辆超载报警系统设计及人数检测设计 点击链接下载protues仿真设计资料&#xff1a;https://download.csdn.net/download/m0_51061483/92081431 1.1、项目背景与应用意义 在公共交通、旅游客运、厂区通勤车以及校园摆渡车等场景中&#xff0c;车辆超载是非常…

想从事网络安全,花钱培训有必要吗?

网络安全行业技术门槛高、实战性强&#xff0c;零基础或转行人群常纠结自学还是付费培训。那么想从事网络安全行业&#xff0c;花钱培训有必要吗?以下是具体内容介绍。想要从事网络安全行业&#xff0c;花钱参加培训还是很有必要的&#xff0c;具体理由如下&#xff1a;1、系统…

Linux缓存机制有哪些?

Linux缓存机制是系统提升性能的核心底层技术&#xff0c;它通过智能利用空闲内存&#xff0c;缓存常用文件数据与磁盘I/O 请求&#xff0c;大幅减少物理设备的访问频率&#xff0c;显著缩短程序响应时间。那么Linux缓存机制有哪些?一起来探讨一下。Linux缓存机制主要包括以下几…

海外盲盒小程序开发全解析:技术适配+合规破局+落地指南

2023年全球潮流玩具市场规模突破380亿美元&#xff0c;盲盒品类年增长率超35%&#xff0c;小程序因轻量化、易传播成为海外潮玩出海的核心载体——头部品牌海外小程序上线3个月&#xff0c;欧美、东南亚用户占比超75%&#xff0c;峰值QPS突破3000。但开发者普遍陷入多区域合规冲…

运维系列虚拟化系列OpenStack系列【仅供参考】:远程管理 KVM 虚机 - 每天5分钟玩转 OpenStack(5)CPU 和内存虚拟化原理 - 每天5分钟玩转 OpenStack(6)

远程管理 KVM 虚机 - 每天5分钟玩转 OpenStack(5)&&CPU 和内存虚拟化原理 - 每天5分钟玩转 OpenStack(6) 远程管理 KVM 虚机 - 每天5分钟玩转 OpenStack(5) CPU 和内存虚拟化原理 - 每天5分钟玩转 OpenStack(6) CPU 虚拟化 内存虚拟化 远程管理 KVM 虚机 - 每天…

图片上传后怎么处理?详解文件路径修改技巧

图片上传后怎么处理&#xff1f;详解文件路径修改技巧 业务场景描述&#xff1a;通用图像识别中的文件管理痛点 在实际的AI项目开发中&#xff0c;图像识别任务往往只是整个系统的一环。以阿里开源的“万物识别-中文-通用领域”模型为例&#xff0c;其核心能力是基于PyTorch实现…

spaCy自然语言处理库的设计演进与技术实践

Podcast #18 - spaCy的演进历程 这是一个与某机构联合创始人兼CEO Ines Montani的对话&#xff0c;讨论了他们的旗舰库Spacy的演进过程。讨论了各种Spacy模型、管道、设计概念以及其他某机构的产品。 关于Ines Montani Ines是一位专注于人工智能和自然语言处理技术的软件开发人…

基于python和flask智能水产养殖管理系统_1z11jbg7

目录摘要概述系统架构功能模块技术实现应用价值关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要概述 基于Python和Flask的智能水产养殖管理系统是一种现代化、高效的养殖管理解…

运维系列虚拟化系列OpenStack系列【仅供参考-推荐】: KVM 存储虚拟化 - 每天5分钟玩转 OpenStack(7)LVM 类型 St P- 每天5分钟玩转 OpenStack(8)

KVM 存储虚拟化 - 每天5分钟玩转 OpenStack(7)&&LVM 类型的 Storage Pool - 每天5分钟玩转 OpenStack(8) KVM 存储虚拟化 - 每天5分钟玩转 OpenStack(7) KVM 的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的。 LVM 类型的 Storage Pool - 每天5…