嵌入式开发:优化 RTOS 的7个技巧
实时操作系统 (RTOS) 正在进入越来越多的系统。习惯于裸机开发或使用高度资源受限系统的嵌入式开发人员经常会抱怨系统性能或内存使用情况。以下是开发人员可以遵循的七个技巧,以帮助优化其 RTOS 的性能和代码大小。
1. 最小化应用程序中的任务
将应用程序分解为看似同时运行的单独任务“小程序”的能力非常有益。但是,不熟悉 RTOS 开发的开发人员有时可能会有点过分热心并创建比应用程序所需的任务更多的任务。一些额外的任务有什么害处?在应用程序中创建的每个任务都需要创建任务控制块 (TCB) 来管理任务。TCB 包含至少几十个用于跟踪任务的不同变量。(此处可以看到来自 uCOS/III 的 TCB 示例。)可以想象,TCB 不会使用大量内存,但随着越来越多的任务添加,内存使用会迅速膨胀。出于这个原因,希望尽量减少使用多少代码空间的开发人员应该尽量减少应用程序中的任务数量。
2. 使用内存块池而不是字节池
内存字节池本质上是一个堆。开发人员可以在程序执行期间动态请求内存,就像他们使用 malloc 一样。在许多情况下,使用堆或字节池会导致影响实时系统性能的不确定行为。为了确保系统及时运行,嵌入式开发人员可以使用块池来代替,它以一种确定的方式运行,并且也不存在碎片问题。
3. 不要创建和销毁对象
创建任务、信号量、消息队列和其他 RTOS 对象通常会导致动态分配内存。创建和销毁 RTOS 对象将使用 malloc 和 free,这又是不确定的,可能会导致性能问题。与创建和销毁对象相关的开销,特别是如果经常这样做,可能会成为系统障碍,更不用说它如何增加代码复杂性并使程序难以遵循。在可能的情况下,在应用程序初始化期间分配所有对象,并让它们在应用程序的整个生命周期中持续存在。这样,对象的行为就好像它们是静态分配的,而不是动态分配的。
4.考虑使用事件标志
事件标志可用于同步任务,类似于使用信号量同步任务的方式。从性能角度比较事件标志和信号量时,事件标志通常使用更少的内存并且执行得更快。嵌入式开发人员应考虑比较其 RTOS 的内存占用和执行时间,以确定他们可以从应用程序中挤出几个额外字节或微秒的位置。
5. 最小化 RTOS 对象
大多数 RTOS 对象都需要一个控制块。应用程序中的任务、信号量、消息队列等越多,内存使用量就越大。通过限制在运行时创建的 RTOS 对象的数量,可以最大限度地减少内存使用。
6.优化任务栈
任务堆栈因在应用程序中消耗最多的内存而臭名昭著。许多开发人员只是猜测一个值而不是进行测量。许多 RTOS 会建议任务的默认堆栈大小约为 1 kB。是不是太多了? 太少了? 如果不进行测量,就无法判断,因此开发人员只会猜测。结果是为堆栈空间分配了太多内存并浪费了。开发人员应利用与 RTOS 相关的堆栈监控功能来确定其最小、最大和平均堆栈使用情况。从最大值开始,额外增加 25% 将是确定堆栈大小的安全经验法则。
7.关闭未使用的功能
RTOS 是极其丰富和复杂的软件系统。它们包含许多并非每个应用程序或开发人员都可以使用的功能。熟悉 RTOSes 配置文件对于最小化内存使用和代码大小非常有帮助。配置文件允许开发人员启用和禁用功能。
使用 RTOS 不一定需要增强型微控制器或大量内存。嵌入式开发人员构建和使用他们的 RTOS 的方式可以决定它是在资源受限的环境中运行良好还是被标记为膨胀代码。这七个技巧只是帮助你开始优化 RTOS 的一些技巧。
发表评论 取消回复