轮询系统具有以下工作特点:系统完成一个轮询的时间取决于循环中需要执行的函数个数。此外,轮询的次序是静态固定的,在运行时不能进行动态调整。
许多工业线程网络中,由于需要控制的设备较多、相互距离又较远,且现场有较强的工业干扰,因此采用体积小、抗干扰能力强的单片机作为上位机与现场控制器一起组成分布式数据采集与控制系统,是一种较好的选择。
如图,在一个多机通信系统中,只有一台单机(8051)作为主机,各台从机之间不能相互通信,必须通过主机转发来交换信息。
ARM9 Mini2440是一款基于ARM 920T核心的开发板,简称mi2440,是一款容易入门、复杂程度适中的学习板,它采用三星SAMSUNG S3C2440为微处理器。
Mini2440的基本构成如下:
除了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。
宿主机与目标机通过串口、并口、网口或其它通信端口相连,嵌入式软件的调试和测试是由宿主机和目标机之间协作完成。
宿主机与目标机的差别主要在于:
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下创建工程了,具体步骤如下:
交叉开发环境搭建好后,便可动手编码了,编码的首要工作是什么?用ARM汇编语言启动处理器S3C2440A。
无论一个计算机系统由多少硬件设备组合而成,该系统能够运行的基础至少需要一个CPU与运行指令与数据的载体,该载体被称为主存。
当系统上电后,CPU会在可以挂为主存的存储器上开始命令的执行,一般的CPU通常是从地址0x0处开始取指执行。当开发板上电后,CPU的PC寄存器的值通过硬件机制被初始化为0x0。
一切指令与程序都只能在主存上运行。而主存价格较昂贵,并且开发人员的程序通常比较大,因此,开发人员的程序通常存储在外存中,而外存通常无法作为应用程序运行的载体。
这样,当系统上电后,怎样通过一些机制将应用程序从其它存储器设备复制到主存上是十分重要的。
此外,不同的系统硬件设备不同,开机后所需要的硬件设备的配置也不同。所以,系统上电后,对各硬件控制器的设置也是十分重要的。
这些设置其实就是告诉处理器CPU现在启动运行的基本硬件设备是怎样的,从而能正确地使用各种设备,这些都是启动代码的责任。
启动代码的作用可以随着需求的增加而进行扩充,上述描述只是确保系统能够基本运行启动代码的功能,其实,启动代码还可以包括开发板上各板级硬件和接口的驱动程序,这时的启动代码其实就具有了能够使应用程序使用开发板各资源的接口功能了。
BootLoader就是这样一类启动代码的很好诠释。
启动代码是与硬件设备密切相关的,其流程是与具体的硬件设备密不可分的。
这一节将以Mini2440的S3C2440A处理器为例来讲述启动代码的流程,这里的启动代码只是一个能使CPU正常工作的一个最小系统。
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处理器内核一共定义了七种异常:
以上七种模式,有2个模式对应于中断:中断模式,快中断模式。快中断的优先级比一般中断高。当发生中断和快中断时,程序计数器(PC)将会跳到指定的地址开始执行,这为发生中断后执行相应的中断服务提供了可能。