在寻求获得来自处理系统内的赛灵思Zynq?-7000全可编程SoC的最大利益,操作系统将让你更不是一个简单的裸机解决方案。任何开发ZYNQ SoC设计有大量的操作系统可供选择,并根据最终应用程序,你可以选择一个实时版本。一个RTOS是您最好的选择,如果你是在工业,军事,航空航天或在响应时间和可靠的性能要求,以防止生命或伤亡的,或者实现严格的绩效目标等具有挑战性的环境中使用的SoC
ZYNQ。
为了得到一个感觉如何最好地实时操作系统添加到我们的ZYNQ SoC系统中,我们将使用最流行的实时操作系统之一左右,在μC/ OS-III Micrium的。这RTOS或更早的版本中它已经用在了一些非常令人兴奋的系统,包括火星的好奇心流动站。目前最新的版本是在被认证为MISRA-C,DO178B
A级,SIL3 / 4和IEC61508标准,这意味着它应该有一个广泛的吸引力许多ZYNQ SoC的用户的过程。但在此之前进入的实施细则,这是有帮助的审查实时操作系统的基础知识。
什么是实时操作系统?
是什么让一个实时操作系统与标准操作系统有何不同?井,一个实时操作系统是确定性的,这意味着该系统限定的期限内进行响应。这个决定可以是一个重要的原因,例如,如果最终应用正在监控工业过程,并具有以响应事件在指定的时间周期内,如将是一种用于工业控制系统中的情况。
的RTOS进一步细分基于它们来满足这些最后期限的能力。这种分类产生了三种不同类型的RTOS,其中每一个不同的地址的最后期限的概念。在硬的RTOS,缺少一个期限被看作是一个系统故障。这不是为公司RTOS,其中偶尔错过截止时间是可以接受的情况。在软的RTOS,同时,缺少一个期限减少的结果的有效性,但该系统作为一个整体能容忍此。
实时操作系统围绕运行的任务(有时称为工艺),其每一个执行所需功能的概念。例如,一个任务可能读取数据通过接口或对这些数据进行操作。一个简单的系统可以采用只有一个任务,但它更可能为多个任务,以在处理器上在任一时刻运行。这些任务之间的切换被称为“上下文切换”,它要求与每个任务相关联的处理器的状态被存储和添加到任务堆栈中。
确定的方法,其任务是下一个要运行是由内核(管理从软件输入/输出请求,并将它们转换成用于所述中央处理单元的数据处理的指令和在所述处理器的功能元件的RTOS的核心)来控制。任务调度可以是复杂的,特别是如果我们希望避免死锁的状态,其中两个或多个任务锁定彼此出来。的两个基本方法是时间共享和事件驱动的。分时,每个任务获取处理器上的专用时隙。更高优先级的任务可以被分配多个时隙。此时间片是通过常规的中断或定时器控制,并且通常被称为“round-robin调度”。随着一个事件驱动的溶液,任务只切换,当一个具有较高优先级的运行必需的。这通常被称为“抢占式调度”。
死锁,资源共享和饥饿
当两个或多个进程需要使用相同的资源,如UART,ADC或DAC-它有可能为他们的同时请求该资源。在这种情况下,访问需要为了防止争用被控制。这是如何管理是很重要的。如果没有正确的管理,问题,如“死锁”或“饥饿”可能发生,从而导致系统故障。
死锁当一个进程持有一个资源而无法释放它发生,因为它是无法完成的任务。它要求当前正由另一个过程中的另一个的资源。由于该系统将保持在该状态下无限期地,该应用程序被认为是僵持。你可以想像,僵局是一个实时操作系统发现自己在一个糟糕的情况。
发生饥荒时,一个进程无法运行,因为它需要的资源总是分配给另一个进程。
这可能不会令你感到惊讶地听到,已经出现了很多东西写就这些问题,多年来,有很多提出的解决方案,如德克尔的算法,一个经典的修复程序并发编程的互斥问题。最常用的方法来处理这??些情况下是信号量,这通常是两种类型的二进制信号和计数信号量的。
一般地,每个资源有分配给它的一个二进制信号。一个请求进程将等待资源执行之前变得可用。一旦任务完成,请求进程将释放资源。这些信号量通常被称为WAIT和SIGNAL操作。一个进程将等待一个信号量。如果资源是自由的,该过程将被考虑到资源的控制,它会运行,直到完成,此时它会SIGNAL完成。然而,如果当处理等待对信号执行的资源已被占用,则该过程将被挂起,直到资源变得自由。这可以尽快当前正在执行的处理结束发生,但有可能是一个较长的等待,如果这个过程是由较高优先级的一个进程抢占。一类特殊的名为互斥体(从术语“互斥”派生)二进制信号量经常被用来防止优先级反转。
计数信号以同样的方式作为二进制信号量的工作,但它们被使用时,一个特定类型的资源的一个以上的实例是可用的(例如,数据存储)。由于每个资源被分配给一个过程,计数被减小,以显示剩余的可用资源的数量。当计数到达零,有没有更多的可用资源,并且请求进程将被挂起,直到资源之一被释放。
它往往是必要的过程来与彼此通信。有多种方法可以采用,这是最简单的是,如上所述,以使用一个数据存储和信号。更复杂的技术包括消息队列。有了消息队列,当一个进程希望将信息发送到另一个进程,它发布消息队列。当一个进程希望从一个队列中接收消息时,它会挂起队列。因此,消息队列工作就像一个FIFO(先入先出)存储器。
在μC/ OS-III操作系统
Micrium的μC/ OS-III是一个抢占式RTOS,这意味着它会一直运行具有最高优先级的准备执行任务。在将其加入ZYNQ SoC系统设计的第一步是从Micrium的网站下载了μC/
OS-III的RTOS。一旦你这样做,安装非常简单。你只需要你安装的Xilinx提取下您的计算机上的几个ZIP文件到正确的文件夹(目录)。
请确保您提取名为Zynq-7000-ucosiii-bsp.zip ZIP文件到您的\ ISE_DS \ EDK \软件\ lib目录\ BSP \
文件夹中。你会看到一些其他的操作系统这个文件夹下,包括独立和xilkernel的。接下来,提取名为Zynq-7000-ucosiii-demo.zip
ZIP文件到您的\ ISE_DS \ EDK \软件\ lib目录\ sw_apps \
文件夹,如图1。再次,你会看到一些其他的应用演示中此文件夹。
图1:显示演示文件的位置的目录结构
无需安装这两套文件,我们准备开始软件开发工具包(SDK)中创建我们的项目。我们将使用之前创建相同的基本硬件,但我们需要一个新的应用程序和板级支持包(BSP),因为我们希望包括操作系统。
在SDK中,关闭所有打开的项目,除了基本硬件设计。接下来,选择文件>新建>应用程序项目的选择,给新的项目名称并选择操作系统μC/ OS-III(见图2)。然后选择μC/
OS-III的演示应用程序(见图3)
图2:选择操作系统
图3:选择μCOS-III演示
当你快乐时,单击Finish按钮。应用程序和板级支持包(如果你选择该选项)将在SDK中创建。如果您选择了自动生成选项,你可能会发现一些错误的报道。这是因为不是所有的项目引用是正确的呢。要设置这些项目引用,您需要导入的演示设置,你会发现项目>来源>设置选项下。在这个XML文件右键单击并查看属性。这将允许您选择和复制该文件的位置,如图4所示。
图4:获取正确的设置
一旦你复制这个位置,在项目右键单击并选择属性。在标题C / C ++一般,选择路径和符号的选择。然后选择导入设置和设置文件的位置粘贴。
同样重要的是,以确保存储库正确指向前面添加的库。您可以通过设置赛灵思工具>存储库,它应该显示在您的μC/ OS-III BSP以前安装的位置检查这些。
因为我们希望使用的UART输出的状态演示,正在显示出完成初始化和运行任务,则可能需要设置标准输入和标准输出到UART下的BSP设置。
经执行这些操作,你会看到,现在可以建项目。但是,仍然会有一些警告,如果你想在你的硬件上运行这个项目,将无法达到演示指出它应该。这是因为警告了未申报的功能。包括bsp.c文件中下面的语句应该纠正这个问题。
??? 的#include“xil_cache.h”
有一次,我添加了这个“有”头文件,该项目建成并运行按预期在我的ZedBoard(见我的YouTube视频)。
启动和运行
在拿到例如启动和运行,你现在有信心,RTOS已经在系统上正确实施。现在,您可以继续正确地执行对ZYNQ SoC的软件设计。一旦你创建了软件应用和工程团队已经准备好尝试一下硬件,可以在完全相同的方式创建一个编程文件,你会为裸机系统(参见Xcell杂志问题83,“如何配置您的SoC
ZYNQ裸机解决方案“),能够与RTOS的应用程序启动和配置存储器执行。