Arm Mbed 软件原理:
请参阅 Mbed 风格指南。
Arm Mbed OS 代码库被组织成概念子模块,以限制个人贡献的范围和复杂性。这些模块作为单个 Git 仓库包含在 Mbed OS 代码库中。我们建议外部库使用此模型。
模块应在 OS 树中进行逻辑分组。避免使用通用词;有意命名。
使用模块名称后跟下划线来为每个源文件添加前缀。这可以防止与不同模块中的其他类似命名文件冲突,例如 nanostack/thread.c 和 drivers/Thread.cpp;并非所有工具链都能够支持具有相同名称的目标文件。
mbed-os/rtos/rtos_thread.cpp
mbed-os/rtos/rtos_semaphore.cpp
mbed-os/drivers/drivers_analog_in.cpp
始终使用路径中的模块目录包含头文件。例如:#include “lwip/lwip-interface.h”,include “drivers/Ticker.h”。将 include 路径限制为模块目录。这允许将来移动模块。
作为模块的入口点(来自用户空间),我们建议使用单个头文件。例如:mbed.h,rtos.h。
头文件应限制外部包含,以避免间接暴露不相关的 API。头文件不应扩展名称空间。
在 C++ 模块中,API 应包含在与模块名称匹配的命名空间中。例如:mbed :: Ticker,rtos :: Thread,netsocket :: Socket。
在C模块中,每个非静态函数和类型都应该以模块的名称作为前缀,后跟下划线。例如:mbed_critical_section_enter(),lwip_gethostbyname(host)。
Mbed OS 代码库中包含的模块可以在单独的仓库中进行镜像。源回购应该清楚地标识并链接到模块的自述文件。
特殊目录应遵循一致的命名约定。
请参阅 Mbed 贡献指南。
每个拉取请求应该用于单一目的。
代码必须编译每次提交。
提交消息应该以子模块名称和冒号为前缀:
lwip: Fixed buffer overrun in rx loop
The rx loop did not properly wait for rx semaphore to release
causing the buffer to overrun
修补程序必须在返回到一个或多个发布分支之前登陆主服务器。
功能开发可以在单独的分支中进行,并在完成时将其带到 master。
绝不能重写主分支和发布分支。
所有贡献者必须签署 CLA。
对于传入来源,唯一可接受的许可证是:
通用模块可以分为两个 API,即前端(或用户 API)和后端(或移植层)。用户 API 描述了库实现的程序员接口。对于 Mbed OS,面向用户的 API 应采用基于 C++ 类的接口,而移植层应采用 C 兼容接口。
API 设计 - 用户 API
uint8_t read_8(void)
, uint16_t read_16(void)
, uint32_t read_32(void)
。void write_8(uint8_t)
, void write_16(uint16_t)
, void write_32(uint32_t)
。API 设计 - 移植层
线程和 IRQ 安全
模块中的每个函数和类都应提供 doxygen 注释,记录函数以及每个参数和返回值:
/** Wait until a Mutex becomes available.
*
* @param millisec timeout value or 0 in case of no time-out. (default: osWaitForever)
* @return status code that indicates the execution status of the function.
*/
osStatus lock(uint32_t millisec=osWaitForever);
每个类的头文件的 doxygen 必须包含使用 @code 和 @endcode 的使用示例。
每个 API 还应该在类头示例的基础上提供 @code 和 @endcode 部分。
如果需要有关方法的更具体信息,则应使用 @note 完成此操作。
如果不推荐使用某个方法,则必须使用 @deprecated 标记并包含要替换它的方法的说明。
每个模块都应提供一个记录模块的自述文件:
扩展文档应位于模块的 docs 目录中,并带有模块自述文件中的相应链接。
Mbed OS 为应用程序开发提供了强大的配置系统。但是,模块还应该关注在 Mbed 构建系统之外保持可配置性。模块应在简单的头文件中提供记录良好的配置选项。