DSP_BIOS实时操作系统介绍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DSP/BIOS实时操作系统介绍
DSP/BIOS是一个简易的嵌入式操作系统,主要是为需要实时调度、同步以及主机-目标系统通讯和实时监测的应用而设计的。
DSP/BIOS集成在CCS中,不需要额外的费用,但不提供源码,它是 TI公司倡导的 eXpressDSP 技术的重要组成部分。
DSP/BIOS本身只占用很少的资源,而且是可裁减的,它只把直接或间接调用的模块和API连接到目标文件中,最多为6500字,因此在多数应用中是可以接受的。
它提供底层的应用程序接口,支持系统实时分析、线程管理、调用软件中断、周期函数与后台运行函数(idel函数)以及外部硬件中断与多种外设的管理。
利用DSP/BIOS编写代码,借助CCS提供的多种分析与评估工具,如代码执行时间统计、显示输出、各线程占用CPU的时间统计等,可以直观地了解各部分代码的运行开销,高效地调试实时应用程序,缩短软件开发时间,而且DSP/BIOS是构建于已被证实为有效的技术之上的,创建的应用程序稳定性好,软件标准化程度高,可重复使用,这也减少了软件的维护费用。
DSP/BIOS组件由以下3部分组成:
1. DSP/BIOS实时多任务内核与API函数
使用DSP/BIOS开发程序主要就是通过调用DSP/BIOS实时库中的API(应用程序接口)函数来实现的。
所有API都提供C语言程序调用接口,只要遵从C语言的调用约定,汇编代码也可以调用DSP/BIOS API。
DSP/BIOS API被分为多个模块,根据应用程序模块的配置和使用情况的不同,DSP/BIOS API函数代码长度从500字到6500字不等。
CCS FOR C6000 V2。
2提供的DSP/BIOS主要的API模块包括以下几种:CLK模块、HST模块、HWI模块、IDL模块、LOG模块、MEM模块、PIP模块、PRD模块、RTDX模块、STS模块、SWI模块、DEC模块、SIO模块、MBX模块、QUE模块与SEM模块。
2. DSP/BIOS配置工具
基于DSP/BIOS的程序都需要一个DSP/BIOS的配置文件,其扩展名为.CDB。
DSP/BIOS配置工具有一个类似Windows资源管理器的界面,它主要有两个功能:
* 在运行时设置DSP/BIOS库使用的一系列参数;
* 静态创建被DSP应用程序调用的DSP/BIOS API函数所使用的运行对象,这些对象包括软件中断、任务、周期函数及事件日志等。
3. DSP/BIOS实时分析工具
DSP/BIOS分析工具可以辅助CCS环境实现程序的实时调试,以可视化的方式观察程序的性能,并且不影响应用程序的运行。
通过CCS下的DSP/BIOS工具控制面板可以选择多个实时分析工具,包括CPU负荷图、程序模块执行状态图、主机通道控制、信息显示窗口、状态统计窗口等。
与传统的调试方法不同的是,程序的实时分析要求在目标处理器上运行监测代码,使DSP/BIOS的API和对象可以自动监测目标处理器,实时采集信息并通过CCS分析工具上传到主机。
实时分析包括:程序跟踪、性能监测和文件服务等。
三基于DSP/BIOS的程序开发
基于DSP/BIOS的程序开发是交互式的可反复的开发模式[参考文献6、7、8],开发者可以方便地修改线程的优先级和类型,首先生成基本框架,添加算法之前给程序加上一个仿真的运算负荷进行测试,看是否满足时序要求,然后再添加具体的算法实现代码。
使用DSP/BIOS开发软件需要注意两点:
* 所有与硬件相关的操作都需要借助DSP/BIOS本身提供的函数完成,开发者要避免直接控制硬件资源,如定时器、DMA控制器、串口、中断等;
* 基于DSP/BIOS的程序运行与传统的程序有所不同,传统编写的DSP程序完全控制DSP,程序依次执行,而基于DSP/BIOS的程序,由DSP/BIOS程序控制DSP,用户程序不是顺序执行,而是在DSP/BIOS的调度下按任务、中断的优先级等待执行。
1. 基于DSP/BIOS的程序开发流程
下面以数字图像边缘检测(采用sobel算法)为例,具体分析一下DSP/BIOS程序的编写流程,程序的流程图见图2。
基于DSP/BIOS的程序开发流程一般包括以下几个步骤:
* 利用配置工具设置环境参数并静态建立应用程序要用到的对象。
要注意的是,在配置工具下创建对象为静态创建,对象是不可以删除的,利用xxx_create可以动态创建对象,并可以用xxx_delete删除动态创建的对象(xxx表示模块名字,如TSK)。
本程序中,在MEM模块设置片内ISRAM、片外SDRAM的起始地址与长度以及heap的大小,在LOG模块创建事件记录对象用来记录程序的运行情况,在TASK模块创建三个任务进程(Input Task、Process Task、Output Task),并在SEM模块创建旗语对象来进行线程之间的通信,在DEV模块配置所需的外设,这里包括视频采集端口VP0和视频输出端口VP2。
* 保存配置文件,保存配置文件时,配置工具自动生成匹配当前配置的汇编源文件和头文件以及一个连接命令文件。
* 为应用程序编写一个框架,可以使用C、汇编语言或C与汇编的混合语言来编程,由于目前C++的编译效率还比较低,在数字图像处理应用中一般不采用C++编程。
在CCS环境下编译并连接程序,添加program.cdb和programcfg.cmd到项目工程文件中,其他的文件自动连接进应用程序。
如果用户想使用自己的连接命令文件,则需要在自己的命令文件的第一行包含语句“-l programcfg.cmd”。
* 使用仿真器和DSP/BIOS分析工具来测试应用程序,本程序中使用XDS510PP并口仿真器通过JTAG口连接DM642 EVM与PC机进行调试;
* 重复上述步骤直至程序运行正确。
在实际产品开发过程中,当正式产品硬件开发好后,修改配置文件来支持产品硬件并测试。
2. DSP/BIOS程序的启动过程
DSP/BIOS的启动过程包括以下几步:
* 初始化DSP:复位中断向量指向c_int00地址,DSP/BIOS程序从入口点c_int00开始运行。
对C6000,初试化堆栈指针(B15)和全局页指针(B14)分别指向堆栈底部与.bss段的开始,控制寄存器AMR、IER和CSR也被初始化;
* 用.cinit段中的记录来初始化.bss段;
* 调用BIOS_init初始化DSP/BIOS模块:BIOS_init执行基本的模块初始化,然后调用MOD_init宏分别初始化每个用到的模块;
* 处理.pinit表:.pinit表包含了初始化函数的指针;
* 调用应用程序main函数:在所有DSP/BIOS模块初始化之后,调用main函数。
由图2可以看到,本程序在main函数中添加了必要的初始化代码。
Main函数初始化之后CPU的控制权交给DSP/BIOS。
需注意,main函数中一定不能存在无限循环,否则整个DSP/BIOS程序将瘫痪;
* 调用BIOS_start启动DSP/BIOS:BIOS_start函数是由配置工具产生的,包含在programcfg.s62文件中,它负责使能DSP/BIOS模块并为每个用到的模块调用MOD_startup宏使其开始工作。
在这些工作完成之后,DSP/BIOS调用IDL_loop引导程序进入DSP/BIOS空闲循环,此时硬件和软件中断可以抢先空闲循环的执行,主机也可以和目标系统之间开始数据传输。
由图2可以看到,main 函数之后Input Task、Process Task、Output Task三个进程开始执行,此三个进程为同一优先级,进程之间利用旗语(SEM)进行通信,协调线程之间的工作,Input Task完成视频采集功能,Output Task 实现视频输出功能,在Process Task线程中调用Image Lib中的IMG_sobel()函数实现边缘检测功能。
四实验结果与分析
为了统计sobel边缘检测所用的时间,在STS模块创建对象sts,然后在IMG_sobel()函数前后分别添加STS_set(&sts,CLK_gethtime()),STS_delta(&sts,CLK_gethtime())。
实验中从统计窗得到IMG_sobel()的运行时间为554100.48个指令周期,约为0.93ms(DSP芯片时钟为600MHz)。
由于视频采集为PAL制,两帧间隔为40ms,所以可以实时地检测到物体边缘。