在上一篇文章中,介绍了MCPS调度接口涉及的相关数据结构实现MCPS调度接口(数据结构),本文继续介绍调度相关的方法的实现。
注册/注销一个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);
域的操作包括:打开和关闭一个域,域的参数设置,域的调用以及发送域的事件。
// 打开一个域,然后设置参数。需要打开域的名称,底层设备指针
// 返回指向打开域的指针
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);
在模块加载时注册一个mcps802154_scheduler
调度器;模块卸载时,注销调度器。与mcps802154_region
处理类似。
int mcps802154_scheduler_register(struct mcps802154_scheduler_ops *scheduler_ops);
void mcps802154_scheduler_unregister(struct mcps802154_scheduler_ops *scheduler_ops);
对于调度器而言,可能更改调度开始的时间、清除或回收当前的调度、向调度中增加新的域、更改调度访问、无效调度等,主要通过以下的外部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);