3.软件体系设计
DVB-C软件体系采用分层结构,首先对系统的软件进行分层,然后进行模块化的层次划分。
3.1软件层次结构
按照机顶盒软件系统中不同软件功能和作用,将软件系统按层次进行划分,可分为操作系统层、驱动层、中间层和应用层
其中操作系统层主要包括操作系统内核、硬件平台抽象和操作系统抽象;硬件平台抽象又叫硬件抽象层,主要是将CPU的相关操作和功能部分进行封装,以提供给上层调用,从而避免直接与硬件直接相关性,同时为系统软件的移植、操作系统的更换等带来极大的方便;操作系统抽象主要是将与操作系统直接相关的操作进行抽象化、模块化,以提供给应用程序简单方便的接口,同时使软件系统具有良好的可移植性。
在硬件平台和软件结构基本构建好以后,就选择适合高效的多任务系统环境的嵌入式实时操作系统,而μC/OS-II采用基于优先级的多任务抢占式调度策略;内核短小,实时性好,能进行快速的上下文切换(小于5µs),效率高;内存要求低鉴于这些特点,在本系统中,选择嵌入式实时多任务操作系统为μC/OS-II,作为该机顶盒的操作系统,并将其移植于Hi2011系统上,同时设计操作系统抽象层,封装操作系统与用户相关的操作。
3.2操作系统
在硬件平台和软件结构基本构建好以后,就选择适合该系统的嵌入式实时操作系统。在选择嵌入式实时操作系统(real-timeoperationsystem,RTOS)时,应该具有以下特征的RTOS:基于优先级的多任务抢占式调度策略;内核短小,实时性好,能进行快速的上下文切换(小于5µs),效率高;开放源代码,并且支持一系列的处理器芯片;低的内存要求;具有可裁剪、可移植性。
因为这样的RTOS是高效率的操作系统,能够为DVB-C提供高效的多任务环境,包括任务调度管理、时钟管理、内存管理、中断处理、通过信号量实现同步和互斥、以及通过消息队列实现消息通信等等。比如μC/OS-II、μCLinux、Vxworks、OS20等操作系统,都具有上述特征。
在本系统中,选择嵌入式实时多任务操作系统为μC/OS-II,作为该机顶盒的操作系统,并将其移植于Hi2011系统上,同时设计操作系统抽象层,封装操作系统与用户相关的操作。
3.3软件模块和任务的划分
根据DVB-C硬件模块的一致性可知,其软件模块主要包括初始化启动模块、端口处理模块、解复用模块、解扰模块、节目存贮模块、Flash模块、音视频操作模块、用户界面控制模块、频道转换控制、系统升级模块、EPG模块、中文字体模块和SDRAM模块等。
依据DVB-C要实现的功能和模块划分,将系统的任务划分为10个主要的任务,并为每个任务分配不同的优先级。每个任务都完成相应的功能,并将任务的调度交于操作系统实现。其中系统的初始化启动模块和设备驱动模块在主函数中调用相应的函数来实现其对应的功能。具体划分如下:Task2完成处理远程电源管理、清屏、主菜单键和传递按键给键值处理模块等功能;Task3完成系统的音视频处理;Task4完成频道更新;Task5处理频道节目的编辑和刷新等;Task6调度开机LoGo;Task7处理机顶盒各种显示任务;Task8调度游戏和日历等;Task9处理各种表单,如节目单和解复用单等;Task10处理处理OSD和PMT。而Task1启动其他任务和开机Logo。
3.4数据库构建
基于DVB-C的数字机顶盒的数据库构建,主要构建本地临时数据库和数据库管理两个方面。其中本地临时数据库包括:节目表ProgramList、附加节目表TransponderList和节目数据结构,ProgramList和TransponderList的构建在搜台时完成,当用户作频道管理时,需要作相应的更新并写Flash即可。
数据库管理主要是为管理和访问各数据库里的数据,数据库管理分为频点数据库管理、节目数据库管理和系统数据库管理三个方面。频点数据库管理主要是完成对频点数据的管理,包括频点信息单元和数据块头、链表两个方面。节目数据库管理主要管理节目信息单元和数据块头、链表,由于节目数据库的数据量十分庞大,因此,在定义节目数据库的结构时,不能将节目信息置于一个结构中,以免超出编译器的64KB的界线。
3.5搜台模块
搜台十分重要,不仅要找出频道列表,还要解析出一定程度的各频道的相关信息。搜台算法分为手动搜台和自动搜台算法。因为自动搜台是通过手动搜台对频率的for循环来实现的,所以研究手动搜台。在搜台之前,首先搜索各种节目信息表,因此搜索各种表时的顺序十分重要,这将影响到搜索节目的时间和效率。在搜台时,有以下几种搜索表:PAT:提供PMT的pid,所以要先于PMT的搜索;PMT:提供每个节目(service_id)的包括音视频pid等信息;SDT:提供节目的属性信息,包括节目名字、节目运行状态等属性,在PAT之后搜索;NIT:提供网络的信息,包括网络标识号和网络名称,保存在频点数据库中;NIT还提供此网络下其他频点的参数信息,根据这个可以增加频点数据库。
采用搜索算法思想为:首先调用驱动层封装好的相应API,设定Tuner频点、符号率等参数,根据数据更新的方式决定是否要清除ProgramList和TransponderList,然后搜索解析PAT表,PAT表解析完后对Program逐个解析PMT表和SDT表,所有的Program都完成后,解析NIT表获得网络信息,更新TransponderList,最后成功返回。
3.6系统主函数实现
μC/OS-II操作系统是使用标准C语言编写的,因此,整个系统软件中,又且仅有一个main()函数。在本系统中,也只有一个main()函数。在实现main()时,必须考虑系统的效率。在本系统设计中,采用了Task1来开启其他任务的方式,来减少主函数的代码,提高主函数的运行效率。其代码如下:
main()
{…
OSInit();//操作系统初始化
sys_init();//系统初始化
System_mail_Set=OSMboxCreate(0);//系统消息初始化
sysflag=OSFlagCreate(0x81,&err_main);//系统标志初始化
OSTaskCreate(task1,(void*)&Task1_Stk[TASK1_STK_SIZE-1],TASK1_PRIO);//任务调度开始
OSStart();//操作系统开始
…}