• Linux UWB Stack实现——MCPS调度接口(API)


    在上一篇文章中,介绍了MCPS调度接口涉及的相关数据结构实现MCPS调度接口(数据结构),本文继续介绍调度相关的方法的实现。

    1. 域处理

    1.1 域注册与注销

    注册/注销一个mcps802154_region,分别在模块加载(module_init)和模块卸载(module_exit)时调用。

    int mcps802154_region_register(struct mcps802154_region_ops *region_ops);
    void mcps802154_region_unregister(struct mcps802154_region_ops *region_ops);
    
    • 1
    • 2

    1.2 域操作

    域的操作包括:打开和关闭一个域,域的参数设置,域的调用以及发送域的事件。

    // 打开一个域,然后设置参数。需要打开域的名称,底层设备指针
    // 返回指向打开域的指针
    struct mcps802154_region *
    mcps802154_region_open(struct mcps802154_llhw *llhw, const char *name,
    		       const struct nlattr *params_attr,
    		       struct netlink_ext_ack *extack);
    // 关闭一个域		  
    void mcps802154_region_close(struct mcps802154_llhw *llhw,
    			     struct mcps802154_region *region);
    
    // 设置一个打开域的参数
    int mcps802154_region_set_parameters(struct mcps802154_llhw *llhw,
    				     struct mcps802154_region *region,
    				     const struct nlattr *params_attr,
    				     struct netlink_ext_ack *extack);
    				     
    // 调用域中的一个特定的处理程序,通过域特定的程序的标识符call_id来标识调用的程序
    int mcps802154_region_call(struct mcps802154_llhw *llhw,
    			   struct mcps802154_region *region, u32 call_id,
    			   const struct nlattr *params_attr,
    			   const struct genl_info *info);
    
    // 分配缓冲区以发送域的通知,返回已分配且提前填充的buffer
    struct sk_buff *
    mcps802154_region_event_alloc_skb(struct mcps802154_llhw *llhw,
    				  struct mcps802154_region *region, u32 call_id,
    				  u32 portid, int approx_len, gfp_t gfp);
    
    // 发送已分配的且已经填充的buffer,需要传递底层硬件指针
    int mcps802154_region_event(struct mcps802154_llhw *llhw, struct sk_buff *skb);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    2. 调度器

    2.1 调度器注册与注销

    在模块加载时注册一个mcps802154_scheduler调度器;模块卸载时,注销调度器。与mcps802154_region处理类似。

    int mcps802154_scheduler_register(struct mcps802154_scheduler_ops *scheduler_ops);
    void mcps802154_scheduler_unregister(struct mcps802154_scheduler_ops *scheduler_ops);
    
    • 1
    • 2

    2.2 调度器操作

    对于调度器而言,可能更改调度开始的时间、清除或回收当前的调度、向调度中增加新的域、更改调度访问、无效调度等,主要通过以下的外部API调用。

    // 改变当前已经更新调度开始时间戳:需要调度计划上下文,同时设置新的时间戳(DTU)
    int mcps802154_schedule_set_start(
    	const struct mcps802154_schedule_update *schedule_update,
    	u32 start_timestamp_dtu);
    
    // 清除或回收当前的调度计划(schedule)
    // n_keeps:保留上一调度计划的域数
    // last_region_duration_dtu:最后域的持续时间,若为MCPS802154_DURATION_NO_CHANGE则保持不变
    int mcps802154_schedule_recycle(
    	const struct mcps802154_schedule_update *schedule_update,
    	size_t n_keeps, int last_region_duration_dtu);
    
    // 向当前更新的调度计划中增加一个新的域,包括开始时间以及持续时间
    int mcps802154_schedule_add_region(
    	const struct mcps802154_schedule_update *schedule_update,
    	struct mcps802154_region *region, int start_dtu, int duration_dtu);	
    
    // 请求尽可能更改访问
    // 当有新的可用数据时,则使用此函数重新评估当前访问的时间。
    // 如设备在休眠或等待接收帧,有新的数据需要发送,则需要调用请求重新评估,更改访问。
    // 如果设备处于忙碌状态,将忽略请求,这种情况下,当前访问完成后才会检查新的访问。
    void mcps802154_reschedule(struct mcps802154_llhw *llhw);
    
    // 请求无效调度计划(schedule)
    // 有限状态机锁应该入锁。要无效当前的schedule,将导致调度计划更改。
    // 当例如某些参数更改时,应从外部模块调用此API以强制进行调度计划更改。
    void mcps802154_schedule_invalidate(struct mcps802154_llhw *llhw);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    JavaScript处理数组数据-数据匹配-剔除
    链式二叉树高质量OJ—【Leedcode】
    vue之使用箭头函数导致表格无法刷新数据
    Thymeleaf模板
    XML概述
    超级明星们的人物化身 NFT 将来到 The Sandbox 元宇宙
    linux驱动之设备树(1)
    17.适配器模式(Adapter)
    iOS 无宿主App源码时,真机环境一键调试动态库
    【微服务】Docker的基本操作
  • 原文地址:https://blog.csdn.net/luo58614013/article/details/133689247