API设计指南
Zephyr的开发和进化是一个群组的工作,为了简化维护和增强,在开发一个新的能力或接口时应该遵循一些通用的策略。
使用回调
许多api都涉及到将回调作为参数或作为配置结构的成员进行传递。在指定回调数的签名时,应遵循以下策略:
第一个参数应该是一个指向与回调最密切相关的对象的指针。在设备驱动程序的情况下,这将是常结构设备*dev。对于库函数,它可能是指向在提供回调时被引用的另一个对象的指针。
下一个参数(s)应该是特定于回调调用的附加信息,例如通道标识符、新的状态值和/或消息长度后面的消息指针。
最后一个参数应该是一个包含上下文的空*user_数据指针,该上下文允许共享回调函数找到处理回调所需的其他材料。
当回调本身是通过将嵌入到另一个结构中的结构提供时,可能允许提供user_data作为最后一个参数的异常。这种情况的一个例子是gpio_callback,它通常定义在特定于同样定义回调函数的代码的数据结构中。在这些情况下,CONTAINER_OF可以通过回调间接访问进一步的上下文。
示例
当系统计时器报警触发时,调用k_timer_expiry_t的要求:
void handle_timeout(struct k_timer *timer)
{ ... }
与gpio_callback一样,这里的假设是,计时器嵌入到一个从CONTAINER_OF可访问的结
本文档介绍了Zephyr系统中API设计的原则,包括如何使用回调、条件数据和API的处理以及返回代码的设定。在设计API时,回调的第一个参数通常是相关对象的指针,接着是回调所需信息,最后是用户数据指针。对于可选特性,通过Kconfig选项控制,并在未启用时减少内存使用。返回代码区分了不受支持和未实现的API,前者返回-ENOSYS,后者根据硬件支持情况返回相应代码。
订阅专栏 解锁全文
1778

被折叠的 条评论
为什么被折叠?



