重庆网站公司,用jsp做校园网站,上海上市公司100强,南宁做网站培训在上一篇文章中#xff0c;介绍了MCPS调度接口涉及的相关数据结构实现MCPS调度接口#xff08;数据结构#xff09;#xff0c;本文继续介绍调度相关的方法的实现。 1. 域处理
1.1 域注册与注销
注册/注销一个mcps802154_region#xff0c;分别在模块加载#xff08;mo… 在上一篇文章中介绍了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 域操作
域的操作包括打开和关闭一个域域的参数设置域的调用以及发送域的事件。
// 打开一个域然后设置参数。需要打开域的名称底层设备指针
// 返回指向打开域的指针
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);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);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);