随着多媒体技术与通讯技术相结合的信息技术的快速发展和互联网的广泛应用,PC 时代也过渡到了后PC时代。在数字信息技术和网络技术高速发展的后PC时代,嵌入式技术越来越与人们的生活紧密结合。 操作系统为用户使用计算机及其外部设备提供最基本的接口程序,管理计算机上的资源。随着应用领域的扩大,为了适应不同的应用场合,考虑到系统的灵活性、可伸缩性以及可裁剪性,一种以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗要求严格的专用计算机系统——嵌入式操作系统随之延生。 Linux 操作系统是一种性能优良、源码公开且被广泛应用的免费操作系统,由于其体积小、可裁减、运行速度高、良好的网络性能等优点,可以作为嵌入式操作系统。随着2.6内核的发布,Linux向现有主流的RTOS提供商在嵌入式系统市场提出了巨大挑战,例如VxWorks和WinCE,具有许多新特性,将成为更优秀的嵌入式操作系统。 Linux的低成本和开放性,为其在嵌入式系统领域的应用营造了肥沃的土壤。本文着重介绍Linux 2.6内核的新特性及其嵌入式应用中的优势,并将其移植到嵌入式平台中,成功支持H.264编解码多媒体系统。 1 Linux 2.6内核针对嵌入式开发显著特点 实时可靠性是嵌入式应用较为普遍的要求,尽管Linux 2.6 并不是一个真正的实时操作系统,但其改进的特性能够满足响应需求。Linux 2.6 已经在内核主体中加入了提高中断性能和调度响应时间的改进,其中有三个最显著的改进:采用可抢占内核、更加有效的调度算法以及同步性的提高[4]。在企业服务器以及嵌入式系统应用领域,Linux 2.6 都是一个巨大的进步。在嵌入式领域,Linux 2.6 除了提高其实时性能,系统的移植更加方便,同时添加了新的体系结构和处理器类型——包括对没有硬件控制内存管理方案的 MMU-less系统的支持,可以支持大容量内存模型、微控制器,同时还改善了I/O子系统,增添更多的多媒体应用功能[4]。 1.1 可抢占内核 在先前的内核版本中(包括2.4内核)不允许抢占以核心态运行的任务(包括通过系统调用进入内核模式的用户任务),只能等待它们自己主动释放CPU。这样必然导致一些重要任务延时以等待系统调用结束。 一个内核任务可以被抢占,为的是让重要的用户应用程序可以继续运行。这样做最主要的优势是极大地增强系统的用户交互性。 2.6内核并不是真正的RTOS(Real Time Operation System),其在内核代码中插入了抢占点,允许调度程序中止当前进程而调用更高优先级的进程,通过对抢占点的测试避免不合理的系统调用延时。2.6内核在一定程度上是可抢占的,比2.4内核具备更好的响应性。但也不是所有的内核代码段都可以被抢占,可以锁定内核代码的关键部分,确保CPU的数据结构和状态始终受到保护而不被抢占。 软件需要满足最终时间限制与虚拟内存请求页面调度之间是相互矛盾的。慢速的页错误处理将会破坏系统的实时响应性,而2.6内核可以编译无虚拟内存系统避免这个问题,这是解决问题的关键,但要求软件设计者有足够的内存来保证任务的执行。 1.2 有效的调度程序 2.6版本的 Linux内核使用了由 Ingo Molnar开发的新的调度器算法,称为O(1)算法,如图1所示。它在高负载情况下执行得极其出色,并且当有很多处理器并行时也可以很好地扩展[2]。过去的调度程序需要查找整个ready task队列,并且计算它们的重要性以决定下一步调用的task,需要的时间随task数量而改变。O(1)算法则不再每次扫描所有的任务,当task就绪时被放入一个活动队列中,调度程序每次从中调度适合的task,因而每次调度都是一个固定的时间。任务运行时分配一个时间片,当时间片结束,该任务将放弃处理器并根据其优先级转到过期队列中。活动队列中任务全部调度结束后,两个队列指针互换,过期队列成为当前队列,调度程序继续以简单的算法调度当前队列中的任务。这在多处理器的情况更能提高SMP的效率,平衡处理器的负载,避免进程在处理器间的跳跃。 图1 O(1)调度算法 1.3 同步原型与共享内存 多进程应用程序需要共享内存和外设资源,为避免竞争采用了互斥的方法保证资源在同一时刻只被一个任务访问。Linux内核用一个系统调用来决定一个线程阻塞或是继续执行来实现互斥,在线程继续执行时,这个费时的系统调用就没有必要了。Linux2.6所支持的Fast User-Space Mutexes 可以从用户空间检测是不是需要阻塞线程,只在需要时执行系统调用终止线程。它同样采用调度优先级来确定将要执行的进程[4]。 多处理器嵌入式系统各处理器之间需要共享内存,对称多处理技术对内存访问采用同等优先级,在很大程度上限制了系统的可量测性和处理效率。Linux2.6则提供了新的管理方法——NUMA(Non Uniform Memory Access)。NUMA根据处理器和内存的拓扑布局,在发生内存竞争时,给予不同处理器不同级别权限以解决内存抢占瓶颈,提高吞吐量。 1.4 POSIX线程及NPTL 新的线程模型基于一个1:1的线程模型(一个内核线程对应一个用户线程),包括内核对新的 NPTL(Native POSIX Threading Library)的支持,这是对以前内核线程方法的明显改进。2.6内核同时还提供POSIX signals和POSIX high-resolution timers。POSIX signals不会丢失,并且可以携带线程间或处理器间的通信信息。嵌入式系统要求系统按时间表执行任务,POSIX timer可以提供1kHz的触发器使这一切变得简单,从而可以有效地控制进度。 1.5 微控制器的支持 Linux2.6内核加入了多种微控制器的支持。无MMU的处理器以前只能利用一些改进的分支版本,如uClinux,而2.6内核已经将其整合进了新的内核中,开始支持多种流行的无MMU微控制器,如Dragonball、ColdFire、Hitachi H8/300。Linux在无MMU控制器上仍旧支持多任务处理,但没有内存保护功能。同时也加入了许多流行的控制器的支持,如S3C2410等。 1.6 面向应用 嵌入式应用有用户定制的特点,硬件设计都针对特定应用开发,这给系统带来对非标准化设计支持的问题(如IRQ的管理)。为了更好地实现,可以采用部件化的操作系统。Linux2.6采用的子系统架构将功能模块化,可以定制而对其他部分影响最小。同时Linux2.6提供了多种新技术的支持以实现各种应用开发,如Advanced Linux Sound Architecture(ALSA)和Video4Linux等,对多媒体信息处理更加方便;对USB2.0的支持,提供更高速的传输,增加蓝牙无线接口、音频数据链接和面向链接的数据传输L2CAP,满足短距离的无线连接的需要;而且在2.6内核中还可以配置成无输入和显示的纯粹无用户接口系统。 2 应用研究 在S3C2410开发板上移植嵌入式Linux 2.6.11.7内核系统,应用于构建H.264多媒体系统。 2.1 建立交叉编译环境 在RedHat9的主机上进行内核移植开发,首先需要建立交叉编译环境。由于2.6内核中采用了一些新的特性和指令,需要采用较新的工具集,采用binutils-2.15、gcc-3.4.2、glibc-2.2.5、linux-2.6.8、glibc-linuxthreads-2.2.5来建立交叉编译工具链,建立之后将工具链路径加入系统路径$PATH中。 2.2 内核修改 Linux 2.6.11.7内核加入了对S3C2410芯片的支持,不再需要任何补丁文件。修改内核源码中Makefile的交叉编译选项ARCH=arm,CROSS_COMPILE=arm-linux-。针对硬件配置,需要在arch/arm/mach-s3c2410/devs.c或者smdk2410.c中添加FLASH的分区信息s3c_nand_info,如表1。
然后在s3c_device_nand中增加.dev={.platform_data= &s3c_nand_info},在arch/arm/mach-s3c2410/mach-smdk2410.c中的__initdata部分增加&s3c_device_nand,使内核在启动时初始化NAND FLASH信息。 2.3 内核编译加载 对内核进行适当的配置是一个量体裁衣的过程。由于2.6内核会根据本地系统配置进行初始设置,可以导入内核源码默认s3c2410的配置文件,方便加载内核基本配置,然后再选择所需选项。对MTD配置选择支持MTD设备驱动以及NAND FLASH驱动;选择支持要用到的各类文件系统(DEVFS、TMPFS、CRAMFS、YAFFS、EXT2、NFS)以及网络设备和协议,本系统加载了网络芯片CS8900以及USB支持;在H.264多媒体系统中还需要加载Frame buffer以支持LCD显示功能。使用交叉编译工具编译内核源码后, 会在arch/arm/boot/下生成名为zImage的内核映像,在Boot loader的命令提示模式下使用下载命令完成内核加载到开发板的存储设备FLASH中。编译过程(相对以前版本的编译过程,2.6内核编译有所简化): make mrproper make menuconfig(字符界面,或者用make xconfig图形界面,但需要Qt库的支持,而make gconfig则需要GTK库的支持) make make bzImage 2.4 文件系统 Linux采用文件系统组织系统中的文件和设备,为设备和用户程序提供统一接口。Linux 支持多种文件系统,本系统使用CRAMFS格式的只读根文件系统,而将FLASH中的USER区使用支持可读写的YA FFS文件系统格式,方便添加自己的应用程序。 在根文件系统中,为保护系统的基本设置不被更改,采用CRAMFS格式。采用DEVFS来实现基本设备的建立挂载,同时使用BusyBox也是一个缩小根文件系统的办法,提供了系统的基本指令;还需要建立一些必备的目录,添加所需配置文件,如fstab、inittab等;还有一个重要的工作就是添加系统应用必备的动态函数库。使用生成工具mkcramfs 将整个根文件目录里的内容制作成映像文件。 mkcramfs rootfs rootfs.ramfs YAFFS文件系统格式的支持需要将驱动加入到内核代码树下fs/yaffs/,修改内核配置文件,就可以在内核编译中加载对该文件系统的支持。使用mkyaffs工具将NAND FLASH分区格式化为YAFFS分区,将mkyaffsimage生成的应用程序镜像烧写进YAFFS分区,在启动时通过写入fstab自动加载YAFFS分区即可。 2.5 网络设备驱动 系统中采用CS8900A的10M网络芯片,它使用S3C2410的nGCS3和IRQ_EINT9,相应修改linux/arch/arm/mach-s3c2410/irq.c,并在mach-smdk2410.c的smdk2410_iodesc[]中增加{SMDK2410_ETH_IO,S3C2410_CS2, SZ_1M, MT_DEVICE},内核源码中加入芯片的驱动程序drivers/net/arm/cs8900.h和cs8900.c,并且配置网络设备驱动的Makefile和Kconfig文件,加入CS8900A的配置选项,这样可以在内核编译时加载网络设备的驱动。 在Linux2.6应用的同时,也要看到其与以前版本内核比较存在的一些问题。在内核的编译时间、内核镜像大小、内核占用RAM空间大小、系统启动时间相对Linux2.4而言都存在不同程度的不足,但在硬件条件日益进步的现今可以接受,而且一部分也是由于功能加强必然带来的。虽然Linux并非一个真正的实时操作系统,但2.6内核的改进能够满足大部分的应用需求,所以Linux2.6内核将会在嵌入式系统领域大展身手。 参考文献 1 Alessandro Rubini,Jonathan Corbet著,魏永明,骆刚,姜 君译.Linux设备驱动[M]. 北京:中国电力出版社,2004 2 Anand K Santhanam. 走向Linux2.6[EB/OL]. Dec. 2003. http://www-128.ibm.com/deve loperworks/cn/linux/ l-inside/index.html 3 S3C2410X 32-Bit RISC Microprocessor User′s Manual[Z]. SAMSUNG Electronics. Revision 1.2 4 Brandon White. Linux 2.6: A Breakthrough for Embedded Systems[EB/OL].http://linuxdevices.com/articles/AT7751365763.html Sep.9,2003 5 Karim Yaghmour. Building Embedded Linux Systems[M]. O’Reilly. April, 2003 |
上一篇:嵌入式系统优先级反转问题的分析
下一篇:确保嵌入式系统的网络安全性
推荐阅读最新更新时间:2024-08-23 12:12
推进便携式医疗设计的嵌入式处理器
便携式医疗设备的特殊性决定了它们应该是对用户友好的、必须工作在无菌环境下,并且空间占用小、耗能低。 同时,便携式医疗设备还需要足够的计算能力以便处理医疗数据,能够连接到无线或有线接口以便记录和发送数据。从设计人员的角度考虑,上述需求需要低功耗的单片机(MCU)和数字信号控制器(Digital Signal Controller,DSC)。 正是有了嵌入式处理器,设计人员才有可能设计出可在各种医疗应用中使用的紧凑而节能的设备,包括植入式设备、便携式设备、家用设备和安保设备等。应用实例从可自行在柜台购买的血压计,一直到可拍摄病人肠道内部的微型无线照相机。本文将讲述设计人员如何在便携式医疗应用中使用最新的MCU和DSC。
[医疗电子]
Arm Linux 内核页表的段式映射
Linux启动之初,内核为自己建立的是段式内存映射,而不是页式映射。 映射表(PGD)从虚拟地址0xc0004000开始,每项4字节,每项对应1M内存空间,每项的高12位就是这1M内存的高12位地址。 一开始,内核不会为所有内存建立映射,只会映射必要的一部分,这部分代码在arch/arm/kernel/head.S中由汇编代码完成。 以S3C6410为例,下面是在刚刚进入start_kernel()后打印出来的一段内核映射表。注意内核自身的映射表项是从0xc0007000地址开始。因为从0xc0004000开始的是整个4G空间的表,内核内存只占最高的那1G,所以要加一个偏移量:3G/1M * 4bytes = 0x3000。
[单片机]
飞思卡尔朱宇:飞思卡尔应用处理器致力于推动智能嵌入式应用的发展
2012年7月25-26日,由深圳创意时代主办、中国通信学会支持的便携产品创新技术展在深圳会展中心3、4号馆正式召开。本届展会重点展示手机、平板的创新技术与供应链,包括显示技术、电源管理方案、无线技术、陀螺仪、新型传感器、主板方案、软件应用、元器件以及制造工艺设备。同期进行的Portable Innovate主题演讲中,来自各个领域的专家学者分别针对便携技术革新与发展趋势做出了主题演讲。以下为演讲实录。 朱宇:大家中午好,前面提到移动的何先生和高通的鲍先生讲到了手机读卡,大家知道这个市场是存在的。刚刚何先生讲到要创造需求,我们要看到需求在哪里。手机我们都看到了需求,但是还有另外一个市场是智能消费市场。知道手机的人都了解高通、Go
[手机便携]
嵌入式MCU硬件设计概述
1引言 目前,集成电路的嵌入式技术发展越来越快,各色嵌入式产品也越来越受欢迎,尤其是以大屏幕多功能的手机、平板电脑等为典型代表,做为其控制核心的高性能、低功耗的微控制器(MCU)起到了决定性作用。因此以CPU为核心MCU的设计也成为了诸多高等院校、各大公司进行市场竞争的一个主流发展方向。 2 MCU选型技术 微控制器(MCU)的应用领域非常广泛,如消费类电子市场中的手机、照相机、摄像机、MP3、MP4、平板电脑、笔记本电脑、PC机、各种遥控电动玩具等,还有汽车电子的电子钥匙、控制系统、导航、倒车影像、倒车雷达等,还有各种安全防卫系统、医疗器械、工业控制、武器装备、航空航天等各个领域。因此在设计MCU之前需要进行明确的市场定位,从而
[电源管理]
英蓓特受邀参加2016 NXP FTF,推出多款产品重塑工业及IoT应用
中国 深圳 近日,2016恩智浦(NXP)FTF未来科技峰会在深圳圆满落幕。NXP携手合作伙伴发布多项创新技术与合作成果,展示了半导体产业安全互联领域最新的技术成果与解决方案,吸引了约两千人到场,盛况空前。 国内首屈一指的嵌入式解决方案专家英蓓特,也受邀作为第三方设计合作伙伴和 2016 NXP FTF银牌赞助商 出场,展现了自己在视频监控、通信、医疗仪器等传统工业嵌入式控制领域以及物联网(IoT)新兴前景领域两大路径的进击策略。 图1:英蓓特受邀参展2016 NXP FTF现场图 此次英蓓特携四大重磅产品惊艳亮相:基于NXP i.MX 6系列处理器的SBC-EC9100开发板、SOM-SM9300 核心板,基于NXP i
[物联网]
E Ink与飞思卡尔携手开发高集成嵌入式解决方案
业内顶尖的电子书处理器提供商携手电子书电子纸显示器领先供应商,开发高度集成的嵌入式解决方案,这种解决方案能为电子书制造商及其客户降低成本并促进创新 。 飞思卡尔半导体和E Ink公司已经协定,联合开发片上系统(SoC)解决方案,这种解决方案将集成飞思卡尔的i.MX处理器技术和E Ink的Vizplex®显示控制器。此次合作是为了降低成本,并扩展电子书市场支持电子的生态系统。此次合作还有望促进新兴产品种类的创新,例如电子报纸、平板电脑、笔记本电脑备用显示器、电子书和电子词典。 E Ink公司营销副总裁Sriram Peruvemba表示:“我们的目标是提供全球最优数字阅读体验。E Ink与飞思卡尔的联合开发将推
[嵌入式]
C51编译器-语言扩展(6)-重载函数
Reentrant Functions可重入函数 可重入函数可以被多个进程同时调用。当一个可重入函数执时,其他的处理可以中断这个函数的执行,而开始执行这同一重入函数。一般情况下,Cx51中的函数不能够被同时多次调用或者是重入。原因是函数的参数和局部变量都放在固定的内存中。函数reentrant属性允许声明可重入的函数,如: int calc (char i, int b) reentrant { int x; x = table ; return (x * b); } 可重入函数可以被多次调用,而且可以同时被两个或两个以上的进程调用。在实时应用或在中断和非中断程序都要调用同一个函数时就需要使用可重入函数。 对于每个可重
[单片机]
嵌入式linux平台上Eclipse C++开发环境的建立
先装JRE, sudo apt-get install sun-java6-jre 下载eclipse C++的压缩包,解压开袋即食 新建项目,右键属性,C/C++bulid,Setting,Configuration新添加一个,Command处填写arm-linux-gcc ,编译,,, TMD又出现arm-linux-gcc not found ! 明明arm-linux-gcc -v 没问题! 杀手锏,gedit /etc/profile /etc/environment /etc/bash.bashrc ~/.bashrc ~/.profile 全都加上export PATH= /bin:/usr/bin:/s
[单片机]