• Linux UWB Stack实现——FiRa会话状态机


    在FiRa标准中,很重要的一个概念就是FiRa会话以及会话的管理,本文主要介绍了在Linux UWB Stack实现中,FiRa会话状态机管理的实现。

    在FiRa中,会话分为INIT、DEINIT、ACTIVE、IDLE四种状态,其定义如下。

    enum fira_session_state_id {
    	FIRA_SESSION_STATE_ID_INIT,
    	FIRA_SESSION_STATE_ID_DEINIT,
    	FIRA_SESSION_STATE_ID_ACTIVE,
    	FIRA_SESSION_STATE_ID_IDLE,
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其中:
    ● INIT,初始化状态,会话还未准备好;
    ● DEINIT,会话注销,不存在;
    ● ACTIVE,会话活跃状态;
    ● IDLE,会话已经准备好开始,但并未激活。

    1.相关结构体的定义

    在实现中,通过定义了一个struct fira_session_fsm_state结构体来进行每种状态的管理,该结构体包含一系列回调函数,用于处理从当前状态转换的事件,结构体定义如下:
    在这里插入图片描述
    包含了fira会话状态id,以及一系列的回调函数:

    • enter/leave,跳转和离开此状态时调用;
    • check_parameters,处理参数检查;
    • parameters_updated,处理参数更新事件;
    • controlee_list_updated,对于控制器,处理受控端列表更新事件;
    • start/stop,处理开始与结束;
    • get_demand,根据时间信息,处理获取需求;需求结合,struct fira_localstruct fira_session相关指针信息;
    • get_access,获取mcps802154_access对象指针;
    • access_done,访问结束后处理;
    • check_missed_ranging,处理丢失的测距的检查。

    基于该状态结构体,以及fira会话中的四种状态,根据实际应用中的需求,定义了以下三个实例:

    • fira_session_fsm_init,INIT状态处理实例;
    • fira_session_fsm_idle,IDLE状态处理实例;
    • fira_session_fsm_active,ACTIVE状态处理实例。

    DEINIT状态,会话已经不存在,所以在具体状态的实现中,直接没有进行定义。

    1.1 fira_session_fsm_init

    请添加图片描述从实现来看,INIT状态,主要处理进入、参数更新、受控端列表更新以及参数检查四种回调函数。

    • enter,当会话准备好,将fira_session的状态切换为IDLE状态;
    	if (fira_session_is_ready(local, session)) {
    		fira_session_fsm_change_state(local, session,
    					      &fira_session_fsm_idle);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 其他回调也主要是将状态更改到IDLE。

    1.2 fira_session_fsm_idle

    请添加图片描述对于IDLE状态而言,实现了参数更新处理、受控端列表更新、开始以及参数检查处理。

    • 参数更新、受控端列表更新事件,都将状态切换到INIT状态。
    • 参数检查回调,用于检查FIRA会话的参数。
    • start回调中,将更新会话、设置无线设备参数等操作,状态切换为ACTIVE,触发调度器重新调度 mcps802154_reschedule(local->llhw);

    1.3 fira_session_fsm_active

    请添加图片描述相对其他状态而言,ACTIVE状态为FiRa会话管理的核心,相应实现的对应状态下的回调函数而言相对较为全面,从enter/leave,参数更新与检查,启动/停止,获取访问等等都进行了完整的实现。

    1.4 状态转移图

    FiRa Session状态转移图
    其中,关于FiRa会话的状态与FiRa会话的管理高度相关,创建一个新的FiRa会话时,会话默认状态为INIT,待FiRa会话准备好之后,可以切换到IDLE状态。
    同样,当FiRa会话释放时,会话状态切换到DEINIT,所以在会话的管理上,未单独定义DEINIT的状态转移。

    2. 会话管理相关函数接口

    相关接口在fira_session_fsm.c/h中定义与实现,相关接口如下:
    在这里插入图片描述其中,

    • fira_session_fsm_change_state,用于改变FiRa会话有限状态机的状态,实现状态跳转。
    • fira_session_is_active,用于判断对应会话是否为ACTIVE状态;
    • fsm_initialise,初始化状态机;
    • fsm_uninit,注销FSM;
    • fsm_check_parameters,检查上层请求的参数是否有变化;
    • fsm_parameters_updated,上层参数更新;
    • fsm_controlee_list_updated,上层更新受控端列表;
    • fsm_start/stop,上层开始/停止请求。
  • 相关阅读:
    Django DRF JWT 认证
    【echarts】19、echarts+vue2 - 折线图柱状图
    2023计算机毕设选题 python毕业设计如何选题
    我用Python采集了班花的空间数据集,除了美照竟然再一次发现了她另外的秘密!
    英语词汇篇 - 常见词根词缀
    2023CVPR:图像恢复的又一力作
    leetcode 70.爬楼梯、322.零钱兑换、279.完全平方数
    【IEEE】IEEE论文从投稿到发表全流程案例说明
    【面试题】js实现将excel表格copy到页面
    Docker背后的标准化容器执行引擎——runC
  • 原文地址:https://blog.csdn.net/luo58614013/article/details/134095210