本文是软件开发系列文章的篇,尤其是嵌入式系统和实时应用程序的编程。未来的文章自然会不时提及XMOS技术,因此首先了解 XMOS 适合的软件世界是有意义的。
软件是一个了不起的东西。编程语言表达能力强,编译速度快,有很多抽象和工具可供开发,更新设备功能快速简便。这意味着系统中由软件驱动的任何部分都是系统中灵活的部分——一个奇妙的部分。
然而,软件真正令人讨厌的地方有一个:快速实时处理。这是一种必须在某些外部事件之前完成任务时的处理,例如,在
显示器的屏幕刷新之间操作图像数据,或者基于某个快速时钟向外部 I/O 引脚提供数据。
当然,可以使用软件来实现这一点,但所有美妙的易用性和灵活性似乎都消失了。软件开发变得难以维护。
问题
那么,为什么软件在面对实时或界面驱动的应用程序时会出现问题呢?这些问题可以分为几类。
问题 1:多任务处理
自然,处理器可能会尝试执行多个任务,即使是简单的问题。但是,处理器通常不能做多于一件事。即使是具有传统架构的多核处理器,在硬件中也可能只能做两到四件事。
问题在于,自然单线程处理器上的多任务处理涉及软件以块的形式将任务调度进出处理器。从单个任务的角度来看,调度意味着您不知道何时进入和何时离开,从而难以满足实时约束。
问题 2:中断
即使对于“单线程”应用程序,处理器也可能做不止一件事。中断提供了一种隐含形式的多任务处理。中断触发(例如为 I/O 处理程序提供服务)与调度程序切换任务相同。
图 1:中断与事件。
问题 3:缺乏可预测
性 似乎软件在时间方面确实缺乏可预测性。任务需要在一定的微秒内运行,但不能保证它们会。调度和中断只是问题的一部分。一些
微处理器具有用于
存储器访问的高速缓存,并且存储器访问所花费的时间取决于该高速缓存的状态。此外,一些微处理器是超标量的,因此每条指令的执行时间都是可变的。这一切都意味着您不能只计算指令的数量并知道该指令序列将花费多长时间。
问题 4:缺乏资源
在嵌入式应用中使用实时软件时,往往会出现另一个问题:资源不足。
内存和时钟周期需要花钱,因此有动力从低资源设备中获得尽可能多的东西。对于倾向于将资源视为丰富的现代软件抽象来说,这是一个问题,例如,内存是无限的资源。
解决方案
避免实时软件问题的一种选择是在硬件解决方案中实现它。如果一个固定的功能部分存在你想要的功能,那真的没什么可做的。或者,可重新编程的硬件部件,如FPGA可以,只要你有编程的技能。即使您这样做,也可能需要一些软件任务,因此您必须将 FPGA 与微处理器集成,无论是在 FPGA 上还是在单独的部分上。这种硬件/软件部门提供了多种设计流程和工具,并且缺乏软件开发可以提供的不同功能的紧密集成。
是否有任何解决方案可以提供软件开发的所有好处,但不会出现尝试进行实时编程时出现的问题?
一种选择是使用实时操作系统 (RTOS) - 具有用于实时应用程序的额外不同功能的传统操作系统。首先,多个任务的调度具有优先级和时间感知性,因此调度程序试图保证任务满足它们的时间约束。其次,操作系统的设计使得所有系统任务的坏情况执行时间都是已知的,使您能够进行一些坏情况执行时间(WCET) 分析。
然而,传统微处理器上的 RTOS 提供了相当重量级的解决方案。它试图将非自然实时的东西转变为实时框架。即使调度是实时感知的并且对系统任务执行 WCET,处理器的非确定性(缓存、超标量执行)仍然存在。这样做的结果是,即使使用相当快的微处理器,由于操作系统的开销,也很难以亚微秒的限制完成任务。这类任务传统上仍由 ASICS 或 FPGA 处理。
XMOS 设备提供了一种全新的解决方案,将软件的优势与硬件解决方案的实时性能相结合。
XMOS:专为实时而设计
XMOS 处理器专为具有快速外部 I/O 约束的实时处理而构建。它们旨在将的硬件设计与的软件设计相结合。
解决方案 1:硬件多任务
XMOS 设备在硬件中处理多任务,一组任务在不同的软件线程上运行。每个时钟周期都有一个不同的线程以循环方式交换到上下文中。这意味着您不必担心调度程序 - 您可以将每个线程视为以设定速度运行的独立实体。它也是一种天然的多核架构,因此添加更多内核意味着可以运行更多独立任务。
解决方案 2:事件驱动的架构
XMOS 设备上没有操作系统层。每个线程都明确响应事件,而不是中断。这种方法意味着没有隐藏的任务可以跳入并扰乱软件的时间安排。
解决方案 3:可预测
的执行 缺少操作系统和软件调度程序,再加上没有缓存的内存(每次内存访问需要 1 个线程周期)以及每个线程使用独立资源,这意味着使用 XMOS,您可以获得实时所需的可预测性 -时间应用。你知道一个指令序列需要多长时间是静态的。此外,XMOS 提供了一个时序分析器 (XTA) 工具,该工具可以准确地测量两个代码点之间的坏情况执行时间(考虑到控制流的多个路径、函数调用)。
解决方案 4:托管资源
XMOS 器件专为嵌入式应用而设计,因此成本低、资源少。软件程序员的关键是管理这些资源。软件
开发工具(基于标准 C 编译器的扩展工具)跟踪资源使用情况,因此您知道您不会在运行时用完。如果您需要更多内存、处理能力或 I/O,只需添加另一个内核,因为资源是完全可扩展的。
这些工具还确保每个线程只使用自己的资源,而不会干扰其他线程。
结论
本文介绍了实时应用软件编程的困难以及 XMOS 系列器件设计背后的动机。下次您设计需要实时处理和 I/O 编程的系统时,请查看 XMOS,了解如何将软件开发的优势与实时性能相结合。