1 引言
现在的许多设备对实时时钟都有很高的要求,在片集成的实时时钟往往只注意到了其使用的方便,而没有考虑在实际应用中还有很多特殊的要求。本文讨论如何使用独立的外扩实时时钟,来满足这些要求。
什么是实时系统?就是系统运行时的反馈信息或者指令,必须在要求的时间内发出或者返回,否则视为无效。例如,数据采集的时候,必须在对应的时间内得到信号,以保证数据采集的有效性。那么什么是实时时钟?就是采用独立的晶振(或集成),拥有独立供电系统,永不间断的运行,从而给系统提供可靠的系统时间。
集成的实时时钟和独立实时时钟的比较:
以博创UP-NETARM3000开发板为例,它使用的是三星公司生产的S3C44B0XARM7处理器,该处理器内部集成了一个实时时钟,其中的2个中断源INT_RTC和INT_ADC中断源在26个中断源中优先级最低。RTC的电压要求2.5V或3V,但是不支持3.3V。也就是说开发板上的实时时钟不能脱离开发板独立地运行,同时中断级别低,电压范围窄,精度不可调,不具备通用性。而外扩的独立实时时钟电压范围宽,使用I2C总线,中断级别高,同时独立于开发板运行,通用性好。特别是精度是可以矫正调节的,这对实时性来说精度是很重要的指标。
2 ARM处理器
ARM(ADVANCED RISC Machines)是一类微处理器的通称[1]。1991年ARM公司成立于英国剑桥,主要出售芯片设计技术的授权。ARM现在已遍及工业控制,消费类电子产品,通信系统,网络系统,无线系统等各类产品市场,基于ARM技术的微处理器应用占据了32位RISC微处理器75%以上的市场比例,ARM 技术正在逐步渗入到我们生活的各个方面。
3 PCF8563
PCF8563是PHILIPS公司生产的低功耗CMOS实时时钟/日历芯片, 芯片最大总线速度为400kbits/s,每次读写数据后,其内嵌的字地址寄存器会自动产生增量。PCF8563可广泛应用于移动电话、便携仪器、传真机、电池电源等产品中。PCF8563有16个8位寄存器,其中包括:可自动增量的地址寄存器、内置32.768KHZ的振荡器(带有一个内部集成电容)、分频器(用于给实时时钟RTC提供源时钟)、可编程时钟输出、定时器、报警器、掉电检测器和400KHZ的I2C总线接口。所有16个寄存器设计成可寻址的8位并行寄存器,但不是所有位都有用。当一个RTC寄存器被读时,所有计数器的内容将被锁存,因此,在传送条件下,可以禁止对时钟/日历芯片的错读。同时它还拥有PHILIPS的优良品质,在3V电压,25摄氏度下,功耗为250nA,非常低。本文选用PCF8563来外扩实时时钟,其硬件连接示意图如图1所示:
图1 PCF8563与S3C44B0X的连接图
4 I2C总线
在现代电子系统中,有为数众多的IC需要进行相互之间以及与外界的通信。为了提供硬件的效率和简化电路的设计,PHILIPS开发了一种用于内部IC控制的简单的双向两线串行总线I2C(Inter IC总线)。I2C总线支持任何一种IC制造工艺。作为一个专利的控制总线,I2C已经成为世界性的工业标准[2]。
5 uclinux系统[3]
uClinux是微控制器领域中的Linux系统。它通常用于具有很少内存或Flash的嵌入式操作系统。在GNU通用许可证的保证下,运行µClinux操作系统的用户可以使用几乎所有的Linux API函数。它具有体积小、稳定、良好的移植性、优秀的网络功能、完备的对各种文件系统的支持,以及丰富的API函数等优点。uClinux除了不能实现fork()外,其余uClinux的API函数与标准Linux完全相同。
①.uClinux的内核加载方式
uClinux的内核有两种可选的运行方式:可以在flash上直接运行,也可以加载到内存中运行。Flash运行方式:把内核的可执行映象烧写到flash上,系统启动时从flash的某个地址开始逐句执行。内核加载方式:把内核的压缩文件存放在flash上,系统启动时读取压缩文件在内存里解压,然后开始执行。
②.uclinux的根(root)文件系统
uClinux系统采用romfs文件系统,这种文件系统相对于一般的ext2文件系统要求更少的空间。内核支持romfs文件系统比支持ext2文件系统需要更少的代码,romfs文件系统相对简单,建立文件系统超级块(superblock)需要更少的存储空间。romfs文件系统不支持动态擦写保存,对于系统需要动态保存的数据采用虚拟ram盘的方法进行处理(ram盘将采用ext2文件系统)。
6 uclinux在S3C44B0X上的移植[4]
BootLoader引导程序是嵌入式开发很重要的组成部分。它是CPU 加电后第一个开始运行的代码,由它最终将操作系统启动起来并将控制权交给操作系统内核。BLOB(Boot Loader OBject)最初是由Jan-Derk Bakker和Erik Mouw为LART而写的引导代码,由于其良好的移植性和强大的功能被移植到了很多其它机器上。BLOB遵守GNU GPL licence。BLOB功能比较强大,它可以:
①.. 初始化诸如CPU的主频、SDRAM的控制管理、中断、串行口等硬件;
②.. 启动Linux内核并提供一个RAMDISK;
③.. 通过串口下载内核或者RAMDISK到板卡上;
④.. 可以将修改过的新的内核或者RAMDISK写到Flash上;
⑤.. 可以重新自由设定存储中不同的布局;
⑥.. 可以提供一个命令行接口给用户。
Blob常用的命令有:blob、boot、xdownload、flashreload、dump、reblob、status、flash等。xdownload命令用于下载内核和根文件系统到内存中,flash命令用来把它们烧到flash中。
在PC机上建立起uclinux的编译环境,在终端中运行博创开发板自带光盘上的install.sh文件,它将在你的PC机上安装交叉编译环境和一个在44B0X上运行uclinux-2.4.x文件夹和许多有用的文件夹。建立交叉编译环境也可以通过下在通用的gcc编译器来实现,它是一个.sh文件,其运行方法在后面有介绍。实际上就是建立uclinux的库文件的过程。开源的好处就在于这一切都是透明的,不需要你去配置,只要会安装就可以了。
通过串口烧写uclinux内核和根文件系统,这在Windows下使用超级终端。Linux下使用minicom。基本设置是波特率115200,8个数据位,无奇偶校验,停止位1,无数据流控制。
同时要在PC机上建立NFS文件共享服务,本文的共享目录是/root/nfs。进入服务器配置选项,里面有NFS,网络服务器配置等。配置过程时建立要选择共享的目录和访问的IP段。
7 PCF8563的读写程序
PCF8563 使用的是I2C总线,他的读写过程遵循总线的读写过程,S3C44B0X的I2C总线控制器为一个多主的控制器,其读写流程如图2所示。
根据流程编写了PCF8563的读写程序。该程序通过uclinux的交叉编译工具编译成为可以在S3C44B0X上面运行的程序,过程如下:该程序和它的头文件放到同一个目录下,然后打开终端在终端下执行:
cd 所在目录
arm-elf-gcc -elf2flt rtc main.c
这样就会生成一个uclinux下的可执行文件,通过NFS挂载过去,步骤如下:
ifconfig eth0 202.204.96.196
mount -t nfs 202.204.96.198:/root/nfs /host
用cd命令进入所挂载的目录,直接执行就可以了。
该过程在实际操作过程中可以用一种简便的方法来实现,这也是经行uclinux下开发程序的简便之处,那就是makefile文件。我们在一台服务器主机上建立一个虚拟机VM work station,里面安装的是linux系统和uclinux的交叉编译环境,在需要编译的文件所在目录下建立一个makefile文件,内容如下:
all: main.c //编译的文件
arm-elf-gcc -elf2flt -o rtc main.c //编译读写程序
cp rtc /root/nfs //复制rtc到NFS共享目录下
chmod +x /root/nfs/rtc //改变可执行文件rtc的属性
通过telnet获得虚拟机的root权限。然后进入main.c所在目录。这时候的编译就只需要在main.c所在目录下运行make命令就可以了,它会自动生成可执行文件rtc,自动复制到NFS共享文件夹中。在开发板上进入NFS共享文件夹,运行其中的应用程序。这种方法对程序的开发极其的方便,这也是linux下程序开发调试的优势之一。
8 结论:
本文使用PCF8563来代替CPU上集成的实时时钟,使系统时间不会丢失,在硬件上保证了实时性;精度相对集成实时时钟得到了提高。在其读写程序的编写编译过程中,还对uclinux下的高效程序开发方法进行了实践。在有较高的精度要求时,可以对时钟的精度进行调整以适应需求。同时这种扩展方法具有一定的通用性,可以在各种单片机和ARM应用系统中使用,有一定的使用和借鉴价值。