您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

嵌入式Linux在三星S3C2410开发板上实现H.264

发布日期:2011-06-06

嵌入式linux内核 嵌入式操作系统内核 嵌入式系统内核 linux2.6内核移植 linux 2.6内核下载     随着多媒体技能与通讯技能相连合的信息技能的快速生长和互联网的广泛应用,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。 

    表1 NAND FLASH分区表

分区名 肇始地点 大 小
Vivi 0x00000000 0x00020000
Param 0x00020000 0x00010000
Kernel 0x00030000 0x001c0000
Root 0x00200000 0x00200000
Usr 0x00400000 0x03c00000

    然后在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内核将会在嵌入式体系范畴大展武艺。