周 鹏
(抚顺职业技术学院机械与电子工程系,辽宁 抚顺 113122)
在进行嵌入式系统设计的过程中,系统软件[1]是构成各种应用功能的重要环节,若嵌入式系统没有操作系统的植入,将无法实现更强大的功能。所以,当视频监控系统的功能变得复杂时,则需要各种软件的配合及任务处理,如果依靠采用高性能的处理器来提升性能,依然无法实现多任务的协调,因此必须将嵌入式操作系统移植到处理器中。有了嵌入式操作系统的帮助,后期的硬件驱动开发、应用软件设计会变得十分轻松和便捷。视频监控系统终端是一个需要完成多项任务的嵌入式系统,它需要系统软件来提供支撑,完成各种监控任务和信息的处理。因此本文主要讨论系统启动代码的设计、嵌入式Linux操作系统内核的实时性改造及其性能的测试。
系统启动代码(boot loader)是嵌入式系统开发的一个重要环节,它把操作系统和硬件平台衔接起来,对嵌入式系统开发的后继软件开发十分重要。系统启动代码是在操作系统内核之前运行的一段启动程序[2],利用这部分程序,可以检测启动外围设备、构建存储空间的对应关系,实现设备的软硬件协同配合,让整个系统处于最佳状态,为后续启用操作系统做好准备。系统启动代码的设计需要花费大量的精力,它是整个系统启动的首要条件。
系统启动代码的设计种类很多,这是由嵌入式系统所采用的微处理器结构决定的,且它与外设关联紧密,即使是基于同一种处理器构建的不同开发板,由于使用的扩展接口、功能设备不同,往往也需要重新进行启动代码的设计与移植操作。我们无法建立一个能为所有嵌入式系统服务的启动代码,所以本文主要设计一个用于远程视频监控终端的,即以S3C2440微处理器为核心的系统启动代码。
本文采用U-Boot-1.3.3的版本进行启动代码设计,所需工作就是在U-Boot-1.3.3中添加监控设备使用的硬件资源配置文件、操作选项,随后进行编译处理[3]。在准备进行移植操作之前,需要了解当前版本的U-Boot是否支持设计所用的硬件设备,如所使用的处理器体系结构是否一致,各种I/O端口、通信借口是否相同,然后再修改U-Boot-1.3.3相关代码。本文将使用smdk2410源代码为示例进行代码修改,使其能够驱动远程视频监控终端使用的硬件设备。
当对源代码修改完毕后,进入U-Boot目录下依次运行以下命令:
make clobber
make clean
make smdk2440_config
make
之后会生成5个文件:U-Boot;U-Boot.bin;U-Boot.srec;U-Boot.map;System.map,通过JTAG将二进制文件U-Boot.bin烧入Flash中即可。
Linux操作系统的是一种开源操作系统,在使用时可以对其根据实际的需求进行裁剪和修改,使其成为符合自己设计所需的嵌入式操作系统。但由于该系统是一种面向多任务服务的操作系统,因此它的实时性较差,为了让它能够应用在远程监控终端上,就必须对其进行实时性改造[4]。下面本文针对Linux 2.6.26内核对其进行实时性改进。
Linux 2.6.26内核主要改善了内核虚拟机支持,增加了OLPC支持,更新了摄像头驱动等。它在很多具体的嵌入式应用中也完成了多项改进,如自身内核可抢占特性等,在Linux 2.6.26之前的内核版本中,当操作系统执行与内核有关的事件时,其无法实现中断,经过修改后内核的互联及响应得到了大大的提升;输入、输出端口系统也实现了性能的改善,因此它可以在所有的工作任务中均具有一定的响应特性。在Linux 2.6.26的内核中,部分核心程序在执行时会自动停止中断的处理模式,因此可以使进程快速地完成自己的处理任务。它实现了在响应外部设备中断时不会重复进入内核,这段时间外部设备过来的所有中断信息是不能响应的,这样就会有中断响应延迟的存在。
为了解决上述问题,本文采用中断线程化[5]来进行有效的处理。
1)Linux 2.6.26的内核中断在没有被改进之前它的应答方式为:首先操作系统形成中断,处理器在中断控制器中得到中断向量,随后在中断向量表中查找相应的中断向量。在没有进入中断处理程序之前,CUP需要对其进行权限的比对,即检查是否有权限进入服务程序。
2)Linux 2.6.26使用kthread_create()函数进行系统内核的线程建立,由于该线程运行的位置处于内核空间,所以在调用时无需在用户与内核空间进行转换,这样其执行的效果更好。通过建立中断线程并形成中断处理来实现中断的线程化。利用kthread_create()函数在操作系统进行初始化运行时建立中断线程。同时设定中断的优先级,最高实时优先级为50,依次类推直到25,因此任何IRQ线程的最低实时优先级为25。
3)标准Linux 2.6.26内核的中断响应过程如上所述,可知任何的中断均是以中断处理程序进入到common_interrupt函数中的,通过在common_interrupt函数中放入相关程序,如SAVE_ALL,call do_IRQ_JUDGE,jmp ret_from_intr来进行改进,使得中断发生后首先转入do_IRQ_JUDGE。
这种改进是通过一个中断服务进程来为所有的中断服务,这样就在一定程度上节省了系统资源。
对Linux 2.6.26内核进行了实时性改进后,需要对其进行测试来确定其是否符合应用的需要。实时性能测试为测试内核的中断响应时间。
中断响应时间为设备硬件发生中断时到系统执行中断处理程序初始指令所需的时间。实时性测试的过程为:利用在不同时间登录定时器计数据的方式来完成测试。系统检测到外设中断后立即登录定时器内数据,在系统调用中断处理程序后并执行初始化程序开始时再登录取定时计数据,将以上定时器的登录数据进行相减得到的数值就是中断相应时间。本文采用Linux Trace Toolkit工具进行测试,它能够根据实际系统的设计及相应的时间设定来记录固定时间的数据处理,性能测试良好是检测嵌入式操作系统实时性能的有力工具。通过测试,得到平均中断响应时间的测试结果(见表1)。
表1 三种内核平均中断响应时间测试结果
通过测试结果可以看出,将标准Linux 2.6.26内核的中断设置进行修改之后,对比3种不同内核的平均中断相应时间,改进后的系统响应时间明显提升,达到了预期效果。
本文首先设计了系统的启动代码;接着对嵌入式Linux 2.6.26的内核进行了实时性改进,并对改进后的内核进行了相应的实时性能测试,从结果中可以看到,系统的实时性有了一定的提高,为后续应用软件的设计打下了基础,更加适合于远程视频监控系统的实时应用开发。