【最新通知】:
嵌入式软件

窥探嵌入式系统内部 早一步掌握设计状态

2017-09-01 14:10:56   来源:单片机与嵌入式系统应用   浏览: 97 次

关键字:

  嵌入式软件开发人员非常熟悉使用代码编辑器、编译器、链接器、调试器以及评估板。大多数情况下,这些工具是开发和调试嵌入式系统所需的全部工具。但是当你想要验证运动控制、过程控制、化学过程、飞行系统等动态系统的运行时,该怎么办?现代的处理器具有专门的调试硬件,允许工具在目标运行时显示或更改内存位置。我们来探讨如何使用这样的调试硬件帮助你在CPU干预很少或没有且目标在运行的情况下,实现嵌入式系统状态的可视化。

  如果你设计嵌入式系统已经有一段时间,你会知道设备的复杂以及调试的难度。微控制器(MCU)是具有片上存储器的独立设备(黑箱),其中包含数百甚至数千个寄存器,用于控制各种外围设备的操作(见图1)。

 

  图1 你能从黑箱看到什么?

  如图2所示,每个工具链都带有一个调试器,它至少能允许你停止目标并检查变量和I/O寄存器(在监视窗口中)。虽然在调试没有实时组件的算法时非常有用,但是当你无法停止目标(例如电机控制、过程控制等)时,这种功能有些无用。

  图2 eclipse环境下的视窗

  为了监控正在运行的嵌入式系统是否正常运行,开发人员通常会添加一些代码去监视系统的运行:

  LED

  嵌入式系统的开发人员通常可以访问至少一个可用于指示某些事情正在工作的LED;当LED变绿时,CPU将其设为main()或其他一些感兴趣的地方。LED很好地表明了go/no-go状态。但是,如果你想要验证其他操作的状态,则需要更多的LED,否则你必须以具有创意的方式使用唯一的LED,比如使用不同的亮灭时间和闪烁速率等来表示不同的含义。

  7段显示器

  低成本嵌入式系统可能配备了LED或LCD 7段显示屏供最终用户使用,如图3所示。嵌入式工程师可以在开发过程中用显示屏指示嵌入式系统中发生的情况。7段显示器可以显示二进制、十进制、十六进制甚至字母。这通常只取决于你拥有的位数的值的范围。另外,如果想显示不同的值,就需要循环显示了。如果你的嵌入式设计不需要显示,可以添加一个仅用于测试目的的显示。当然,你需要为此编写代码。

  图3 4位7段显示器

  字符模块

  字符模块(LED或LCD)是相当低成本的设备,可用作调试工具(见图4)。模块可以通过并行端口(需要6到10条输出线)或串行接口(通常为UART)进行连接。字符模块可用于1×8(1行×8列)配置,直到4×40。这些显示器易于使用,并允许显示字母字符。与7段显示技术一样,需要编写代码以对感兴趣的变量进行格式化和定位,如果所选择的显示没有足够的字符满足你的需要,则可以选择不同的值。字符模块具有能够显示条形图这一附加好处。

  图4 4×20字符模块

  printf()函数

  在我看来,printf()函数是被过度使用的调试功能,其本身问题也比较多。每当你想要显示事件的发生或显示变量的值时,必须格式化字符串,重建代码,下载并重新启动应用程序。printf()输出通常发送到调试器文本控制台、RS-232C端口或USB。一旦达到可显示的行数,显示就会发生滚动,看起来会比较麻烦。printf()不仅需要相当数量的代码,而且可能会对系统正常运行实时性产生影响。

  图形显示器

  如果你的最终产品包含图形显示,则可以在调试期间使用它来显示大量数据甚至图形。但是,调试代码最终将被丢弃或隐藏在你的代码的发布版本中。图形库需要数十到数百千字节的代码空间和大量的RAM(取决于显示分辨率),这会消耗CPU资源并增加应用程序的复杂性,应该寻求更好的选择。

  如果你尝试显示大量数据,上述方式是不足的,更糟糕的是如果你忘记在显示中包含过程控制应用程序所需的一些关键值,就必须编辑/编译/下载并运行新的版本,并将你的应用程序置于正在尝试观察的“状态”中。此外,显示数据是可以的,但如果还需要动态更改设定值、限制值、增益、偏移量等变量的值,该怎么办?

  Graphical Live Watch

  诸如ARM Cortex-M或Renesas RX之类的高级处理器内核配备了硬件调试器端口,可直接访问内存和外设,无需任何CPU干预。换句话说,可以在运行时显示或更改存储器和I/O,而无需编写目标代码。

  该工具称为μC/Probe,使用Cortex-M或RX MCU上的调试器端口,并允许在目标运行时显示或更改变量或I/O端口寄存器的值。你可以通过将其分配给图形对象(如仪表、数字指示器、LED、温度计等)来显示值,还可以通过将这些变量分配给滑块、开关、数字输入等来更改变量的值。μC/Probe还可以通过RS-232C、TCP/IP或USB与目标连接,但这需要一个小的目标驻留监视器。Segger J-Link是迄今为止最方便、最少干涉系统运行的工具。

  图5显示了µC/Probe是如何工作的:①使用任何编辑器编写代码,编译并链接;②将调试器连接到目标调试端口,这种情况下,可以使用Segger J-Link;③将目标MCU的代码下载到闪存或RAM中,然后,让调试器运行代码开始测试;④μC/Probe读取编译器生成的可执行和可链接的格式文件,并提取变量的名称、数据类型和物理内存位置(即其地址),然后创建一个符号表,用于将变量分配给μC/Probe内置的图形对象库;⑤拖放图形对象(仪表、LED、滑块等),并将其分配给符号表中可用的变量。μC/Probe还可通过内置的芯片定义文件(CDF)来了解I/O端口的名称和地址,这允许用户查看原始的模数转换器数量,更新数模转换器(DAC),查找或更改GPIO端口的值等;⑥一旦将变量或I/O端口分配给图形对象,按μC/Probe上的“RUN”按钮,工具将开始通过J-Link接口请求(以接口允许的最快速度)这些变量和I/O端口的当前值,J-Link在目标程序运行过程中将这些请求转换成内存的读写操作进行实时读取或者修改。

  图5 Graphical Live Watch如何工作

  要监视附加变量的值,只需停止μC/Probe,添加图形对象,将其分配给所需的变量,按“RUN”按钮,然后工具会显示,或者允许你更改这些变量,没有必要停止目标,无需编辑应用程序代码、编译、下载和重新启动。

  接着来探讨一下使用μC/Probe的例子。如何观察比例积分微分控制器(PID控制器)的中间值,其中控制器的更新速率为1 kHz,如图6所示,μC/Probe有一个内置的8通道数字存储示波器。在没有必要停止目标运行的情况下,如果变量在符号浏览器中可用,则可以轻松地将其分配给其中一个通道。它可以在任何通道的正或负斜率上触发、延迟触发、预触发或后触发、放大和缩小等。没有μC/Probe,开发人员必须将变量扩展并输出到可用的DAC端口(假设有的话)来观察这些信号。这是非常麻烦的,每次想看看不同的踪迹时,必须重建应用程序。

  图6 µC/Probe的内置8通道数字存储示波器

  嵌入式目标可以运行裸机代码或与实时操作系统(RTOS)内核一起工作。μC/Probe对于流行的RTOS具有内置的内核感知能力,当然,与其他变量一样,该信息可以直接显示(见图7)。每个任务的状态显示在一行中,包含其名称、任务优先级、CPU使用率、运行计数器、最大中断禁用时间、最大调度程序锁定时间,以及该视图中最有价值的信息——每个任务的堆栈使用。具体来说,在设计基于RTOS的嵌入式系统时,最困难的一个方面就是建立每个任务所需的堆栈空间。μC/Probe使用条形图显示每个任务的最大堆栈使用情况,可以非常快速地显示离堆栈溢出的距离。μC/Probe的内置内核感知功能还允许开发人员监视其他内核对象的状态,例如信号量、互斥体、队列、定时器等。

  图7 µC/Probe内核感知

  总 结

  测试和调试实时嵌入式软件可能是很复杂的。事实上,令人不解的是,没有很好的工具可以使嵌入式产品的设计更容易。任何能够即时查看应用程序内部工作的工具都值得尝试。芯片设计人员关于提供诸如ARM Cortex-M和Renesas RX处理器等现代处理器中可见的多功能调试接口的想法,使工具更容易窥探运行中的嵌入式系统,而不会干扰CPU。诸如μC/Probe之类的数据可视化工具让开发人员可以在嵌入式系统中确认设计的正确操作,或者测试发现可以识别和修复的异常情况,导致许多人会问:“为什么我早先没想到有这种工具呢?” 

  作者简介:Jean J. Labrosse是Micrium产品线的首席顾问,负责确保其遵守严格的政策和标准,有助于巩固其作为嵌入式软件组件领先者的声誉。Labrosse于1999年创立了Micrium,是众多行业会议的常规演讲嘉宾,是三本关于嵌入式设计书籍的作者。


分享到:

相关阅读:
· 为了忘却的纪念--纪念中国单片机学会诞生30周年
· 2016中国上海嵌入式系统安全论坛听众邀请函
· 贸泽电子宣布参加第五届深圳国际嵌入式系统展
· 齐聚成都、共议嵌入式技术和产业发展
· 嵌入式系统的创新与创业主题研讨会将在上海举行
· 全球集成电路产业整合与嵌入式系统发展—嵌入式系统联谊会第17次主题讨论会在京召开
· 嵌入式系统联谊会12月主题讨论会议程(总第17次)
· 嵌入式系统联谊会12月主题讨论会即将召开
· 嵌入式系统安全危机?克服嵌入式系统安全危机不是空谈!