|
算法标准如何在实际中应用,TI公司给出了一个通用的软件编程思路。将一个基于DSP的软件分成了若干模块,每一个模块都有严格的定义,使得模块之间有明确的界线。图1是一个基于主机-目标机的软件结构图(图中主机端没有画出)。从中可以清楚地看到通用的DSP程序分为4个部分:FrameWork,ALG,Core run time Support,CMDand Status。
FRAMEWORK为应用程序框架,是一些支持 DSP运行的平台或操作系统,例如pSos,vxworks,UC-OS-II等;ALG为独立于处理器的DSP算法;Core run time support为运行支持内核,例如rts54.lib等;ALG为独立于处理器的DSP算法; Core run time support为运行支持内核,例如rts54.lib等;CMD为主机发给目标机的命令,Status为目标机返回给主机的状态信息。主机和目标机模式只在开发状态或某些控制场合使用,大部分的DSP软件都是独立于主机运行的。所以我们只讨论独立于主机的工作模式,下面分别详细讨论上述几方面的作用和相互关系。
(1)应用框架(FrameWork)
应用框架通常是一个与设备相对独立的I/O子系统,即他提供一个通用的I/O接口,并规定算法和应用程序如何使用这个接口。所有可能的外设都以接口形式存在,算法通过框架提供的接口访问外设。典型的应用框架就是操作系统。例如,Windows操作系统,应用程序不能直接访问串口、并口等外设,只能通过Windows操作系统提供的API(应用程序接口)与外设相互作用。任何外设只要提供接口(驱动程序)就可以接入操作系统。
在DSP和微处理器领域,最著名的应用框架就是Wind River公司的pSos和VxWorks操作系统。有些应用框架由于应用领域的不同或者应用方案比较简单,仅仅提供一些基本的I/O功能,难以称为操作系统。例如,
CCS
(Code Compose Stdio)中嵌入的DSP/BIOS(基本输入输出系统)实时内核。框架的基本功能就是提供数据出入的接口。
此外,框架还定义了内部应用模块的等级,也就是操作系统中任务的优先级。通过优先级,框架可以实现对模块的控制,比如中断模块或恢复模块的运行,或决定哪个模块先运行,这就是操作系统中所谓的任务调度。
应用框架负责I/O接口和任务的调度,实质上就是基于硬件平台之上的软件平台。
(2)算法(ALG)
算法是一种纯粹的数据变换器,只是简单地接收 94和处理输入的数据。算法获取数据通常有两种方法,这两种方法均离不开应用框架的支持。一种是中断输入方式,算法通过应用框架的中断服务函数获得数据;一种是查询方式,应用框架提供一个周期性的函数,通过该函数周期性地在某个端口获得数据。在所有情况下,算法在系统中被设计成独立于I/O设备的。即,算法不能直接访问外设寄存器的地址,也就是在算法中不能出现外设的物理地址,只能通过指针参数或模块接口指针将地址传到函数中。
这一实现通常要依靠一个I/O接口模块。通过这种方法,可以减小对框架的依赖,提高算法的通用性。一个算法可以有多种实现,实现方法的不同意味着性能的不同,优秀的算法实现代码短小,执行效率高。而这两者通常不可兼得,执行效率的提高,通常以增加代码长度为代价,这意味着需要更多的存储空间。反之,算法实现代码小,执行性能通常会降低。同时,不同的算法实现价格也不相同。这给了算法集成商或开发商更多的选择余地。
当然,性能和算法的这种折衷,必须以遵循算法标准为前提,不然,算法不可相互“替换”,算法的多个实现也就失去了意义。
(3)运行支持内核
为了使算法满足可重入、与I/O外设独立以及可调试性的最小需求,算法需要一系列总是稳定存在的内核服务。比如C语言运行支持内核。该内核提供基本的打印函数printf()、内存管理函数memcpy()、字符串函数、时间函数等标准C语言的基本运行环境。该内核的相关的函数经过封装,形成一个支持库rtsxx.lib。xx代表处理器的类型。
由于大部分的算法仍旧是用汇编语言生成的,内核提供的许多服务也必须适合汇编语言,并能用其访问。这也是标准C语言和汇编语言能够混合编程的基础。TIDSP运行支持内核还包含一个DSP/BIOS的子集,提供基本输入输出功能,该功能比标准C的基本输入输出函数执行速度快。此外,还附带一些对控制和状态寄存器微小操作的子集,例如,设置溢出模式等。
算法、应用框架、运行支持内核各自的代码相对独立,相互作用,共同协作构成一个有效的应用软件。他们之间有各自的界线,在标准中有各自定义的功能范围。算法只有相对独立于应用框架和运行支持内核,才能支持“即插即用”,才能在无需大量修改源代码的情况下,用一种算法替代另一种算法。
|
|