开发生产就绪应用程序的建议
在为 Azure Sphere 设备开发应用程序时,需要考虑几个事项来确保应用程序已准备好生产。 本主题包括验证应用程序是否已准备好进行试点或生产部署的最佳做法清单。 确认这些项目已完成可以减少在生产中遇到的问题数,并更轻松地诊断出现的任何问题。
开发 Azure Sphere 应用程序时,请确定它是在 高级 (HL) 、 实时 (RT) 核心上运行,还是同时运行这两者。 高级应用程序在 Azure Sphere OS 上运行容器化,支持实时的应用程序 (RTApps) 在裸机上运行,或者在实时核心上运行实时操作系统 (RTOS) 。
此处提供的建议旨在帮助提高生产就绪应用程序的质量和工作效率。 下面的清单提供了针对这两种应用程序类型的设计建议的简明列表,以及建议的编码基础知识和解决方案设计注意事项,包括指向更详细地讨论每个要点的主题的链接。 这些建议源自我们与客户的合作关系,包括现场分析、代码评审以及实际解决方案和设备设计中生产部署的应用程序的支持交互。
常见问题
- 确保生产就绪应用程序不使用 beta 工具集。
- 面向 API 集时,请使用最新的 CMake 和 Azure Sphere 工具。
- 为了确保完整的代码优化和大小,请考虑在将应用程序部署到生产环境之前,在发布模式下编译最终的映像包。 在部署发布包之前,请确保生成并测试发布包。
- 执行完整生成时使用零警告策略,以确保有意解决编译器警告。
- 设置一致的 CI/CD 管道并使用适当的分支策略。
内存相关问题
- 如果可能,请将所有常见的固定字符串定义为
global const char*
而不是硬编码,以便它们可以用作数据指针。 - 如果全局数据结构相当小,请考虑为数组成员提供固定长度,而不是使用指向动态分配的内存的指针。
- 尽可能避免动态内存分配。
- 对于返回指向内存缓冲区的指针的函数,请考虑转换为向调用方返回引用的缓冲区指针及其相关大小的函数。
- 如果可能,请将所有常见的固定字符串定义为
动态容器和缓冲区
- 请考虑对容器(如列表和向量)使用增量分配方法。
常规基础知识
- 在退出或错误时正确初始化和销毁所有处理程序。
- 始终使用退出代码。
- 如果应用程序检测到它处于不可恢复状态并需要重启,请确保它始终作为“干净”应用程序退出进行处理,而不是冒死锁状态的风险。
- 实现错误处理和日志记录。 有关详细信息,请参阅 错误处理和日志记录。
- 使用系统计时器作为看门程序来检测应用程序是否处于不可恢复状态或停止 ((例如死锁、内存耗尽或连接未恢复),但实现的逻辑) ,并影响正确的恢复。 有关详细信息,请参阅 使用系统计时器作为监视器。
处理并发
- 尽可能使用 EventLoop。
- 了解并发任务的效率。
- 评估何时使用线程,并且范围仅限于特定任务。 有关何时使用线程的详细信息,请参阅 处理并发。
连接监视
- 基于定期检查 Internet 连接状态的可靠状态机实现适当的连接运行状况检查任务。
- 对于需要电源管理的解决方案,请在发送数据后关闭 Azure Sphere 芯片,跟踪总启动时间,并设置关机计时器。
- cURL最近更新了回调行为和最佳做法。 虽然 Azure Sphere 已努力确保旧版cURL行为继续按预期工作,但建议在使用curl_multi时遵循安全性和可靠性的最新指南,因为使用递归回调可能会导致意外崩溃、连接中断和潜在的安全漏洞。 如果 TimerCallback 以 0 毫秒的超时值触发,则将其视为 1 毫秒的超时,以避免递归回调。 在调用curl_multi_add_handle后,请确保至少显式调用curl_multi_socket_action一次。
内存管理和使用情况
- 使用 Azure Sphere OS API 跟踪应用程序内存使用情况,并确保应用程序对意外的内存使用做出适当的反应。
- 启用 MT3620 监视器计时器以检测死锁并实现正确的恢复逻辑。
- 为混合 HL-core 和 RT-core 应用程序实现核心间通信。
连接要求和故障排除
- 确保满足所有网络先决条件。 有关详细信息,请参阅 连接要求和故障排除。
- 使用
OSNetworkRequirementCheck-HLApp
和OSNetworkRequirementChecker-PC
排查连接问题。
建议的内容
有关将 IoT 解决方案移动到生产环境时要考虑的其他事项,请参阅 将 IoT 解决方案从测试迁移到生产环境。