DSP/BIOS实时操作系统王辉培训内容了解DSP/BIOS操作系统的基本概念了解DSP/BIOS操作系统的模块组成了解DSP/BIOS操作系统的线程类型了解DSP/BIOS操作系统的应用什么是RTOS?RTOS称为实时多任务操作系统(Real-TimeOperatingSystem),是嵌入式应用软件的基础和开发平台,它是一段嵌入在目标代码中的软件,用户的其它应用程序都建立在RTOS之上。RTOS还是一个可靠性和可信性很高的实时内核,将CPU时间、中断、I/O和定时器等资源都包装起来,留给用户一个标准的API接口,并能根据各个任务的优先级,合理地在不同任务之间分配CPU时间。用RTOS有什么好处?RTOS是针对不同处理器优化设计的高效率实时多任务内核。据专家预测,在优秀RTOS上跨处理器平台的程序移植只需要修改1%~5%的内容。它的引入解决了嵌入式软件开发标准化的难题。基于RTOS开发出来的程序具有较高的可移植性,引入RTOS相当于引入了一个新的管理模式,可减少重复劳动,提高知识创新效率。在RTOS基础上可以编写各种硬件驱动程序、专家库函数、行业库函数以及产品库函数,然后可以和通用性的应用程序一起形成产品,促进行业内的知识产权交流。DSP/BIOS概述DSP/BIOS在实质上是一个RTOS内核,它主要是为需要实时调度和同步以及主机/目标系统通信和实时监测的应用而设计的。它提供底层的应用函数接口,可用于支持系统实时分析、线程管理、调度软件中断、周期函数和Idle函数(后台运行函数)以及外部硬件中断与各种外设的管理。DSP/BIOS是CCS提供的一套工具,本身占有极少的资源。使用DSP/BIOS编写代码后,CCS可以提供多种分析和评估代码工具,如图形化显示各个线程占用的CPU时间、代码执行时间统计、显示输出信息等,这时可以很方便地了解系统开销情况。续使用DSP/BIOS开发DSP软件有两个重要特点:一、所有与硬件有关的操作都必须借助DSP/BIOS本身提供的函数完成,开发者应避免直接控制硬件资源,如定时器、DMA控制器、串口、中断等;二、带有DSP/BIOS的程序与传统程序执行有所不同。在传统开发过程中,用户自己的程序完全控制DSP,程序按顺序依次执行;在使用DSP/BIOS后,由DSP/BIOS控制DSP,用户的应用程序建立在DSP/BIOS基础之上。用户的程序也不是按编写依次执行,而是在BIOS的调度下按任务、中断的优先级排队等待执行。BIOS优势所有的DSP/BIOS对象都可以在配置工具中静态建立;实时监测数据在主机端做格式化处理;API函数是模块化的,只有应用程序用到的API模块才会和应用程序链接在一起;为达到最快的运行速度,大部分函数用汇编语言编写;目标处理器和主机分析工具之间的通信在后台空闲循环中完成,这样不会影响应用程序的运行。如果CPU太忙,不能执行后台任务,DSP/BIOS分析工具会停止从目标处理器接收信息。DSP/BIOS组成DSP/BIOS实时内核和API(参见DSPBIOS模块的API函数.doc)DSP/BIOS实时分析工具DSP/BIOS配置工具DSP/BIOS配置工具DSP/BIOS分析工具DSP/BIOS开发程序过程用配置工具建立应用程序要用到的对象;保存配置文件,保存的同时会生成在编译和链接应用程序时所包括的文件;为应用程序编写一个框架,可以使用C、C++、汇编语言或这些语言的任意组合;在CCS环境下编译并链接程序;使用仿真器(或硬件平台原型)和DSP/BIOS分析工具来测试应用程序;重复上述步骤,直至程序调试正确;当正式产品硬件开发好之后,修改配置文件来支持产品硬件并测试。运行时支持库配置工具产生的链接命令文件可以自动生成指令来搜索必要的库文件,包括DSP/BIOS库、RTDX库和运行时支持库。运行时支持库是由rts.src建立的,rts.src包含了所有的运行支持函数。DSP/BIOS库中也定义了一部分存储器管理函数,包括malloc、free、memalign、calloc和realloc函数。因为DSP/BIOS库中包含了与运行时支持库相同的函数,所以DSP/BIOS链接命令文件包含了一个特殊版本的运行时支持库rtsbios,rtsbios不包括以下文件:续:rtbios库中未包括的运行支持函数C54x平台C55x平台C6000平台memory.cautoinit.cboot.cmemory.cboot.cmemory.csystem.cautoinit.cboot.cDSP/BIOS启动序列1)初始化DSP:DSP/BIOS程序从入口点c_int00开始运行,复位中断向量指向c_int00地址;2)用.cinit段中的记录来初始化.bss段;3)调用BIOS_init初始化DSP/BIOS模块:BIOS_init执行基本的模块初始化,然后调用MOD_init宏分别初始化每个用到的模块;4)处理.pinit表:.pinit表包含了初始化函数的指针;5)调用应用程序主程序main函数:在所有DSP/BIOS模块初始化之后,调用main函数。此时硬件中断和软件中断都是禁止的,应用程序可以在这里添加自己的初始化代码;6)调用BIOS_start启动DSP/BIOS:BIOS_start负责使能DSP/BIOS模块并为每一个用到的模块调用MOD_startup宏使其开始工作;7)执行空闲循环:调用IDL_loop引导程序进入DSP/BIOS空闲循环,此时硬件和软件中断可以抢占空闲循环的执行。空闲循环控制着和主机的通信,所以此时主机和目标之间的数据传输就可以开始了。BIOSInstumentationBIOS实时分析工具提供了显示和隐示两种方式进行实时分析;BIOS提供下面4种API函数实现实时监测数据的采集:LOG(事件记录管理器)STS(统计对象管理器)HST(主机通道管理器)TRC(跟踪控制器)显示和隐式监测监测API可以让应用程序显示调用。LOG、STS的API也可被DSP/BIOS内部使用来收集程序执行的信息。这些内部调用提供对程序隐式监测的支持。隐式DSP/BIOS监测执行图(ExecutionGraph)CPU负荷图(CPULoad)硬件中断计数和最大堆栈深度中断次数被记录在STS对象数据结构的count域,如果选择监测堆栈指针,则STS对象的maxvalue域反映了系统堆栈的最大位置。这些信息可以用来判断系统对堆栈的最大需求。监测变量中断响应延迟事件记录管理器(LOG)模块这个模块用来管理LOG对象,可以使用执行图或者通过配置工具建立的LOG对象来获取时间信息。用户定义的记录对象中包含了应用程序调用LOG_event和LOG_printf记录的信息。通常用LOG_printf函数替代标准C语言中的printf函数,以便更快地在CCS中显示需要打印的信息。用户可以在DSP/BIOS分析工具MessageLog窗口中实时观测这些信息。系统记录对象(systemlog)是系统创建配置文件时自动生成的,系统信息可以通过执行图获得,也可以通过MessageLog窗口,查看ExecutionGraphDetails项获得。统计对象管理器(STS模块)统计对象用于记录一个任意32位数据的统计信息,它为每一个统计对象定义了一个数据结构,包括:CountTotalMaximumAverage这些项都可利用StatisticsVies工具观察。续:STS模块在DSP目标系统上,STS模块不断更新统计数据,但受到目标系统存储空间的限制,统计数据是以32位精度累计的。但在主机上,统计数据则是以64位精度累计的。当主机从目标系统上读取实时统计数据后,目标系统上的统计数据会进行复位,主机则保持统计数据的累加。这样,可以减小目标系统的存储空间需求并可以进行长时间的记录。跟踪管理器(TRC)TRC模块管理着一系列统计跟踪打开或关闭的控制位。这些控制位能通过事件日志(LOG)和统计累加器(STS)完成对程序信息的实时捕捉。显示检测控制if(TRC_query(TRC_USER0)==0){’LOGorSTSopertaion’}TRC_query函数用于监测对应的跟踪屏蔽位是否被设置。若屏蔽位设置则返回0,执行以上代码将只花费几条指令,对程序的影响是很小的。如果程序空间允许,可以在最终产品中保留这部分代码以便于现场测试。对隐式检测控制TRC通过一系列的跟踪屏蔽位来控制记录对象和统计对象对隐式监测数据的采集。目标系统只在使能跟踪时才保存记录或统计信息,以最大程度提高效率;屏蔽位对于LOG_printf、LOG_envent、STS_add等显示调用不起作用;所有目标代码对屏蔽位的改动都反映在主机上的RTA控制面板上。所有的跟踪常量都可直接使用TRC_enable、TRC_disable来允许或禁止跟踪屏蔽位。DSP/BIOS里的线程概述:许多实时DSP应用都需要同时执行许多不相关的功能,这些功能一般是对外部事件的响应,称为线程。不同系统对线程定义不同,在DSP/BIOS中将线程定义为任何独立的指令流。DSP/BIOS系统使应用程序按线程结构化设计,每个线程完成一个模块化的功能。多线程程序中允许高优先级线程抢占低优先级线程以及线程间的同步和通信。DSP/BIOS线程类型按从高到低的优先级分类,线程类型有以下几种:硬中断HWIspecial:CLK函数也属于HWI;软中断SWIspecial:PRD函数也属于SWI任务TSK后台线程IDL各种线程类型特点见各种线程类型的特点和比较.doc线程选用的原则对线程选用原则应基于以下几点:这个线程是否具有严格的实时性?(线程必须在严格的时间段内结束,以及不允许抢占)该线程执行时间相对其它部分来说是否少许多?1、严格的实时性若线程执行需要严格的实时性,而线程的执行时间又比较短,可以选用硬件中断HWI或时钟中断CLK;DSP内部TIMER2、部分实时性一部分线程执行要求有严格的实时性,其余部分执行时间太长且对处理时间没有太多要求,这时,仅仅用HWI显然是不理想的。一般情况下,要求严格实时性的处理都是由硬件中断触发,所以会使用硬件中断服务程序响应此类中断,以满足实时性要求。更为通用的做法是,增加SWI软件中断或TSK任务线程来完成一些非实时性的任务处理。续我们可将代码分为多个线程,只要求有严格实时性的处理任务放到HWI硬件中断中完成,其余处理都放到SWI或TSK中完成。这些线程都具有如下特点:1)能完成实时处理任务,但运行处理时间相对较长;2)允许被其它线程抢先;任务线程与软件中断的区别任务在执行时可以被挂起,直到条件(例如数据准备好、信号同步等)得到满足,才可以继续运行。在任务被挂起时,即任务处于暂停或阻塞(Blocked)状态,其它任务线程得到执行,而软件中断做不到这点;DSP/BIOS内部提供了一组用于任务间通信和同步的内部结构,包括旗语、邮箱、队列和资源锁。而这些数据结构无法用于软件中断的同步和通信;每个任务都有自己的堆栈区,而软件中断使用共享的系统堆栈;当任务被创建、删除、退出或切换时,都可用调用特殊函数(钩子函数),这些钩子函数可以用于保存任务的环境而不仅仅是CPU寄存器;任务线程的优先级比软件中断低,而比后台IDL线程高。任务内部又被划分为16个优先级,其中0级内核保留给LOOP循环使用,用户可使用1-15优先级;周期性服务特殊应用:需要周期性地处理某类任务,且处理间隔比处理任务所需的时间要长得多。对于这种要求,建议使用DSP/BIOSPRD周期函数来完成。周期性函数属于软件中断中的PRD_swi对象。所有的周期性函数具有同样的SWI软件中断优先级,因此一个周期函数是不能抢先其它周期函数的。为了保证所有PRD函数正常运行,除了尽量缩短周期函数本身的处理时间外,还需要提高整个PRD函数的优先级,以保证周期函数在系统