软件开发实用.pptx
软件开发软件基础汇编语言C语言程序定位软件架构CSLBSL库BIOSDDK信号处理库算法标准DAIS参考架构Reference Framwork软件开发实例SEED-VPM642视频监控软件开发方法第1页/共67页软件开发基础组成:由代码和数据组成运行:要运行的程序其代码和数据必须存放在可由CPU寻址的存储空间存放:以代码块和数据块的形式存放代码块和数据块是程序的最小单元一个代码块或数据块在存储空间中连续、顺序存放不同的代码块或数据块,可以存放于不同的存储空间中定位:编译时定位:MCU系统采用v编程时由ORG语句确定代码块和数据块的绝对地址v编译器以此地址为首地址,连续、顺序地存放该代码块或数据块链接时定位:DSP系统采用v编程时由“SECTION”伪指令,以区分不同的代码块或数据块v编译器每遇到一个“SECTION”伪指令,从0地址重新开始一个代码块或数据块v链接器将同名的“SECTION”合并,并按.cmd文件中的“SECTION”命令进行实际的定位加载时定位:PC机系统采用v编程、编译和链接时均未对程序进行绝对定位v程序运行前,由操作系统对程序进行重定位,并加载到存储空间中程序是什么?第2页/共67页软件开发基础程序定位方式的比较编译时定位:ORG xxxx,绝对定位优点:简单、容易上手 缺点:程序员必须熟悉 硬件资源 模块化编程差 工程化不支持链接时定位:SECTION,相对定位缺点:灵活、上手较难 优点:程序员不必熟悉 硬件资源 模块化编程强 工程化管理支持加载时定位:编译、链接时,相对定位缺点:必须要有操作系 统支持 优点:模块化编程强 工程化管理支持第3页/共67页软件开发基础DSP汇编程序基础Section(“段”)概念:一块连续的储存空间,用于存放代码块或数据块在编程时,“段”没有绝对定位,每个“段”都认为是从0地址开始的一块连续的储存空间,所以软件开发人员只需要将不同代码块和数据块放到不同的“段”中,而无需关心这些“段”究竟定位于系统何处优点:便于程序的模块化编程;便于工程化管理:可将软件开发人员和硬件开发人员基本上分离开重定位:由于所有的“段”都是从0地址开始,所以程序编译完成后无法直接运行的,要让程序正确运行,必须对“段”进行重新定位,这个工作由链接器完成.cmd文件:MEMORY命令描述系统硬件资源,SECTIONS命令描述软件人员程序中用到的“段”如何定位到恰当的硬件资源上第4页/共67页软件开发基础DSP汇编语言:SECTION伪指令5个SECTION伪指令 .bsssymbol,size in word .text .data .sect“section name”symbol .usect“section name”,size in word其中symbol相当于变量名,size in word保留的存储单元长度(以字为单位)初试化段和未初始化段.bss和.usect为未初始化段,用于为变量、堆栈等保留一块存储空间.text、.data和.sect为初试化段,用于存放代码块或有初值的数据块系统定义的段和用户定义的段.text、.data和.bss为系统已定义好的段名用户根据需要用.sect和.usect伪指令来定义段名,创建相应的“段”汇编程序中,程序员用“段”伪指令来组织程序的代码和数据第5页/共67页DSP汇编语言:汇编器对“段”的处理汇编器第一次遇到新“段”时,将该“段”的段程序计数器(SPC)置为0,并将随后的程序代码或数据顺序编译进该“段”中汇编器遇到同名“段”时,将它们合并,然后将随后的程序代码或数据顺序编译进该“段”中当汇编器遇到.text、.data和.sect伪指令时,汇编器停止将随后的程序代码或数据顺序编译进当前“段”中,而是顺序编译进遇到的“段”中当汇编器遇到.bss和.usect伪指令时,汇编器并不结束当前“段”,而只是简单地暂时脱离当前“段”,随后的程序代码或数据仍将顺序编译进当前“段”中。.bss和.usect伪指令,可以出现在.text、.data或.sect“段”中的任何位置,它们不会影响这些“段”的内容软件开发基础第6页/共67页DSP汇编语言:链接器对“段”的处理链接器对“段”的处理有2个方面:将输入“段”组合产生输出“段”v将多个.obj文件中的同名“段”合并一个输出“段”v也可将不同名的“段”合并产生一个输出“段”将输出“段”定位到实际的存储空间中vMEMORY命令:用于描述系统实际的硬件资源vSECTIONS命令:用于描述程序中定义了哪些“段”,这些“段”是否需要合并?如何合并?合并产生的输出“段”定位到实际硬件资源的何处?链接器通过.cmd文件来获得上述这些信息链接器还将检查各输出“段”是否重叠、是否超界,避免了人工检查边界带来的隐患软件开发基础第7页/共67页.cmd文件由3部分组成:输入输出定义:这一部分,可通过CCS的“Build Options”菜单设置v.obj文件:链接器要链接的目标文件v.lib文件:链接器要链接的库文件v.map文件:链接器生成的交叉索引文件v.out文件:链接器生成的可执行代码v链接器选项MEMORY命令:描述系统实际的硬件资源SECTIONS命令:描述“段”如何定位软件开发基础第8页/共67页用MEMORY命令描述目标系统的存储空间软件开发基础MEMORY PAGE 0:PRAM:origin=0 x0080,length=0 x1080VECT:origin=0 x2000,length=0 x0040EXPRAM:origin=0 x4000,length=0 xC000PAGE 1:STACK:origin=0 x2040,length=0 x0FC0DRAM:origin=0 x3000,length=0 x1000EXDRAM:origin=0 x4000,length=0 xC000MEMORY DirectivePAGE optionsnamesoriginsLengths第9页/共67页用SECTIONS命令描述“段”如何定位软件开发基础SECTIONS.vectors VECT PAGE 0.text PRAM PAGE 0.data PRAM PAGE 0.bss DRAM PAGE 1.stack STACK PAGE1第10页/共67页MEMORY PAGE 0:PRAM:origin=0 x0080,length=0 x1080VECT:origin=0 x2000,length=0 x0040EXPRAM:origin=0 x4000,length=0 xC000PAGE 1:STACK:origin=0 x2040,length=0 x0FC0DRAM:origin=0 x3000,length=0 x1000EXDRAM:origin=0 x4000,length=0 xC000SECTIONS.vectors VECTPAGE 0.text PRAMPAGE 0.data PRAMPAGE 0.bss DRAMPAGE 1.stack STACKPAGE1VC5402 DSP系统.cmd例子软件开发基础第11页/共67页软件开发基础DSP C语言:C运行环境(1)存储模型:C程序的代码和数据如何定位系统定义v.cinit存放C程序中的变量初值和常量v.const存放C程序中的字符常量、浮点常量和用const声明的常量v.switch存放C程序中switch语句的跳转地址表v.text存放C程序的代码v.bss为C程序中的全局和静态变量保留存储空间v.far为C程序中用far声明的全局和静态变量保留空间v.stack为C程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果v.sysmem用于C程序中malloc、calloc和realloc函数动态分配存储空间用户定义v#pragma CODE_SECTION(symbol,section name)v#pragma DATA_SECTION(symbol,section name)第12页/共67页软件开发基础DSP C语言:C运行环境(2)寄存器使用规则C编译器如何使用DSP的寄存器函数进入和返回前,寄存器的保护函数调用规则函数间的参数传递通过寄存器和系统堆栈进行调用函数与被调用函数必须对各自的寄存器进行保护从被调用函数返回前,被调用函数必须归还所有已占用的堆栈空间C和ASM混合编程C和ASM混合编程时,必须遵循寄存器使用规则和函数调用规则被C调用的ASM函数,其函数名前应加“_”中断服务程序ASM编写的中断服务程序必须对所有用到寄存器进行保护,以免破坏C运行环境C编写的中断服务程序应用interrupt关键字声明第13页/共67页软件开发基础DSP C语言:C运行环境(3)系统初始化在运行C程序前,必须建立C运行环境,此任务由C引导程序_c_int00完成_c_int00包含在库函数中,build时自动将其链接进可执行程序中,程序的入口地址必须设为_c_int00起始地址_c_int00的源程序存放在由rts.src分离出来的boot.asm中,用户可根据需要修改v设置堆栈指针v初始化全局变量:将.cinit”段“中数据拷贝到.bss”段“中v调用C程序的主函数main()不同系列的DSP,其C编译器对C运行环境的处理略有不同,具体参考各自的Optimizing C Compiler Users Guide第14页/共67页软件开发基础软件build流程.CPP file.ASM file.C file.ASM file.ASM file.OBJ fileAssembler.OBJ file.OBJ file.OUT file.HEX fileLinker目标文件地址是浮动的,能被重定位链接器用.cmd文件对链接目标,进行重定位列出目标文件、库文件和链接器选项用MEMORY命令描述目标系统存储空间配置用SECTIONS命令描述“段”如何定位Hex转换程序也使用.cmd文件,配置转换选项第15页/共67页软件开发平台传统软件开发方法用ASM或ASM和C混合编程,从零开始编写硬件资源头文件DSP片内寄存器资源头文件v描述片内寄存器地址v描述片内寄存器控制状态位域板上资源头文件v描述片外外设寄存器地址v描述片外外设寄存器控制状态位域编写应用专用的外设驱动程序片内片外外设初试化程序片内片外外设操作程序编写应用专用的算法编写主控程序顺序、循环执行第16页/共67页软件开发平台TI免费提供的基础软件CSL库:Chip Support Library芯片支持库定义DSP片内外设资源,实现片内外设基本操作DDK:Driver Development Kit 设备驱动程序开发包设计标准的设备驱动程序模型,方便开发新的设备驱动程序DSPLIBIMGLIB:Signal Processing Library数学运算、矩阵运算、FFT、滤波、卷积、相关等信号处理函数压缩、分析、滤波和格式转换等图像视频处理函数DSP/BIOS:嵌入式实时、多任务操作系统实时、多任务内核实时分析Reference Frameworks:程序参考架构C程序初试骨架,通过其可以迅速创建特定的应用程序XDAIS:DSP Algorithm Standard,DSP算法标准规定一系列算法编程规则,遵循这些规则的算法,可以相互调用第17页/共67页软件开发平台TI倡导的DSP软件架构User ApplicationTarget BoardDSPCSLDSP/BIOSKernel/Scheduler DriverSignal Processing LibraryTimerMcBSPEMIFCPUTMS320 DSP Algorithm StandardReference Framework第18页/共67页软件开发平台DSP/BIOS:功能抢先型实时、多任务操作系统内核基于优先级的、抢先型实时调度程序支持多线程管理与调度支持4种线程类型:HWI、SWI、TSK、IDL支持3种作业间的通信方式:Mailboxes、Semaphores、Queues支持周期函数,方便实现固定时间间隔的数据采集,简化多速率系统的设计提供存储器管理,实现动态存储器分配实时分析模块分析信息实时获取、传输和显示,为早期的系统级排错提供帮助DSP/BIOS模块中内含分析信息的实时获取功能分析信息的实时传输由RTDX(Real-Time Data Exchange)技术实现,完成目标DSP与主机之间的实时通信,C6000 RTDX的带宽为20KByte,RTDX是在idle作业期间完成,所以对程序执行速度的影响最小主机可以显示:事件记录、线程执行顺序、执行次数的最大值或平均值和总的CPU负载等信息第19页/共67页软件开发平台DSP/BIOS:使用为了方便使用,TI提供一个可视化的配置工具,用于配置实际系统中所需的DSP/BIOS模块DSP/BIOS是可裁剪的,只有被应用程序使用的模块才会被链接到应用程序中DSP/BIOS开销小:代码大小:1K WordsCPU占用:1MIPSDSP/BIOS采用标准的API,所以不同系列DSP之间的移植容易DSP/BIOS集成在CCS中,无需使用许可费 第20页/共67页软件开发平台CSL为什么要设计CSLDSP片上外设种类及其应用日趋复杂提供一组标准的方法用于访问和控制片上外设免除用户编写配置和控制片上外设所必需的定义和代码什么是CSL:Chip Support Library用于配置、控制和管理DSP片上外设已为C6000和C5000系列DSP设计了各自的CSL库CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化CSL库是可裁剪的:即只有被使用的CSL模块才会包含进应用程序中CSL库是可扩展的:每个片上外设的API相互独立,增加新的API,对其他片上外设没有影响第21页/共67页软件开发平台CSL:片上外设C6000 DSP ModulesCACHECHIPDATDMAEMIF-EMIFA-EMIFBGPIOHPIIRQMCBSPPCIPWRTCPTIMERUTOP(UTOPIA)VCPXBUSC55x DSP ModulesADCCHIPDATDMAEMIFGPIOIRQI2CMCBSPPLLPWRRTCUSBWDTIMC54x DSP ModulesCHIPDAADATDMAEBUSGPIOHPIIRQMCBSPPLLPWRUARTWDTIM第22页/共67页软件开发平台CSL:特点片上外设编程的标准协议:定义一组标准的APIs:函数、数据类型、宏对硬件进行抽象,提取符号化的片上外设描述定义一组宏,用于访问和建立寄存器及其域值基本的资源管理对多资源的片上外设进行管理已集成到DSP/BIOS中通过图形用户接口GUI对CSL进行配置使片上外设容易使用缩短开发时间,增加可移植性第23页/共67页软件开发平台DDK(Driver Development Kit)TI提供DDK的目的标准的设备驱动程序模型,用户无需从零开始编写设备驱动程序设备驱动程序模型(IOM)将设备驱动程序分为2个部分v与设备相关的:“迷你”驱动程序(mini-driver)v与设备无关的:“类”驱动程序(class-driver)“类”驱动程序v设备驱动程序的上层抽象,使其与特定设备无关,为应用程序提供通用的接口v3大类“类”驱动程序:SIO、PIP和GIOvSIO:流I/O接口,由SIO和DIO组成,DIO负责缓冲器管理、信号同步以及底层“迷你”驱动程序接口vPIP:管道接口,有PIP和PIO组成,PIO负责缓冲器管理、信号同步以及底层“迷你”驱动程序接口vGIO:通用I/O,允许进行块读块写,可以用其新的用户驱动程序“迷你”驱动程序v设备驱动程序的底层抽象,与特定设备有关,对硬件设备进行实际操作,DDK规定一组标准的API,函数体由用户根据实际硬件设备编写DDK是在CSL基础上对外设I/O进行更高层次的抽象TI免费提供DDK的源代码、库及相关文档,可从TI网站上免费下载第24页/共67页软件开发平台设备驱动程序模型第25页/共67页软件开发平台Signal Processing Library(1)C6000系列DSP基本的信号处理库DSPLIB:提供数学运算、矩阵运算、FFT、滤波、卷积等常用的信号处理函数vTMS320C62x DSPLIB:专门为C62x系列DSP进行优化vTMS320C67x DSPLIB:专门为C67x系列DSP进行优化vTMS320C64x DSPLIB:专门为C64x系列DSP进行优化FastRTS:提供快速的单精度双精度浮点数学运算和转换函数vTMS320C62xC64x FastRTS:专门为C62xC64x系列DSP进行优化vTMS320C67x FastRTS:专门为C67x系列DSP进行优化IMGLIB:提供压缩、分析、滤波和格式转换等常用的图像视频处理函数vTMS320C62x IMGLIB:专门为C62x系列DSP进行优化vTMS320C64x IMGLIB:专门为C64x系列DSP进行优化C5000系列DSP基本的信号处理库DSPLIB:提供数学运算、矩阵运算、FFT、滤波、卷积等常用的信号处理函数vTMS320C54x DSPLIB:专门为C54x系列DSP进行优化vTMS320C55x DSPLIB:专门为C55x系列DSP进行优化IMGLIB:提供压缩、分析、滤波和格式转换等常用的图像视频处理函数vTMS320C55x IMGLIB:专门为C55x系列DSP进行优化第26页/共67页软件开发平台Signal Processing Library(2)C2000系列DSP基本的信号处理库提供定点数学运算、FFT、滤波、信号发生等常用的信号处理函数vTMS320C24x:专门为C24x系列DSP进行优化vTMS320C28x:专门为C28x系列DSP进行优化所有函数均为C可调用,并在汇编级上进行优化TI免费提供信号处理函数库的源代码、库及相关文档,可从TI网站上免费下载第27页/共67页软件开发平台DSP Algorithm Standard(XDAIS)制定XDAIS的目的DSP软件系统日趋复杂,算法由专业公司、专业人员开发算法提供者和算法使用者分离为了使二者协调工作,必须定义一组通用的编程规则和指导方针,以及一组编程接口即使算法使用者和提供者相同,但只要符合XDAIS算法标准,则这些算法可以用到不同的项目中,使算法具有良好的继承性如何开发符合标准的算法TI提供一组工具vComponent Wizard Control:超级向导,帮助你快速、精确地将你的算法封装为符合XDAIS标准的算法vQuaiTI:测试工具,用于快速、有效地测试算法是否符合XDAIS标准vDOSA:自动优化工具,当算法用于静态环境时,删除算法中不必要的部分 TI免费提供XDAIS开发套件,可从TI网站上免费下载第28页/共67页软件开发平台Reference Framework(1)TI提供软件参考架构的目的DSP系统日趋复杂v包含多个算法(如:同时包含音频算法和视频算法)v同一个算法可能需要多道运行(如:对多个视频流进行处理)v不同算法或通道所需的数据或帧率可能不同(如:音频帧和视频帧帧率不同)v某些DSP硬件系统的存储容量有限(如:C54x系统)v软件对象可能需要动态地创建和删除,导致存储器需要进行动态管理v硬件系统可能为由DSP和通用处理器构成的双处理器系统TI精选一些通用的模块,构成软件参考架构让你将精力集中于系统的特定应用方面 TI根据系统的复杂程度已提供3个软件参考架构RF1:小型系统,主要用于由C54x和C55x实现的低端系统RF3:中型系统,主要用于由C54x和C55x实现的高端系统和C6x实现的低端系统RF5:大型系统,主要用于由C6x实现的高端系统第29页/共67页软件开发平台Reference Framework(2)TI免费提供RF1、RF3和RF5,可从TI网站上免费下载第30页/共67页eXpressDSPTM Software TechnologyStandards for application interoperabilityReusable,modular software and supportPowerful,integrated development toolsScalable,real-time software foundation400+third partiesOnline access to third party products via TIs web siteC55x compiler optimizes greater than 70%of hand-coded assembly More than 10,000 C5000TM DSP Code Composer StudioTM developers todayMore than 300 eXpressDSPTM-compliant algorithms availablePre-emptive schedulerReal-time analysisVery low overheadTI DSPThird-Party NetworkDSP/BIOSTMS320TM DSPAlgorithmStandardCodeComposerStudio加速用户产品开发软件开发平台第31页/共67页SEED-VPM642视频监控软件设计实例概述:软件架构应用程序应用程序参考架构参考架构RF 5RF 5TCP/IPTCP/IP协议栈协议栈CSL/BSLCSL/BSL视频音频算法视频音频算法外设驱动程序外设驱动程序DSP/BIOSDSP/BIOS第32页/共67页SEED-VPM642视频监控软件设计实例概述:CSLBSLDM642芯片支持库(CSL)对DM642片上外设进行硬件级抽象和封装对DM642片上外设的所有访问,均通过CSL库中C可调用的API函数进行这些标准的C可调用的函数和宏适用于C6000系列DSP的所有器件,方便不同器件间的移植EDMA资源管理:EDMA中断调度程序、EDMA传输完成码(TCC)分配、和EDMA参数RAM分配SEED-VPM642板卡支持库(BSL)对DM642片外外设(如:视频编解码器、音频编解码器、UART、数字I/O等)进行硬件级抽象和封装对DM642片外外设的所有访问,均通过BSL库中C可调用的API函数进行第33页/共67页SEED-VPM642视频监控软件设计实例SEED-VPM642 BSLModulePurpose模板配置通用的模板初始化音频编解码器Codec 访问AIC23音频编解码器视频解码器 访问TVP5150视频解码器视频编码器访问SAA7121视频编码器Flash编程和擦除FlashEEPROM+RTC通过IIC总线来访问EEPROM+RTC异步串口访问TL16C752B异步串口IDE硬盘接口 IDE硬盘接口寄存器配置数字I/O访问数字I/O第34页/共67页SEED-VPM642视频监控软件设计实例DSP/BIOS调度采用任务型(Task)线程,而非软件中断型(SWI)线程用任务型(Task)线程的原因是外设驱动程序和TCP/IP网络协议栈的要求任务可被“阻塞”,每个任务均有自己的栈空间,这样可以在不同的应用程序中“复制”存储器管理DSP/BIOS存储器管理器可对多个堆进行管理小而快速的片内存储器堆主要被用来作为数据在被算法处理前的临时的乒乓缓冲器大而慢速的片外堆则被用来作为视频帧缓冲器和TCP/IP数据包缓冲器用第35页/共67页SEED-VPM642视频监控软件设计实例设备驱动程序DDK驱动程序模型二层模型:类驱动程序迷你驱动程序类驱动程序:SIOPIPGIO迷你驱动程序:IOMGIO和SIO二种类驱动程序之比较FVID APIs用于帧视频驱动程序兼容IOM的SEED-VPM642驱动程序视频采集视频显示音频UARTPCI编程考虑IOM迷你驱动程序总是与GIO和或SIO配合工作吗?第36页/共67页SEED-VPM642视频监控软件设计实例参考架构RF5RF5RF5DeviceDeviceDriversDriversDSP/BIOSDSP/BIOS第37页/共67页SEED-VPM642视频监控软件设计实例参考架构RF5参考架构对象CHAN:通道管理ICELL:单元封装ICC:内埋单元通信ALGRF:xDAIS标准算法的创建和删除SSCR:共享临时模块SCOM:同步通信模块UTL:实用模块设备驱动程序对象DIO:流设备适配器IOM迷你驱动程序:设备层I/ODSP/BIOS对象TSK:任务模块SEM:信号灯QUE:队列LOG:程序运行信息记录STS:程序运行统计信息MBX:邮箱MEM:存储器管理SIO:流I/OHWI:硬件中断管理CSL:芯片支持库第38页/共67页SEED-VPM642视频监控软件设计实例参考架构RF5RF-5大多数DSP应用程序中均需要的一组公用的模块为什么使用RF-5开放源代码,无需使用费,并且TI专门有一小组提供全面技术支持CHAN模块用于对xDAIS标准算法进行初始化、实例化、及执行算法SCOM模块用于内部任务进行通信UTL模块用于诸如错误报告、收集统计信息等调试工作RF-5的特点共享临时缓冲器管理(SSCR模块隐藏在CHAN模块下)准静态算法实例化第39页/共67页SEED-VPM642视频监控软件设计实例简单的视频系统功能框图DSPVideo PortEDMADecoder摄像头Video PortEDMAEncoder显示器CPU 视频采集驱动程序视频采集驱动程序视频显示驱动程序视频显示驱动程序视频解码器从摄像头采集视频数据,而视频编码器输出视频数据给显示器2个驱动程序将必需的输入输出硬件进行封装(采集和显示)按照视频口的使用情况,驱动程序决定使用整个视频口,还是使用视频口的一半(A通道或B通道)第40页/共67页SEED-VPM642视频监控软件设计实例非驱动程序结构的视频采集应用程序通过一个中断服务程序从硬件解码器获得视频数据缓冲器没有定义如何管理数据缓冲器应用程序与硬件的接口随硬件而定应用程序与特定的硬件相关联,极大地限制了应用程序的可移植性应用程序视频口EDMAHWIinitDecoderinitVPinitEdmainitEdmaHwiinitVpHwiedmaISRvpISR解码器第41页/共67页SEED-VPM642视频监控软件设计实例驱动程序结构的视频采集驱动程序使应用程序与硬件之间的接口标准化采用FVID(帧视频驱动程序)作为缓冲器管理器应用程序编程者仅需知道如何接口FVID,无需知道连接的是什么样的硬件所以,硬件改变时,无需修改应用程序(仅需修改工程中包含的IOM)因此,驱动程序将应用程序与硬件细节隔离开IOM(driver)AppVideo PortEDMAinitDecoderinitVPinitEdmainitEdmaHwiinitVpHwiHWIFVID(GIO)edmaISRvpISRDecoder第42页/共67页SEED-VPM642视频监控软件设计实例为什么要用驱动程序所有的I/O设备均采用通用的接口应用程序使用一组统一的API来接口不同的设备将应用程序与设备操作的细节隔离开当更换设备时,可使应用程序的修动最小代码的维护性和可移植性得于改善应用程序与设备之间的接口标准化将接口代码层次化,当移植应用程序时,通常仅需修改最底层的接口可使代码重复使用一旦编写完成,可以反复使用ApplicationReadbufferA/DDevice Driver第43页/共67页SEED-VPM642视频监控软件设计实例驱动程序中包含什么?抽象一组通用的函数对应于一组硬件专用的功能公用的一组数据对象定义一套方法缓冲器管理缓冲器的大小缓冲器的个数缓冲器的操作同步:是指数据就绪时,应用程序与驱动程序之间的配合阻塞:通过阻塞线程的执行来与应用程序同步非阻塞:通过回调函数来与应用程序同步ApplicationReadbufferA/DDevice Driver第44页/共67页SEED-VPM642视频监控软件设计实例2层模型的驱动程序抽象一组通用的函数对应于一组硬件专用的功能公用的一组数据对象定义一套方法缓冲器管理缓冲器的大小缓冲器的个数缓冲器的操作同步阻塞(Task)带回调函数的非阻塞(SWI)驱动驱动程序(分层2层)类设备驱动程序硬件所需的专用函数组外设初始化外设各项设置的实际函数迷你设备驱动程序应用程序公用的需求缓冲器操作同步机制外设专项设置控制函数表第45页/共67页SEED-VPM642视频监控软件设计实例同步机制(一):阻塞(同步函数)同步函数强迫正在调用的函数等待如果TSK_A从驱动程序读数据(驱动程序还未就绪),那么设备驱动程序在等数据就绪期间将阻塞它自己(和TSK_A),所以将允许较低优先级的任务运行等I/O操作完成时,驱动程序通过投递一个信号灯来通知TSK_A数据已经就绪ApplicationReadDevice Driver应用程序TSK_A读缓冲器驱动程序A/DTSK_ATSK_B运行就绪I/O未就绪等待!I/O就绪处理!阻塞第46页/共67页SEED-VPM642视频监控软件设计实例同步机制(二):非阻塞(异步函数)异步函数启动无需等待的函数调用即使读操作提交时I/O可能未立即就绪,SWI_A继续处理。(显然,其他的处理与请求的数据无关。)作为数据读请求的一部分,SWI_A包含一个当数据就绪时被运行的“后续”函数(或SWI等)当数据就绪时,设备驱动程序的中断服务程序(ISR)调用由SWI_A指定的“回调”(也就是“后续”)函数ApplicationWriteRead应用程序SWI读缓冲器Device DriverSWI_ASWI_BI/O未就绪I/O就绪处理!CallbackA/D带“后续”函数fxn的读请求处理缓冲器当数据就绪时驱动程序回调应用程序阻塞运行第47页/共67页DSP/BIOS提供的类驱动程序迷你驱动程序(IOM)SIO流I/OPIP管道I/OGIO通用I/ODSP/BIOS线程类型TSK或SWISWITSK或SWI能与任何DSP/BIOS I/O模型一起使用的迷你驱动程序(IOM)应用程序编程者应用程序编程者可从上述三种类驱动程序中选择任何一种适用的无论与哪个设备(迷你驱动程序)连接,接口一致即使改动了设备(迷你驱动程序),接口保持不变SEED-VPM642视频监控软件设计实例类驱动程序第49页/共67页驱动程序与类驱动程序的接口由一组标准的接口函数组成mdBindDevmdUnBindDevmdControlChanmdCreateChanmdDeleteChanmdSubmitChan这些接口函数的详细说明参见文档DSP/BIOS Device Driver Developers Guide(SPRU616)SEED-VPM642视频监控软件设计实例迷你驱动程序第50页/共67页SEED-VPM642视频监控软件设计实例应用程序、类驱动程序、迷你驱动程序之关系(一)GIO_controlGIO_createGIO_deleteGIO_submit应用程序任务GIO类驱动程序迷你驱动程序mdBinDevmdContolChanmdCreateChanmdDeleteChanmdSubmitChan第51页/共67页SEED-VPM642视频监控软件设计实例应用程序、类驱动程序、迷你驱动程序之关系(二)第52页/共67页SEED-VPM642视频监控软件设计实例应用程序、类驱动程序、迷你驱动程序之关系(三)第53页/共67页DSP/BIOS提供的类驱动程序迷你驱动程序(IOM)SIO流I/OPIP管道I/OGIO通用I/ODSP/BIOS线程类型TSK或SWISWITSK迷你驱动程序(IOM)FVID为为GIO类设备驱动程序提供一组宏(见后)类设备驱动程序提供一组宏(见后)FVID用特殊的mdSubmit“命令”,所以不是所有的IOM均支持FVIDASYNC(未画出)是另一组GIO宏对于大多数系统,SIO/PIP已能满足所有的需要,BIOS额外提供GIO以满足那些用SIO或PIP很难实现的I/O操作场合FVIDFVID专用的迷你驱动程序(IOM)SEED-VPM642视频监控软件设计实例SEED-VPM642视频驱动程序:FVID驱动程序第54页/共67页为什么不选用SIO?虽然SIO的基本的缓冲器发行回收模型很好地适用于视频应用,但SIO所需的缓冲器由应用程序分配及拥有某些SIO功能对于视频应用并不需要但GIO又不能满足GIO_submit()调用总是处于阻塞状态,直到请求的I/O操作被完成GIO不支持将使用后的缓冲器还给视频采集驱动程序的功能FVID是在GIO顶上作一层简单封装通过定义3个IOM用户命令:FVID_Alloc、FVID_Exchange、FVID_Free来扩展GIO,以支持SIO那样的缓冲器发行回收交换方案定义FVID_Frame数据结构,以封装通用的视频帧数据格式,包括逐行或隔行视频帧:Y/Cb/Cr或原始视频数据FVID驱动程序将不能与SIO、PIP或基本的GIO类驱动程序协同工作SEED-VPM642视频监控软件设计实例为什么不选用SIO,而选用FVID?第55页/共67页在GIO基础上进行封装用于以帧结构的视频应用视频帧缓冲器由驱动程序分配在视频帧同步时,应用程序和驱动程序交换帧缓冲器FVID接口函数FVID_alloc驱动程序将帧缓冲器交给应用程序并进行相应的处理FVID_free应用程序将帧缓冲器交还给驱动程序FVID_exchange应用程序与驱动程序交换帧缓冲器FVID_control传递给GIOFVID_create传递给GIOFVID_delete传递给GIOSEED-VPM642视频监控软件设计实例FVID驱动程序接口第56页/共67页1.视频设备驱动程序FVID初始化3个“自己的”视频帧缓冲器SEED-VPM642视频监控软件设计实例FVID驱动程序缓冲器管理(一)视频帧A视频帧B视频帧C应用程序驱动程序第57页/共67页1.视频设备驱动程序FVID初始化3个“自己的”视频帧缓冲器2.应用程序调用FVID_alloc()来从驱动程序获得帧缓冲器ASEED-VPM642视频监控软件设计实例FVID驱动程序缓冲器管理(二)视频帧B视频帧C应用程序驱动程序视频帧AFVID_alloc()第58页/共67页1.视频设备驱动程序FVID初始化3个“自己的”视频帧缓冲器2.应用程序调用FVID_alloc()来从驱动程序获得帧缓冲器A3.应用程序调用FVID_exchange()来与驱动程序的视频帧B进行交换SEED-VPM642视频监控软件设计实例FVID驱动程序缓冲器管理(三)视频帧C应用程序驱动程序视频帧A视频帧BFVID_exchange()第59页/共67页1.视频设备驱动程序FVID初始化3个“自己的”视频帧缓冲器2.应用程序调用FVID_alloc()来从驱动程序获得帧缓冲器A3.应用程序调用FVID_exchange()来与驱动程序的视频帧B进行交换4.若视频帧A未就绪,则应用程序调用FVID_exchange()来与驱动程序的视频帧C进行交换SEED-VPM642视频监控软件设计实例FVID驱动程序缓冲器管理(四)应用程序驱动程序视频帧B视频帧CFVID_exchange()视频帧A第60页/共67页每个FVID的API函数实际是映射为GIO函数的宏FVID_alloc、FVID_exchange和FVID_free均调用GIO_submitFVID(GIO)API可归为三类:创建(Create)、处理(Process)、删除(Delete)SEED-VPM642视频监控软件设计实例FVID驱动程序接口函数APIsCreateP