基于Ti6678 DSP的最小化OS适配设计与实现
2020-07-20董延军
董延军,曹 原,项 涛
(航空工业西安航空计算技术研究所,陕西 西安 710065)
1 关于操作系统的概述
早期的数字信号处理(Digital Signal Processing,DSP)资源少、功能单一、运行的应用程序规模小,不足以支撑也不需要运行操作系统,简单的控制程序就可以实现相应的功能。随着DSP硬件的功能越来越多,性能越来越强,应用软件功能变得复杂、规模变大、跨DSP移植性需求变强烈,构建DSP的操作系统就有了实际价值。Ti6678 DSP是德州仪器公司基于其KeyStone架构的8核浮点型处理器,单核运行频率达1.2 GHz,是当前最为先进的DSP芯片。操作系统是系统资源的管理者,隔离了底层的硬件差异,向应用提供了统一的与硬件无关的功能接口。最基本的操作系统应该具有多任务、任务间通信、存储管理、Cache管理等,在这之下需要基本硬件驱动的支持,下面将从这些方面逐层介绍。
2 基本硬件驱动设计
操作系统对于底层硬件的依赖,通过称为板级支持包(Board Support Package,BSP)的软件进行了屏蔽,BSP对下实现各种不同硬件的具体操作,对上为操作系统提供统一的不变的操作接口,保持了操作系统的独立性。一般的BSP至少包含了串口、网卡、时钟、中断控制器、Flash几类基本驱动,串口实现了打印输出,网卡实现了调试通信通路,时钟是基本内核定时和切换的时间基准来源,中断控制器实现多种中断的管理,Flash实现程序的固化运行。
Ti6678 DSP上实现最小运行的操作系统(Operating system,OS),可在这个基础上进一步简化,调试环境借助Ti公司提供的控制及计算系统(Control and Computation System,CCS),该集成开发环境可以实现编辑、编译、调试、运行等功能,具体嵌入式操作系统配套的开发环境和编译器可以暂不实现集成;调试输出显示借助CCS的虚拟终端、串口驱动可以暂不实现;调试使用USB接口的仿真器,网络驱动可以暂不实现;固化借助CCS自带的烧写方式,Flash驱动可以暂不实现。所以只剩下中断控制器和时钟两种驱动的实现。以Ti公司提供的库函数(Chip Support Library,CSL)库为基础进行改造,封装为符合具体操作系统要求的操作接口,进行中断控制器的初始化,中断线使能、时钟初始化、时钟中断处理等,为最小化OS的运行提供基本运行环境支持,并提供维持运行的基准时钟来源。
3 操作系统功能裁剪
完整的嵌入式操作系统在基本内核的基础上,具有任务管理、任务间通信、内存管理、中断/异常管理、定时器管理以及调试代理、通信管理、加载程序管理等功能,还可能包括多核间通信组件[1],如图1所示。
图1 操作系统基本功能模块
在完整的操作系统功能上进行裁剪,定义出最小操作系统的功能,主要实现包括图1中阴影部分所示的5个基本单元任务管理、任务间通信、内存管理、时钟/定时器管理、运行时库。这些模块包含了以下主要功能:
(1)多任务支持,支持多任务并发执行,实现对任务的创建、启动、挂起、删除等操作。(2)任务调度,通过优先级可抢占调度机制实现系统的强实时性;对同等优先级任务可通过时间片轮转实现均衡调度。(3)任务通信,提供机制实现任务间基本的通信、同步和互斥操作,包括信号量、环形缓冲。(4)内存管理,DSP的内存本身较小,整个系统运行在实地址模式,所以内存管理主要是管理有限的堆栈资源,使得应用可以使用标准C接口申请、释放内存。(5)服务接口,是应用感知操作系统存在媒介,提供覆盖操作系统各类功能的服务接口,使得应用程序保持独立性,方便维护及跨平台移植。
4 任务上下文切换设计
任务切换上下文是操作系统适配特定硬件平台重要的方面,也是最小系统运行最为关键的工作。任务上下文的结构该如何设计、切换的时候应该切换哪些内容,都是跟硬件设计密切相关的问题。在Ti6678中,一共包含了A,B两组各32个32位的通用寄存器,可以作为64个32位寄存器,也可以作为32个64位寄存器,还可以作为16个128位的寄存器,在文章设计的最小系统中将把寄存器看作是64个独立的32位寄存器使用。根据TiC6000的EABI手册,其中A4,A5作为函数调用时的第一个参数寄存器,同时作为函数返回值寄存器,B4,B5为第二个参数寄存器,依次类推,最多可以有传递10个参数。B15作为栈指针SP,据此设计出任务上下文切换结构,如下所示:
将所有的通用寄存器在上下文切换的时候都将进行保存和恢复,保存前驱任务上下文到任务栈中,恢复后继任务的上下文到当前的运行栈。
5 固化运行设计
嵌入式系统最终总是要固化运行的,也是最小化OS适配设计的最后一步。为了最小化设计和具体工作,采用CCS环境中的norwriter6678烧写工程,将最终的操作系统及应用为一体的映像文件烧写到外部存储器接口(External Memory Interface,EMIF)的SPI Flash中,然后拨动跳线至SPI启动,重新上电完成启动。要特别注意,CCS中编译生成的.out文件是不能直接烧写的,必须进行一系列的转化生成符合要求的.dat文件[2],才可以烧写到SPI Flash中。映像文件转换过程如图2所示。
图2 映像文件的转换过程
6 最小OS的验证
按照上述最小化系统的设计,以μC/OS-II操作系统[3]为例,进行功能裁剪和上下文切换的实现。在CCS6.1.3的环境下,将CSL、裁剪后的操作系统源码编译成静态库。然后创建main工程,构建TASK1,TASK2两个测试任务,进行编译、链接,形成可下载运行的main.out,使用Ti官方的6678EVM开发板,Blackhawk XDS560v2-USB仿真器进行加载调试,在CCS的模拟终端循环打印信息,运行结果如图3所示,在固化方式运行时借助LED点灯的方式表明两个任务运行正常。
图3 测试运行结果
7 结语
Ti6678是当前性能最高、使用最为广泛的DSP,也是能够较好支撑操作系统运行的主流DSP。现在已经出现多款DSP操作系统,包括SYS/BIOS,Oseck等,要么比较庞大,要么价格昂贵,文章所述的最小化OS的设计与实现,可实现调试和固化运行,是一个完整的过程,适合于小型系统构建者和DSP学习人员参考和实践,规模小,运行稳定,出现问题易排查。