越来越多的嵌入式系统依赖使用实时操作系统 (RTOS) 来:满足实时要求、缩短上市时间、简化开发、增加代码可移植性和简化开发。尽管有很多好处,但 RTOS 也有其缺点,其中之一是可能引入不正确分配的任务优先级、堆栈溢出、饥饿、死锁、优先级反转和其他难以发现的错误。
在本文中,我们将研究专门设计用于帮助基于 RTOS 的应用程序开发人员发现其中一些难以捉摸的错误、识别问题并提供纠正措施的工具。这些工具很容易获得,但嵌入式开发人员通常不知道。
什么是实时操作系统?
实时操作系统(也称为 RTOS 或实时内核)是尽可能高效地管理 CPU(中央处理单元)时间的软件。大多数内核都是用 C 语言编写的,并且需要一小部分用汇编语言编写的代码才能使内核适应不同的 CPU 架构。当您使用 RTOS 内核设计应用程序(您的代码)时,您只需将工作拆分为任务,每个任务负责一部分工作。任务(也称为线程)是一个简单的程序,它认为自己完全拥有 CPU。在单个 CPU 上,在任何给定时间只能执行一个任务。您的应用程序代码还需要根据任务重要性以及每个任务的堆栈 (RAM) 为每个任务分配优先级。一般来说,添加低优先级任务不会影响系统对高优先级任务的响应。任务通常也实现为无限循环。内核负责任务的管理。这称为多任务处理。多任务处理是在多个顺序任务之间调度和切换 CPU 的过程。多任务处理提供了拥有多个 CPU 的错觉,并最大限度地利用了 CPU,如下所示。多任务处理还有助于创建模块化应用程序。使用实时内核,应用程序更易于设计和维护。多任务处理提供了拥有多个 CPU 的错觉,并最大限度地利用了 CPU,如下所示。多任务处理还有助于创建模块化应用程序。使用实时内核,应用程序更易于设计和维护。多任务处理提供了拥有多个 CPU 的错觉,并最大限度地利用了 CPU,如下所示。多任务处理还有助于创建模块化应用程序。使用实时内核,应用程序更易于设计和维护。
大多数商业 RTOS 都是抢占式的,这意味着内核始终运行最重要的可立即运行的任务。抢占式内核也是事件驱动的,这意味着任务被设计为等待事件发生才能执行。如果任务等待的事件没有发生,内核运行其他任务。等待任务消耗零 CPU 时间。发送信号和等待事件是通过内核应用程序编程接口 (API) 调用完成的。内核允许您避免轮询循环,这会浪费 CPU 的时间。以下是如何实现典型任务的示例:
内核为程序员提供了许多有用的服务,例如多任务处理、中断管理、任务间通信和信令、资源管理、时间管理、内存分区管理等等。RTOS 可用于只有少量任务的简单应用程序,但它是需要复杂且耗时的通信堆栈的应用程序的必备工具,例如 TCP/IP、USB(主机和/或设备) )、CAN、蓝牙、Zigbee 等。当应用程序需要文件系统来存储和检索数据以及产品配备某种图形显示(黑白、灰度或彩色)时,强烈建议使用 RTOS。
内置调试端口
ARM Cortex.-M 处理器配备了内置于每个芯片上的特殊且非常强大的调试硬件。CoreSight 提供非侵入式功能,允许工具在不停止 CPU 的情况下监视和控制实时系统,例如:
动态内存/外设访问(读取和写入)
指令跟踪(要求芯片还包括一个执行跟踪宏单元,ETM)
数据追踪
使用分析计数器进行分析
下图显示了 CoreSight 调试端口、CPU 和内存/外设之间关系的简化框图。
用于测试/调试实时系统的工具
下图显示了 CoreSight 如何连接到您的开发环境:
1 - 嵌入式开发人员经常使用集成开发环境 (IDE),其中包括代码编辑器、编译器、汇编器、链接器、调试器和可能的其他工具。
IDE 中内置的调试器只提供最基本的必需品:下载代码、启动/停止、设置断点和其他一些简单功能。一些调试器更进一步,允许您在目标运行时显示和更改变量(也称为 Live Watch),但功能仅限于数值。包含内置 RTOS 感知功能的调试器也很常见,但通常需要您暂停应用程序以检查 RTOS 的状态(对于调试实时系统不太实用)。
2 - 当您准备好调试应用程序时,通过 Debugger Probe(例如 Segger J-Link )将代码下载到目标。
3 - J-Link 连接到 CoreSight 调试端口,能够启动/停止 CPU、下载代码、对板载 Flash 进行编程等。即使目标正在执行代码,J-Link 也可以根据需要直接读取和写入内存。
4 - Micrium 的 μC/Probe是一个独立的、与 CPU 供应商无关的、基于 Windows 的应用程序,可读取工具链生成的 ELF 文件。ELF 文件包含下载到目标的代码以及所有全局可访问变量的名称、它们的数据类型以及它们在目标内存中的物理内存位置。
5 - μC/Probe 允许用户在运行时(即实时)显示或更改连接的嵌入式目标上几乎任何变量或内存位置(包括 I/O 端口)的值。用户只需从仪表、数字指示器、表格、图形、虚拟 LED、条形图、滑块、开关、按钮和其他组件的库中填充 μC/Probe 的图形环境,并将其中的每一个与变量或内存位置相关联嵌入式设备。μC/Probe 不需要您检测目标代码以在运行时显示或更改变量。通过在 μC/Probe 的屏幕上添加虚拟滑块或开关,您可以轻松更改运行系统的参数(例如滤波器系数和 PID 回路增益)或驱动设备和测试 I/O 端口。
6 - μC/Probe 向 J-Link 发送请求以读取或写入内存。
7 - J-Link 请求被转换为 CoreSight 命令以获取变量值并将其以图形方式显示在 μC/Probe 的屏幕上。
8 -另一个用于测试/调试实时嵌入式系统的非常有用的工具是 SEGGER 的 SystemView 。此工具通常与 RTOS 结合使用,并在时间线上显示任务和 ISR 的执行配置文件,以便您可以查看每个任务执行所需的时间(最小/平均/最大),任务何时准备好运行,当每个任务实际开始执行时,当 ISR 执行时等等。SystemView 可以帮助您发现可能多年未被注意到的错误。但是,SystemView 要求您将代码添加到记录 RTOS 事件和 ISR 的目标(由 SEGGER 免费提供)。SystemView 还消耗少量 RAM 来缓冲这些事件。
9 - J-Link 允许多个进程同时访问 CoreSight,因此您可以同时使用所有三个工具。
审核编辑:郭婷
-
嵌入式
+关注
关注
5062文章
18984浏览量
302379 -
滤波器
+关注
关注
160文章
7712浏览量
177528 -
编辑器
+关注
关注
1文章
800浏览量
31082
发布评论请先 登录
相关推荐
评论