嵌入式实时操作系统的设计与开发(轮询系统学习)

轮询系统具有以下工作特点:系统完成一个轮询的时间取决于循环中需要执行的函数个数。此外,轮询的次序是静态固定的,在运行时不能进行动态调整。

典型系统

许多工业线程网络中,由于需要控制的设备较多、相互距离又较远,且现场有较强的工业干扰,因此采用体积小、抗干扰能力强的单片机作为上位机与现场控制器一起组成分布式数据采集与控制系统,是一种较好的选择。

如图,在一个多机通信系统中,只有一台单机(8051)作为主机,各台从机之间不能相互通信,必须通过主机转发来交换信息。

搭建开发环境

ARM9 Mini2440是一款基于ARM 920T核心的开发板,简称mi2440,是一款容易入门、复杂程度适中的学习板,它采用三星SAMSUNG S3C2440为微处理器。

Mini2440的基本构成如下:

  1. CPU:SAMSUNG S3C2440A,主频400MHz。
  2. SDRAM:64MB,32位数据总线,时钟频率可达100MHz。
  3. Flash:64M Nand Flash,2M Nor Flash(安装了启动代码FreindlyARM BIOS或者supervivi)。
  4. 相关IO接口。

除了Mini2440外,还需一个仿真器J-LINK,J-LINK是为支持仿真ARM内核芯片推出的JTAG仿真器。能配合KEIL等集成开发环境对所有ARM7/ARM9内核芯片进行仿真。
如果大家已经编写好了代码,并且成功编译,那么如何将编译好的可执行程序烧写在Mini2440上,让其在开发板上运行呢?又如何对下载执行程序进行调试呢?这就需要J-LINK的支持。

写过单片机程序的人都知道,开发人员的程序是在PC上编写的,PC是Intel的处理器,Windows的操作系统。
而单片机可能是TI的8051、430等。

Intel的处理器和单片机采用的是不同指令集。

**交叉开发是嵌入式软件系统开发的特殊方法,开发系统是建立在软硬件资源均比较丰富的PC或工作站上,**一般称为宿主机或Host,嵌入式软件的编辑、编译、链接等过程都是在宿主机上完成。
嵌入式软件的最终运行平台却是和宿主机有很大差别的嵌入式设备,一般称为目标机或Target,这里的目标机就是ARM9 Mini2440。

宿主机与目标机通过串口、并口、网口或其它通信端口相连,嵌入式软件的调试和测试是由宿主机和目标机之间协作完成。

宿主机与目标机的差别主要在于:

  1. 硬件的差别:最主要是两者的处理器不同。宿主机的CPU多数是Intel系列或与其兼容的其它处理器,而目标机的CPU则是ARM、MIPS、8051、TI 430等品种繁多的嵌入式处理器。因此,两者支持的指令集、地址空间都不同。其它的差别,如内存容量、外围设备等。
  2. 软件环境的差异:在宿主机上都有通用操作系统等系统软件提供软件开发支持,而目标机除了调试代理外几乎没有其他用于嵌入式软件开发的软件资源。现有的嵌入式操作系统可作为嵌入式软件运行时的支撑环境。

嵌入式实时操作系统的设计与开发(轮询系统学习)_第1张图片

ADS(ARM Development Suite)是Netrowerks公司开发的针对ARM处理器的集成开发环境,包含了代码编辑器、编译器(for ARM)、连接器、调试器。
图中的宿主机与目标机是通过J-LINK、串口连接的,其中J-LINK是为了烧写和调试被调试程序,而串口主要是为了回显调试信息。

为了让J-LINK能正常工作,需要在PC上安装驱动j-flashARM;此外,如果宿主机是没有串口的笔记本电脑,还需在笔记本的USB上外接一个USB转串口的工具,并安装相应驱动程序。

这样,便可在PC上编写代码,然后用ADS将其编译、链接成具有ARM指令集的可执行程序、即被调试程序。
再通过J-LINK将被调试程序烧写在Mini2440的NORFlash上(NORFlash的起始地址是0x00000000,开发板上电后PC将指向这里,从该地址存放的指令开始运行);最后,重新启动Mini2440,被调试程序便可在目标机上运行,并且通过串口回显运行信息。

将PC、Mini2440和J-LINK连接好后,就可以在ADS下创建工程了,具体步骤如下:

  1. 新建一个ADS工程,并为其命名为MINE,然后新建file文件my_2440_init.s(.s表示该文件是由汇编文件编写的,因为此时开发板尚未初始化,只支持汇编语言。)在创建好后,就将该文件添加到刚建立的MINE工程中,并在debug、release和debugrel三个选项上打“√”。
  2. 设置“my_2440_init.s”文件编译链接后生成的可执行文件的格式。将ADS菜单“Edit”->“DebugRel Settings”->“Linker”->“ARM fromELF”中的“output format”输出形式设定为“Plain binary”文件类型,后缀为“.bin”(此时的裸板程序还只能支持简单的二进制可执行文件,该文件类型为“Plain binary”)。
  3. 生成bin文件后,就可通过J-LINK将该文件“MINE.bin”烧写到Mini2440的开发板中。此时,开发板跳线设置为“NORFlash 启动”,接上J-LINK后,插在底板的JTAG插座上,J-LINK另一头接PC的USB接口。
  4. 开发板上电。
  5. 打开之前在PC上安装的J-flashARM工具,打开步骤:开始->所有程序->SEGGER->JLINK ARM V4.08->JLINK ARM,该界面能将开发板上从地址0x00000000开始的内存数据显示出来。
  6. 单击file->open project,打开s3c2440a_embedclub.jflash,再在ADS选中开发板对应的NORFLASH芯片型号。
  7. 连接宿主机和目标机。
  8. 打开将要烧写的映像文件MINE.bin。
  9. 烧写确认对话框,J-LINK会先擦除NOR Flash,再将MINE.bin烧写在其开始区域中。
  10. 烧写完成后断电,再取下J-LINK。
  11. 重新上电。

启动Mini2440

交叉开发环境搭建好后,便可动手编码了,编码的首要工作是什么?用ARM汇编语言启动处理器S3C2440A。

无论一个计算机系统由多少硬件设备组合而成,该系统能够运行的基础至少需要一个CPU与运行指令与数据的载体,该载体被称为主存。

当系统上电后,CPU会在可以挂为主存的存储器上开始命令的执行,一般的CPU通常是从地址0x0处开始取指执行。当开发板上电后,CPU的PC寄存器的值通过硬件机制被初始化为0x0。

一切指令与程序都只能在主存上运行。而主存价格较昂贵,并且开发人员的程序通常比较大,因此,开发人员的程序通常存储在外存中,而外存通常无法作为应用程序运行的载体。

这样,当系统上电后,怎样通过一些机制将应用程序从其它存储器设备复制到主存上是十分重要的。

此外,不同的系统硬件设备不同,开机后所需要的硬件设备的配置也不同。所以,系统上电后,对各硬件控制器的设置也是十分重要的。
这些设置其实就是告诉处理器CPU现在启动运行的基本硬件设备是怎样的,从而能正确地使用各种设备,这些都是启动代码的责任。

启动代码的作用可以随着需求的增加而进行扩充,上述描述只是确保系统能够基本运行启动代码的功能,其实,启动代码还可以包括开发板上各板级硬件和接口的驱动程序,这时的启动代码其实就具有了能够使应用程序使用开发板各资源的接口功能了。

BootLoader就是这样一类启动代码的很好诠释。

启动流程

启动代码是与硬件设备密切相关的,其流程是与具体的硬件设备密不可分的。
这一节将以Mini2440的S3C2440A处理器为例来讲述启动代码的流程,这里的启动代码只是一个能使CPU正常工作的一个最小系统。

嵌入式实时操作系统的设计与开发(轮询系统学习)_第2张图片
Mini2440开发板有两种启动模式,一种是从NOR Flash启动,另一种是从NAND Flash启动。
当Mini2440从NAND Flash启动时,因为NAND Flash无法作为程序运行的载体,所以S3C2440A芯片通过硬件机制将NAND Flash的开头4KB的内容自动复制到了S3C2440A芯片内部的4KB大小的SRAM上面,并且会自动将这4KB大小的SRAM映射为自身内存的BANK0,将这4KB大小的内容映射到从0x00000000开始的地址上,然后处理器从0x00000000地址开始执行。

创建异常向量表

当程序在S3C2440A芯片上运行发生异常时,程序指针PC会自动跳转到主存最开始的地址(0x00000000),这里就是异常向量表的起始地址,然后会通过专门的硬件机制定位到相应的异常向量。

ARM处理器内核一共定义了七种异常:

  1. 复位异常:当开发板复位时,S3C2440A的ARM920T核将当前正在运行程序的CPSR与PC存入管理模式下的PSPR与LR(R14)中。然后强制将CPSR的M[4:0]位写为10011(管理模式),并将CPSR的I位与F位置1(屏蔽IRQ与FIQ),将CPSR的T位清0(进入ARM指令模式)。之后,强制将PC的值设为0x0,让CPU从0x0开始取指执行命令,这时CPU运行在ARM状态。
  2. 未定义指令异常:当ARM920T遇到一个无法处理的指令时,未定义指令异常发生。未定义异常发生后,当前运行程序的下一条指令的地址会被保存到相应模式下的LR(R14)中,CPSR保存到相应的SPSR中,PC被强制赋值为0x4(因为ARM9是32位的指令集,每条指令占用4B的空间)
  3. 软中断异常:软中断是用户模式切换到特权模式的唯一途径,软中断会将程序带到管理模式下,这样,程序就可以对更多的寄存器,特别是CPSR有了修改的权利。
  4. 预取指终止异常。当在一条指令的预取指片段执行失败(通常为内存读取错误时),预取指终止异常发生。预取指终止异常只有当该指令进入了流水线时(也就是该指令被预取指时)发生,但如果引发该异常的指令没有被执行的话,程序是不会终止去处理异常的,这是因为有可能在之前有跳转指令被执行从而跳过了该指令。
  5. 数据终止异常。当在读出数据时发生内存错误时,数据终止异常发生。
  6. IRQ中断异常。当CPU接收到外部设备发出的中断请求时,IRQ中断异常会发生。**IRQ中断异常会在FIQ快速中断异常中被屏蔽。**在IRQ中断异常处理函数中,建议手动指明该中断是否能嵌套。
  7. FIQ快速中断异常。FIQ快速中断异常是为数据传输与处理提供的快速中断通道。FIQ快速中断异常将进入FIQ快速中断模式,在此模式下,ARM提供了更多的专用寄存器,这样就为中断处理节省了寄存器保护入栈的时间。

以上七种模式,有2个模式对应于中断:中断模式,快中断模式。快中断的优先级比一般中断高。当发生中断和快中断时,程序计数器(PC)将会跳到指定的地址开始执行,这为发生中断后执行相应的中断服务提供了可能。

你可能感兴趣的:(嵌入式实时操作系统的设计与开发,学习,嵌入式实时操作系统的设计与开发)