基于PSOS的TM1300应用系统中的BSP研究
扫描二维码
随时随地手机看文章
摘要:通过在应用软件与板级支持包BSP之间加一层库函数的方法较好地解决了应用程序与板级支持包函数间的通信问题,减少了板级支持包函数的维护复杂度,从而为嵌入式系统板级支持包的实现提供了一个有价值的思路。 关键词:PSOS;BSP;库函数 板级支持包BSP属于嵌入式系统的一部分,它相当于一个板级驱动程序,实际上也是用来描述运行于嵌入式微处理器上的软件与外围芯片之间接口的一个软件层。 本文针对基于PSOS嵌入式操作系统的PHILIPS TM1300多媒体应用系统PCI卡,提出了一种BSP 的函数组织方法。TM1300的核心是32位处理器,能够进行32位的线性寻址,寻址能力可达到4GB。TM1300核心处理器采用的是VLIW ?超长指令字结构,可以在每一时钟周期内同时进行5个操作,每秒可完成70亿次指令运算。TM1300支持16kB的数据高速缓存和32kB的指令高速缓存,而且数据高速缓存是双端口的,允许同时双向接入。方便的PCI接口允许其在主机(PC)视频卡上显示图像。从TM1300来看,只有DSPCPU和ICP单元可以对PCI接口进行操作,而从PCI来看,SDRAM和绝大部分处于MMIO空间的寄存器都能够被外部PCI初始化器件所访问。图像协处理器ICP则可给活动视频提供一个用于显示支持的交迭窗口仲裁号码。TM1300使用IIC串行总线来配置其外围器件,并可以在主从两种模式下工作。此外,它还拥有一个实时多任务单(或多)处理器操作系统内核,并采用基于优先级的任务调度方式,此外,它还支持可抢占的、以及基于时间片的调度策略。 1 PSOS在系统中的地位 1.1 DEVICE LIBRARY 将PSOS的模块化技术与板级支持包BSP相结合可使BSP把上层模块及应用软件与底层硬件分开,从而保证开发不受处理器及外围硬件更新的影响,而只需对BSP 中的设备驱动程序做简单的改动即可使其适合于更新或全新的硬件。这在很大程度上减少了开发该系统多个版本的工作量。另外,由于BSP把PSOS的内核与目标机硬件隔离开来,从而使操作系统内核完全与设备无关,保证了内核的稳定性,同时提高了应用系统的可靠性。 对于视频接口中的A/D部分,SAA7114的位置可以由SAA7113来代替,这一硬件上的改动将只体现在板级支持包的变化上,而其上层应用软件不受影响。 BSP包括一个或多个例程,可用来定义特定电路板上的外围芯片,以提供针对这些芯片的基本操作功能,并完成对外围芯片的初始化及各寄存器的设置等工作,图1所示是其系统结构。图中,BSP一方面用于完成外围芯片的初始化;另一方面,在需要时改变各芯片的内部设置,从而使硬件按用户的要求工作于不同的状态。而应用程序、I/O管理器及操作系统内核则通过BSP来对PCI卡硬件进行操作。 1.2 PSOS BSP 必须清楚:PSOS BSP 与TriMedia DEVICE LI-BRARY BSP是不同的。PSOS BSP包括了设备驱动?drv_conf.c只包含这些驱动的开关控制的PSOS 启动码、 PSOS 配置码和访问硬件库(例如:在系统定时及安装中断句柄时所需的库)。它们是PSOS的一部分,而不是应用程序的一部分。PSOS BSP应当适合PSOS操作系统的配置(在sys_conf.h中配置)。由于要把这些特定应用程序的配置参数编译到PSOS 内核中,所以,每次应用中都应该重新编译。而不可能用库来实现。
2 BSP的编写及实现 一般情况下,BSP对板卡中每个芯片的操作都通过多个函数来完成。如果应用程序对板卡的操作都直接通过调用BSP中的函数来完成,那将很不利于源程序的调试。更重要的是,应用程序的可移植性会降低,如果硬件作了修改,应用程序可能也得做一定的变动,这样就不能达到有效使用BSP的目的。所以,本文提出把能完成某个特定功能的函数封装在一个库文件中,并放在应用程序与BSP之间。这样,应用程序通过调用少量的库函数就可控制硬件以实现不同的功能。当底层硬件变动时,只需修改底层实际执行的函数及相应的库函数,而应用程序基本不必修改,从而缩短了开发周期。 另外,BSP中有对各个外围芯片操作的多个函数。因此,针对一个可升级的系统,如何高效地管理这些函数就显得尤为重要。在SDE2.2开发环境中,它采用一个称为注册表的模块来管理这些函数。该模块的内部结构对开发人员是透明的,它的功能就是将BSP 中的函数进行注册,当其他程序需要调用这些函数时,可通过检索注册表来完成。 2.1 编写BSP函数 对每个芯片来说,都应当有初始化函数,且都有为实现不同功能而对各寄存器设置的函数及读取各状态寄存器内容的函数等。在初始化函数中,要完成对各个配置寄存器的初始化设置以使其能在缺省状态工作。根据应用程序对硬件的不同要求,配置函数应能完成各种功能,如工作方式的调整、中断设置、寄存器设置等。而状态读取函数可以获取各个芯片当前的状态并返回给应用程序。由于在这些底层函数中要用到大量的位运算,所以建议在头文件中多使用宏定义以增加程序的可阅读性。为了利用上述思想,这里所有的函数名都使用函数指针变量来表示。 2.2 每个芯片定义一个结构体 在该结构体中,一般首先定义对该芯片操作的各函数的函数指针,再定义对应的结构体变量,然后将各函数添加到该结构体变量中。这样,关于每个芯片的函数都包含在各自的结构体中,便于程序的阅读、调试及维护。 编译连接产生myboard_bsp.o文件时,可用此文件替换开发系统中Trimedia安装目录下tmconfig?无扩展名文件中对BSP的指定,也可以在编译应用程序时特别指定。 为了保持BSP对用户应用程序的透明性,设计时应定义相应的库函数。如打开SAA7113芯片的函数SAA7113.OPEN?,关闭该芯片的函数SAA7113.CLOSE?等。一般情况下,用户应用程序通过调用库函数来实现对该芯片的操作而不关心底层如何工作。因而需要在库函数中定义一个同样类型的结构体变量指针。在库函数中,应在注册表中检索前面对应的结构体重对应函数指针,并将该地址赋值给库函数中定义的该结构体的函数指针变量,这样,就可通过调用相应的BSP函数和进行必要的中断操作来完成其功能。 在应用程序执行过程中,如果需要对硬件进行操作,只需调用相应的库函数即可,库函数通过BSP函数指针实现对底层函数的调用。如果有必要,底层函数执行完后可返回硬件当前的状态。这样的结构不仅可减少应用程序代码,也可使应用程序的结构更加清晰。同时还可使整个操作流程层次分明,对BSP的维护也更加方便。当系统升级时,如果需要更改硬件的部分芯片,只需修改底层函数和所更改部分的函数即可。库函数也只需很少的更改,而应用程序不用更改或只需很少量的更改,这在很大程度上提高了应用程序的可移植性。 3 BSP结构在TM1300系统中的实现 对于本图像处理系统所能实现的功能,此处不再赘述,在该系统中,用本文所描述的方法能够很好地解决应用程序对底层硬件的操作。比如对其中的视频解码器,如果应用程序需要接收视频信号,只需调用视频解码器打开库函数,这样,该库函数即可通过注册表调用相应的底层函数来完成打开视频解码器等一系列对视频解码器的初始化工作。当视频解码器升级为同系列的其它芯片时,底层函数一般只需少量修改,而应用程序则基本不必修改即可正常工作。 4 结束语 本文提出的在应用软件与BSP之间加一层库函数同时配合使用注册表组织管理BSP函数的方法,较好地解决了应用程序与BSP函数间的数据传递问题,同时减少了BSP函数的维护复杂度。此外,该方法也为其它类型的嵌入式系统(VxWORKS等)的BSP设计提供了一个参考。