DSP器件原理与应用期末复习总结。
绪论
实时数字信号处理
数字信号处理指以数字形式对信号进行采集、变换、滤波、估值、增强、压缩、识别等处理,以得到符合人们需要的信号形式。
实时指的是系统必须在有限的时间内对外部输入信号完成指定的处理,即信号处理的速度必须大于或等于输入信号更新的速度,而且从信号输入到处理后输出的延迟必须足够小。
实时数字信号处理系统的构成
数字信号处理系统的实现方法一般有以下几种:
- 在通用计算机系统中用软件实现
- 不适合嵌入式应用
- 速度相对较慢,不适合实时数字信号处理,一般只用于算法的模拟
- 在通用计算机系统中用专用的处理模块实现
- 不适合嵌入式应用
- 专用处理模块针对性强,缺乏灵活性,应用受到很大限制
- 用通用单片机系统实现
- 只适合一些不太复杂的数字信号处理,不适合以乘加为主的运算密集型算法
- 用通用可编程DSP芯片实现
- 与单片机相比,DSP芯片更适合于数字信号处理的软件和硬件资源,可用于复杂的数字信号
处理
- 与单片机相比,DSP芯片更适合于数字信号处理的软件和硬件资源,可用于复杂的数字信号
- 用专用DSP芯片实现
- 专用芯片针对性强,缺乏灵活性,应用受到很大限制
- 用基于通用DSP内核的ASIC 实现
以可编程的 DSP芯片为核心组成的应用系统具有以下优点:- 能够快速制造原理样机和进行验证,加快产品上市时间
- 高度可编程性使产品能够迅速应用新算法、新标准或新协议
- 可以通过软件更新,快速地进行产品升级
DSP芯片
一个通用的,能高效地实现各种数字信号处理的平台需要满足以下几点基本要求:
-
用单一指令完成乘法及加法操作;
-
在读/写算术运算单元的同时能够进行算术运算并修改地址指针;
-
能够对数据进行逻辑操作,并能根据逻辑操作的结构改变操作流;
-
能够根据存储的程序完成相应的操作。
按照所支持的数据类型,DSP芯片可分为定点和浮点两大类。
DSP的代码兼容指为某种 DSP产品开发的代码可以在不加修改或只作很小修改的情况下在其他DSP上执行。除了代码兼容,还有管脚兼容。
DSP芯片的功能特点:数字信号处理通常需要进行大量的实时计算。其中的数据操作往往具有高度重复的特点,特别是乘加操作(Y=A*B+C)在常见数字信号处理算法中用得最多。DSP芯片在很大程度上是针对上述特点设计的。
DSP芯片的结构特点: -
算术单元
- 硬件乘法器,现代的DSP内部都设有硬件乘法器。
- 多功能单元,在CPU内设置多个并行操作的功能单元(ALU、乘法器和地址产生器等)。现
代 DSP采用RISC结构,有利于简化结构和降低成本。
-
总线结构,通用微处理器通常采用冯·诺依曼(Von Neuman)结构,其指令和数据共用同一个存储空间和单一的地址及数据总线,统一编址。处理器要执行任何指令,都要先从存储器中取出指令,解码,再取操作数,然后才能执行,即使单条指令也要耗费许多周期。DSP采用程序总线和数据总线分离的哈佛结构,其主要特点是将程序和数据存储在不同的存储空间,即程序存储器和数据存储器是两个相互独立的存储器,每个存储器独立编址,独立访问。在哈佛结构中,由于程序和数据存储器在两个分开的空间中,因此取指和执行能完全重叠运行。
-
专用寻址单元,DSP通常都有支持地址计算的算术单元——地址产生器。
-
片内存储器。
-
流水线
TMS320c6000系列DSP
C6000系列DSP的 VelociTI体系结构是一种 VLIW体系结构。VLIW体系结构中,由一个超长的指令字来驱动内部的多个功能单元。每个指令字包含多个字段(指令),字段之间相互独立,各自控制一个功能单元。VLIW体系结构可以单周期发射多条指令,从而实现很高的指令级并行效率。VLIW 指令的并行安排是静态的,由编译器在编译过程中决定,一旦决定,在任何时候运行都保持不变。C6000采用了类RISC指令集,使用大的统一的寄存器堆,结构规整,具有潜在的易编程性和良好的编译性能。
TMS320C6000系列CPU结构
TMS320C6000中央处理器(CPU)结构
C6000中央处理器(CPU)的组成部分:
- 程序读入及指令译码、分配机构,包括取指单元、指令分配单元和指令译码单元。取指单元与片内程序存储器通过程序总线相连。
- 程序执行机构,包括数据通路、通用寄存器组、功能单元、控制寄存器组和控制逻辑、中断逻辑等。数据通路与片内数据存储器通过数据总线相连。
芯片测试和仿真端口及其控制逻辑。
C6000系列CPU采用哈佛结构,程序总线与数据总线是分开的,取指和执行可以并行运行。C6000的程序总线宽度为256 bit,每次取指操作取8条指令,称为一个取指包(fetch packet,FP)。取指、指令分配和指令译码单元都具备每周期读取并传递8条32位指令的能力。指令的执行在2个数据通路的功能单元内进行,每条指令占用1个功能单元。
C6000 片外的存储器和总线没有分为程序存储器(程序总线)和数据存储器(数据总线)。片内(程序存储器、数据存储器)和片外的全部存储空间以字节为单位统一编址。对片外存储器的读写操作必须通过EMIF或DMA进行。
C6000指令执行过程中使用的物理资源一般统称为数据通路(包括功能单元、通用寄存器组、数据总线等)。
C6000系列CPU有2个数据通路(A和B),每个数据通路有4个功能单元和1个通用寄存器组。除数据存储器读写指令和程序跳转指令外,其他所有算术逻辑运算指令的源操作数和目的操作数都是通用寄存器,使程序能够高速运行。
.D1和.D2称为数据寻址单元,负责产生数据存储器的地址。每个数据通路的4个功能单元还有单一的数据总线连接到另一个数据通路的寄存器上,以便两个数据通路的寄存器交换数据。
CPU数据通路与控制
C6000的数据通路包括:
- 2个通用寄存器组(A、B),C62x和C67x每组有16个32位寄存器,C64x、C64x+、C67x+和
C66x每组32个。 - 8个功能单元(.L1、.L2、.S1、.s2、.M1、.M2、.D1、.D2)
- 2个存储器读取通路(LD1、LD2),C62x每侧有1条32位读取总线,C64x、C64x+、C67x、C67x+和C66x每侧有2条32位读取总线。
- 2个存储器存储通路(ST1、ST2),C62x、C67x和C67x+每侧有1条32位存储总线,C64x、C64x+和C66x每侧有2条32位存储总线。
- 2个寄存器组交叉通路(1X、2X),支持32位读取,C66x的交叉通路支持64位读取。2个数据地址通路(DA1、DA2)。
通用寄存器的作用:
- 存放数据,作为指令的源操作数和目的操作数;
- 作为间接寻址的地址指针,其中寄存器A4~A7和B4~B7还可用循环寻址方式工作;
- 寄存器A1、A2、B0、Bl和 B2可用做条件寄存器,C64x的A0也可用做条件寄存器。
40/64位数据使用寄存器对来存放,如A1:A0,B7:B6。128位数据使用2个寄存器对来存放(称为寄存器双对,register quadruplet),如A3:A2:A1:A0(也可简写为A3::A0)
功能单元可以直接对属于同一数据通路的寄存器组进行读写操作。两个寄存器组通过交叉通路1X和2X与另一组的功能单元相连。数据通路A的功能单元可以通过1X从寄存器组B读取源操作数;数据通路B的功能单元可以通过2X从寄存器组A读取源操作数。
对控制寄存器的读写操作只能通过.S2单元进行,访问控制寄存器的指令是MVC.常用的控制寄存器:CSR、AMR。
3.TMS320c6000系列DSP软件开发I)
概述
编写和调试C6000程序的流程:
- 第1阶段:编写C代码,此阶段在不考虑任何C6000有关知识的情况下,完全根据任务要求编写C语言程序,证明其功能正确。通常这个阶段得到的代码效率较低,因此需要使用C6000调试工具确定代码中可能存在的效率较低的代码段,进入第2阶段。
- 第2阶段:优化C代码,根据第1阶段的结果改进和优化C代码,如果代码效率仍不能达到要求,则进入第3阶段。
- 第3阶段:编写线性汇编,用线性汇编重新编写对性能影响很大的代码段。
3.2.TMS320C6000程序基本结构
一个最小的C应用程序工程至少包含3个文件:
- 主程序,这个文件应包含一个main函数作为C程序的入口。
- 链接器命令文件,包含内存空间的定义以及代码段、数据段的分配。
- C运行库,提供C运行环境的初始化函数c_int00)和标准C函数。
如果用户的程序是准备写进ROM并在加电后直接运行的,还应包含以下文件: - vectors.asm,中断服务表,必须被链接命令文件分配到0地址。
TMS320C6000 C语言
TMS320C6000C编译器支持两种内存模式:小模式和大模式。不同内存模式主要影响对.bss 段中变量的访问。
- 小模式要求.bss段的大小不能超过32kB(即程序的全部静态和全局变量占用的内存总和不能超过32kB)。编译器在程序初始化时设置数据页指针寄存器(data-page pointer register,DP,使用寄存器B14),将其设置为.bss段的起始地址。在程序运行期间,可以通过直接寻址访问.bss段中的变量。
- 大模式对.bss 段的大小没有限制。但是在访问.bbs 段的变量时需要3条指令才能完成(首先将要访问变量的地址装入寄存器,然后再访问)。
TMS320C6000系列DSP软件开发(II)
TMS320C6000汇编语言
TMS320C6000汇编语言格式。
TMS320c6000线性汇编语言
TMS320C6000 线性汇编语言格式。
TMs320c6000系列DSP软件开发(m)
TMS320C6000公共指令集
C62x指令集分为读取/存储指令、算术运算指令、逻辑与位操作指令、搬移指令、跳转指令和空操作指令等6类指令。
延迟间隙在数量上等于从指令的源操作数被读取直到执行的结果可以被访问所用的周期数。
C62x所有指令的功能单元等待时间均为l,也就是说每一个周期功能单元都能够开始一条新指令。延迟间隙,功能单元等待时间。
取值包(FP)中所有并行执行的指令组成一个执行包(execute packet,EP)。EP中每条指令使用的功能单元必须各不相同。
所有的C6000指令都可以条件执行。
C6000在访问数据存储空间时全部采用间接寻址,所有的通用寄存器都可以做为线性寻址的地址指针。A4~A7,B4~B7等8个寄存器还可以做为循环寻址的地址指针(通过寻址模式寄存器AMR控制寻址方式)。
常用的C6000指令。C62x指令的资源限制:
- 使用相同功能单元的两条指令不能安排在同一个EP中。
- 一个EP内的一个功能单元〈(.L、.S或.M中的任一个)可以通过交叉通路从另一侧的寄存器组读
取一个源操作数。使用同一条交叉通路的两条指令不能安排在同一个EP中。 - Load/Store指令所用的地址寄存器必须与所用的.D单元处于同一侧。
- 使用同一寄存器组作为目的地址/源地址的两条Load/Store指令不能安排在同一个EP中。
C62x/C67x的.S和.L单元共用一套长型数据的读通路和写通路,所以一个EP只允许每一个寄存器组处理一个长型数据。 - 在一个指令周期内,对同一个寄存器,不允许超过4次读操作(条件寄存器除外)。
- 在一个指令周期内,不允许对同一个寄存器做1次以上的写操作。
TMS320C67x浮点运算指令
(无)
TMS320C64x指令集
常用的C64x指令。
C64x指令的资源限制:
-
C62x指令的限制也适用于C64x。
-
C64x的.D单元也和交叉通路相连,每周期可以通过交叉通路从另一侧的寄存器组读取一个源操作数。
-
C64x允许一侧的多个功能单元通过交叉通路从另一侧的同一个寄存器读取源操作数。
-
当C64x试图通过交叉通路读取数据到前一指令周期刚被更新的寄存器时,C64x 的硬件会自动插入1个周期的延迟。
-
C64x 允许访问无边界调整的32位或64位数据,此时的限制是:同一个EP内不能再有访问存储器的指令,但是允许.D单元执行其他非存储器访问指令。
-
C64x对长型定点数的限制。
-
如果LDx、STx、ADDAx、SUBAx指令使用A4~A7、B4~B7寄存器寻址,紧跟在这些指令后面对AMR寄存器做写操作会造成1个周期的阻塞。
-
同一个EP内不能有两条或以上产生多周期空操作的指令。
TMS320C64x+指令集
常用的C64x+指令。
流水线
指令的处理可以分成若干子操作,每个子操作由微处理器的不同部件完成。对每个部件来说,每隔一个时钟周期就可以进入一条新指令。这样在同一时间内,在不同部件中可以处理多条指令,这种工作方式称为“流水线”( pipeline)工作方式。TMS320C6000的特殊结构最多允许8条并行指令同时通过流水线的各节拍。
TMS320C6000 的流水线分为取指(fetch)、译码(decode)和执行(execute)三级(stage)。取指级分4个节拍( phase),译码级分2个节拍,执行级则根据不同指令有不同的节拍数。流水线操作以CPU周期为单位,一个EP在流水线一个节拍的时间就是一个CPU周期。
流水线取指级的4个节拍如下:
- PG:程序地址生成( program address generate),确定取指包的地址。
- PS:程序地址发送( program address send),将取指包的地址发送到内存。
- PW:程序访问等待( program access reday wait),访问程序存储空间。
- PR:程序取指包接收(program fetch packet receive),取指包送至CPU。流水线译码级的2个节拍如下:
- DP:指令分配( instruction dispatch),确定该取指包的后续执行包,并将执行包送到合适的功能单元。
- DC:指令译码( instruction decode),指令在功能单元中译码。
在DP节拍中,FP根据并行性分成一个或多个EP。在DP节拍期间,一个EP的指令被分配到相应的功能单元。同时,源寄存器、目的寄存器和有关通路被译码以便在功能单元完成指令执行。
执行级根据定点和浮点流水线分成不同节拍,定点有5个节拍(E1~E5),浮点有10个节拍(E1 ~E10)。不同类型的指令需要不同数量的节拍,C6000有很多指令是单周期指令,在E1节拍就可以结束。
一个FP中有多个EP的流水线操作。
多周期NOP指令对流水线运行的影响。
访问存储器对流水线运行的影响。
中断
C6000有3种类型的中断: /RESET(复位中断)、不可屏蔽中断(NMI)和可屏蔽中断(INT4~INT15)。中断服务表(Interrupt Service Table,IST)是包含中断服务代码的取指包的一个地址表。IST包含16个连续取指包,每个中断服务取指包都有8条指令。
异常
(无)
TMS320c6000系列DSP软件开发(IV)
DSP的定点运算的基本原理
数的定标及Q表示法。
浮点数与定点数的转换。
数x的取整运算:舍入和截尾。
定点运算的C语言实现
定点运算的C语言实现方法。
TMS320C6000系列DSP软件优化(I)
C语言优化概述
(无)
编写C代码
(无)
编译C代码
(无)
优化C代码
软件流水( software pipelining〉技术用于安排循环指令,使循环的多次迭代并行执行,从而提高循环代码的执行效率。
限制软件流水的因素:
- 如果有循环嵌套,只有最内层循环可以进行软件流水优化。
- 软件流水循环中不能包含函数调用(调用内联函数除外)。循环中不存在条件终止,使循环提前退出的指令。
- 循环计数必须是递减方式,并且结束值为0。
- 不能在循环体内修改循环计数。
- 如果循环中在满足某个条件时会增大循环控制变量,这样的循环不能进行软件流水。
- 循环代码尺寸不能太大。
- 寄存器值生命周期不能太长。
- 循环体内不能有复杂的条件代码。
常用的C语言优化方法。
TMS320C6000系列DSP软件优化
线性汇编语言优化概述
(无)
相关图
根据C语言程序改写线性汇编程序。
画相关图。
单周期迭代间隔的软件流水编排
(无)
多周期迭代间隔的软件流水编排
(无)
循环传递路径
优化循环传递路径的方法
循环中的if-else语句
(无)
循环展开
使用循环展开进行优化。
寄存器生命周期
解决寄存器生命周期太长的方法。
TMS320C64x编程的几点考虑
使用打包数据处理进行优化。
TMS320C64x+编程的几点考虑
使用C64x+的指令进行优化。
TMS320C6000系列DSP集成外设
概述
(无)
片内存储器
对于C620x/C670x,片内存储器分为程序区间和数据区间两部分,其中程序区间可以作为普通SRAM映射到存储空间,也可以作为高速缓存。
除C620xC670x外,其他型号的芯片均为二级存储器结构。第Ⅰ级存储器包括相互独立的程序缓存(LIP)和数据缓存(L1D),只能作为高速缓存被CPU访问。第2级存储器(L2)是一个统一的程序/数据空间,可以整体作为SRAM 映射到存储空间,也可以整体作为第⒉级缓存,或者按比例组合。
外部存储器接口
(无)
直接存储器访问(DMA)
有关C6000的 DMA传输的几个概念:
- 数据的读传输((read transfer):DMA控制器从源地址中读出数据。
- 数据的写传输( write transfer ):DMA 控制器将读出的数据写入目的地址。
- 数据单元传输(element transfer):数据的读传输和写传输的结合。
- 帧传输(frame transfer):传输一定数量的数据单元构成一个传输帧,帧的大小可编程设置。
- 块传输(block transfer):若干帧的传输构成一个块传输,每个通道独立定义每块中帧的数量。发送
- 数据单元的传输( transmit element transfer):在通道分割模式下,数据单元从源地址读出并写入分割目的地址。
- 接收数据单元的传输(receive element transfer):在通道分割模式下,数据单元从分割源地址读出
并写入目的地址。
DMA控制寄存器的设置。
增强的直接存储器访问(EDMA)
EDMA提供了两种类型的数据传输:1D传输和2D传输。使用通道可选参数的2DD/2DS字段选择传输类型。当2DD为1时,执行目的地址为2D的传输;2DS为1时,执行源地址为2D的传输。
传输的维数决定了数据帧的构成。对于1D 传输,数据单元组成帧;对于2D传输,数据单元组成阵列,阵列组成块。
EDMA参数块的设置。QDMA的设置。
芯片的设置
C6000有三种引导模式:不加载、ROM加载、主机加载。操作过程分别如下:
- 不加载,CPU直接从地址0处开始执行代码。
- ROM加载,位于外部CEl空间的ROM 中的代码(64kB或IkB)通过DMA/EDMA搬入地址О处,然后执行。加载过程在复位信号撤销后开始,此时CPU内部保持复位状态,由 DMA/EDMA执行Ⅰ个单帧的数据块传输,传输完成后CPU退出复位状态,开始执行地址О处的指令。
- 主机加载,CPU核心停留在复位状态,芯片其余部分处在正常状态,外部主机通过主机接口完成对DSP存储空间的初始化,之后向接口控制寄存器的DSPINT 写1,结束引导过程,此时CPU退出复位状态,开始执行地址О处的指令。
中断控制
(无)
DSP/BIOS
概述
(无)
DSP/BIOs
DSP/BIOS是为需要实时线程调度和同步以及主机/目标系统通信和实时监测的应用而设计的。DSP/BIOS提供了抢先式多任务内核、硬件抽象层、实时分析工具和配置工具。
DSP/BIOS由三个部分组成:DSP/BIOS实时内核和API、DSP/BIOS配置工具、DSP/BIOS实时分析工具。
程序生成
DSP/BIOS的程序开发。
监测
LOG对象的使用。
线程调度
在 DSP/BIOS 中,线程定义为由 DSP执行的任何独立的指令流。一个线程可以是一个子程序、一个中断服务程序或一个函数调用。
DSP/BIOS应用程序按线程结构化设计,每个线程完成一个模块化的功能。多线程程序中允许高优先级线程抢占低优先级线程以及线程间的同步和通信。
DSP/BIOS支持4种线程类型,每种线程都有不同的执行和抢占特性;
- 硬件中断HWI),包括CLK函数:用于响应外部异步事件。当一个硬件中断发生时执行 HWI
函数。HWI函数在 DSP/BIOS应用程序中的优先级最高,用在发生频率在200 kHz左右的事件。HWI函数的执行时间通常在2s ~100s. - 软件中断(SWD,包括PRD函数:软件中断是通过调用SWI函数触发的,它的优先级处在HWI和TSK之间。SWI和 HWI一样,都必须执行到完成,一般用于执行期限在100s 以上的事件。sWI允许HWI将一些非关键处理在低优先级上延迟执行,这样可以减少在中断服务程序中的驻留时间。
- 任务(TSK):任务的优先级高于后台线程,低于软件中断。任务在运行过程中可以被挂起。DSP/BIOS提供了一些任务间同步和通信的机制,包括队列、信号灯和邮箱。
- 后台线程(IDL):后台线程的优先级最低。在main 函数返回后,系统为每个 DSP/BIOS模块调用startup例程,然后开始执行空闲循环。在空闲循环中执行每个IDL对象的函数。除非有高优先级的线程抢占,空闲循环将一直连续地运行。在空闲循环中应该运行那些没有执行期限的功能。在 表示。
DSP/BIOS还有另外几种函数可以执行,它们是在某一类型的线程上下文中被执行的:
- 时钟函数(CLK):在每个定时器中断的末尾执行。默认情况下,CLK 函数由硬件中断触发,按
HWI函数执行。 - 周期函数(PRD):在片上定时器中断或其它事件多次计数后执行。周期函数是一种特殊类型的
软件中断。 - 数据通知函数:在使用管道(PIP)或主机通道(HST)传输数据时执行,用来通知读者(reader)
或写者(writer)。做为PIP_alloc、PIP_get、PIP_free和 PlP_put等函数的上下文执行。
线程选择的一些规则:
- SWI、TSK 与HWI:硬件中断只处理时间要求苛刻的关键任务。对于处理时间限制在5s 以内
的事件,应当考虑使用硬件中断来处理。软件中断或任务用于执行时间限制在100s 以上的事件。硬件中断函数应该触发软件中断或任务来进行低优先级处理。使用低优先级线程可以减少禁止中断的时间,允许其它中断的触发。 - SWI与TSK:软件中断一般用于独立性相对较强,数据共享需求相对简单的事件。如果数据共享需求比较复杂,则使用任务。任务提供了很多任务间通信和同步的手段。一个任务可以挂起等待某一个资源的有效。在使用共享数据时,任务比软件中断更加灵活。软件中断执行时必须保证所需的全部数据已经准备好。所有的软件中断使用同一个堆栈,在内存使用上更加有效。每个任务使用各自的堆栈。
- IDL:后台线程用于执行没有执行时间限制的非关键处理。
- CLK:如果希望一个函数直接由定时器中断触发,则使用CLK函数。默认的CLK对象PRD_clock
用来为PRD函数产生计数时钟。可以增加更多的CLK对象以定时器中断的频率运行。CLK函数都在一个HWI函数中执行,因此它们的执行时间必须足够短。 - PRD: PRD函数的触发周期是片上定时器中断周期的整数倍,或者是其他外部事件(如外部中断)产生周期的整数倍。PRD函数作为SWI函数来执行。
- PRD 与SWI:所有的 PRD函数属于同一个SWI优先级,因此PRD函数之间不能互相抢占。PRD函数可以触发低优先级中断来延长处理时间,保证在下一个系统计数到来时PRD_swi(周期函数对应的软件中断〉可以抢占这些低优先级中断,执行新的PRD函数。
DSP/BIOS中硬件中断的优先级最高。DSP/BIOS中 HWI对象的个数及其优先级是固定的,与DSP的硬件中断保持一致。
软件中断的优先级低于硬件中断,共有14个优先级。软件中断可以被高优先级软件中断或硬件中断抢占。软件中断不能被阻塞。
任务的优先级低于软件中断,共有15个优先级。任务在等待某个资源有效时可以被阻塞。后台空闲循环是优先级最低的线程。
除下列情况外,DSP/BIOS调度器运行最高优先级的线程:
- 正在运行的线程暂时禁止了部分或全部硬件中断(调用HWl_disable),阻止了相应中断服务程序
的执行。 - 正在运行的线程暂时禁止了软件中断(调用sWl_disable),阻止了更高优先级的软件中断抢占当
前线程,但并不阻止硬件中断抢占当前线程。 - 正在运行的线程暂时禁止了任务调度(调用TSK_disable),阻止了更高优先级的任务抢占当前的线程,但并不阻止硬件中断或软件中断抢占当前线程。
- 最高优先级的线程是一个处在阻塞状态的任务线程。当任务调用TSK_sleep、LCK_pend、MBX_pend或SEM_pend 时会发生阻塞。
每个TSK任务对象有以下四种状态:
-
运行态(running ):任务是处理器当前正在执行的线程,用TSK_RUNNING
-
就绪态(ready):任务一旦获得处理器的处理时间就可以执行,用TSK_READY表示。
-
阻塞态(blocked):任务必须等到某个事件的发生才可以运行,用TSK_BLOCKED表示。
-
终止态(terminated):任务已经结束,不会再运行,用TSK_TERMINATED表示。
任务是根据优先级调度执行的,在同一时刻只能有一个任务在执行,并且所有就绪态任务的优先级低于当前执行的任务的优先级。在程序执行过程中,任务可能因为不同的原因在各个状态间切换。
当处在运行态的任务转换到其它三种状态时,处理器的控制权转向当前最高优先级的就绪任务。一个运行态任务可以按下面的三种方式之一转向其它状态:
- 运行任务调用TSK_exit转入终止态。
- 运行任务调用了引起阻塞的函数(如SEM_pend、TSK_sleep)转入阻塞态。当一个任务正在执行IO操作,等待某个资源的有效或空闲时可能会转入该状态。
- 当有更高优先级的任务就绪时,当前任务被抢占,转入就绪态。一个任务也可以通过调用TSK_yield将控制权转向优先级相同的其它任务,自己变为就绪状态。
一个阻塞的任务在外部事件响应后可以转入就绪态。一旦转入就绪态,该任务将等待调度,如果它的优先级高于当前运行的任务,就会立即转入运行态。
在任务建立、删除、退出和切换时可以调用某些系统专用函数(称为任务构子),这些函数可以用于扩展任务的上下文。
信号量的使用。邮箱的使用。
内存分配和管理
DSP/BIOS使用MEM模块实现内存管理和分配。可使用配置工具静态建立. MEM对象。
MEM模块进行内存分配时使用的基本单位是MADU。对C6000系列芯片,1个MADU就是1个字节。MEM模块进行内存分配时,所分配的MADU 数量一定是偶数个。
输入/输出
(无)
XDAIS算法标准
(无)
知识点归纳
yuv转rgb的矩阵 q值

q值

最后一次作业,c代码
任务1:随机产生字符(英文字母)
任务2:利用DSP/BIOS的 LOG对象,输出任务1产生的字符
1 | /* readChar.h */ |
1 |
|
任务3:计数值每秒增加1,并通过LOG对象输出这个值。
1 | /* counter.h */ |
1 |
|
点积相关图
串行
定点点积

浮点点积


并行


任务的状态转移图

流水限制的因素
限制软件流水的因素:
- 如果有循环嵌套,只有最内层循环可以进行软件流水优化。
- 软件流水循环中不能包含函数调用(调用内联函数除外)。
- 循环中不存在条件终止,使循环提前退出的指令。
- 循环计数必须是递减方式,并且结束值为0。
- 不能在循环体内修改循环计数。
- 如果循环中在满足某个条件时会增大循环控制变量,这样的循环不能进行软件流水。
- 循环代码尺寸不能太大。
- 寄存器值生命周期不能太长。
- 循环体内不能有复杂的条件代码。
C6000流水的工作方式
流水线
指令的处理可以分成若干子操作,每个子操作由微处理器的不同部件完成。对每个部件来说,每隔一个时钟周期就可以进入一条新指令。这样在同一时间内,在不同部件中可以处理多条指令,这种工作方式称为“流水线”( pipeline)工作方式。TMS320C6000的特殊结构最多允许8条并行指令同时通过流水线的各节拍。
TMS320C6000 的流水线分为取指(fetch)、译码(decode)和执行(execute)三级(stage)。取指级分4个节拍( phase),译码级分2个节拍,执行级则根据不同指令有不同的节拍数。流水线操作以CPU周期为单位,一个EP在流水线一个节拍的时间就是一个CPU周期。
流水线取指级的4个节拍如下:
- PG:程序地址生成( program address generate),确定取指包的地址。
- PS:程序地址发送( program address send),将取指包的地址发送到内存。
- PW:程序访问等待( program access reday wait),访问程序存储空间。
- PR:程序取指包接收(program fetch packet receive),取指包送至CPU。
流水线译码级的2个节拍如下:
- DP:指令分配( instruction dispatch),确定该取指包的后续执行包,并将执行包送到合适的功能单元。
- DC:指令译码( instruction decode),指令在功能单元中译码。
在DP节拍中,FP根据并行性分成一个或多个EP。在DP节拍期间,一个EP的指令被分配到相应的功能单元。同时,源寄存器、目的寄存器和有关通路被译码以便在功能单元完成指令执行。
执行级根据定点和浮点流水线分成不同节拍,定点有5个节拍(E1~E5),浮点有10个节拍(E1 ~E10)。不同类型的指令需要不同数量的节拍,C6000有很多指令是单周期指令,在E1节拍就可以结束。
一个FP中有多个EP的流水线操作。
指令的处理可以分成若干子操作,每个子操作由微处理器的不同部件完成。对每个部件
来说,每隔一个时钟周期就可以进入一条新指令。这样在同一时间内,在不同部件中可以处
理多条指令,这种工作方式称为“流水线”(pipeline) 工作方式。 TMS320C6000 的特殊结构
最多允许 8 条并行指令同时通过流水线的各节拍。
C6000的特点
- 定点浮点系列兼容
- VelociTi内核
- 类似RISC的指令集
- 片内集成大容量SRAM
- 片内提供多种集成外设
- 芯片内置灵活的PLL锁相时钟电路
C6000通用寄存器的作用
通用寄存器的作用是:
- 存放数据,作为指令的源操作数和目的操作数;
- 作为间接寻址的地址指针,其中寄存器A4~A7和B4~B7还可用循环寻址方式工作;
- 寄存器A1、A2、BO、B1和B2可用做条件寄存器,C64x的A0也可用做条件寄存器。
mvk的功能单元(填空)
S1或S2
edma的两种同步方式(填空)
1D:单元同步、帧同步
2D:阵列同步、块同步
程序存储器阻塞所在的周期(填空)
PW节拍
存储器阻塞
如果存储器尚未准备好响应CPU访问,流水线会发生存储器阻塞。对程序存储器,存储器阻塞发生在PW 节拍,而数据存储器则发生在E3节拍。存储器阻塞使处于该流水线的所有节拍延长一个时钟周期以上,造成执行增加额外的时钟周期。不管是否发生阻塞,程序执行的结果是相同的。
DSP的2种类型(填空)
定点和浮点
C6000的3种组成部分(填空)
程序读入及指令译码、分配机构,包括取指单元、指令分配单元和指令译码单元。取指单元与片内程序存储器通过程序总线相连。
程序执行机构,包括数据通路、通用寄存器组、功能单元、控制寄存器组和控制逻辑、中断逻辑等。数据通路与片内数据存储器通过数据总线相连。
芯片测试和仿真端口及其控制逻辑。
最高优先级的中断(填空)
复位中断