资源管理
在很多场景下,需要在运行时协调多个客户端对资源的使用,例如电源轨、时钟、其他外设以及二值设备电源管理。在多线程系统中正确管理设备的多个使用者(尤其是在转换可能是异步的情况下)非常复杂,因此有必要采用共享实现。
Zephyr 为多种协调策略提供了管理器。这些管理器嵌入到使用它们的服务中,以实现特定功能。
通断管理器
通断管理器支持任意数量的客户端使用具有二值状态的服务。示例应用包括电源轨、时钟和二值设备电源管理。
该管理器具有以下属性:
稳定状态包括关闭、开启和错误。服务始终从关闭状态开始。服务也可能处于向给定状态转换的过程中。
核心操作是 request(添加依赖)和 release(移除依赖)。辅助操作是 reset(清除错误状态)和 cancel(从进行中的转换中回收客户端数据)。服务根据对启动这些操作的函数的调用情况来管理状态。
收到第一个客户端请求时,服务从关闭状态转换为开启状态。
收到最后一个客户端释放请求时,服务从开启状态转换为关闭状态。
每个服务配置都提供实现从关闭到开启、从开启到关闭,以及可选地从错误状态到关闭的转换函数。转换必须能够从线程和中断上下文调用。
request 和 reset 操作使用 异步通知 异步执行。这两种操作都可以取消,但取消不会影响正在进行的转换。
在向关闭状态的转换进行期间,开启请求可能会排队:当服务成功关闭后,会立即再次开启(在上下文允许的情况下),并在启动完成后通知等待的客户端。
请求采用引用计数,但不会被跟踪。这意味着客户端负责记录其请求是否被接受,并且只有在先前成功完成请求后才能发起释放。API 使用不当可能导致活动客户端被排除在外,而且管理器不会保留已获批请求的特定客户端记录。
执行转换时的失败会被记录,并阻止进一步的请求或释放,直到管理器被重置。发现错误时,会通知(并取消)挂起的请求。
转换操作完成通知通过 异步通知 提供。
如果客户端和其他组件希望跟踪所有服务状态变化,包括服务开始关闭或进入错误状态,可以通过 onoff_monitor_register() 注册监视器来获知状态转换。状态变化的通知会在发出与新状态关联的完成通知之前提供。
备注
通用 API 可能由多个驱动程序实现,而常见情况是异步的。通断客户端结构可能是通用 API 的合适解决方案。如果驱动程序能够保证与上下文无关的同步转换,则可以使用 onoff_sync_service 及其配套 API,而不是 onoff_manager,功能只会略微减少(主要是不再支持监视器 API)。