DSP汇编指令学习笔记.docx

上传人:b****5 文档编号:29811330 上传时间:2023-07-27 格式:DOCX 页数:40 大小:550.75KB
下载 相关 举报
DSP汇编指令学习笔记.docx_第1页
第1页 / 共40页
DSP汇编指令学习笔记.docx_第2页
第2页 / 共40页
DSP汇编指令学习笔记.docx_第3页
第3页 / 共40页
DSP汇编指令学习笔记.docx_第4页
第4页 / 共40页
DSP汇编指令学习笔记.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

DSP汇编指令学习笔记.docx

《DSP汇编指令学习笔记.docx》由会员分享,可在线阅读,更多相关《DSP汇编指令学习笔记.docx(40页珍藏版)》请在冰豆网上搜索。

DSP汇编指令学习笔记.docx

DSP汇编指令学习笔记

Knowledge

问题

谁在DSP的汇编语言中加入了NOP指令?

NOP指令加入的条件是什么?

AboutDSP

1.DSP是实时数字信号处理的核心和标志。

2.DSP分为专用和通用两种类型。

专用DSP一般采用定点数据结构(一般不支持小数),数据结构简单,处理速度快;通用DSP灵活性好,但是处理速度有所降低。

3.DSP采用取指、译码、执行三个阶段的流水线(Pipeline)技术,缩短了执行时间,提高了运行速率。

DSP具有8个Functionalunit,如果并行处理的话,以600MHz的时钟计算,如果执行的指令是singlecycle指令,则可以4800MIPS(指令每秒)。

4.DSP的8个functionalUnit,具有独特的功能,对滤波、矩阵运算、FFT(傅里叶变换)具有

哈弗结构

把指令空间与数据空间隔离的存储方式。

这样实现是为了实现指令的连续读取,而实现pipeline流水线结构。

传统哈弗结构:

两个独立的存储空间,还使用独立总线。

让取指与执行存储独立,加快执行速度。

改进型哈弗结构:

指令与数据的存储空间还是独立的。

但是使用公共的总线(地址总线与数据总线)。

这样实现的原因是因为出现了CACHE,数据的存储动作大部分被内部的CACHE总线承接了,所以总线冲突的情况会大大减少。

同时让总线的结构与控制变得简单,CACHE存储的速度也明显快于外设存储器。

冯诺依曼结构:

是指令空间与数据空间共享的存放方式。

它不能实现pipeline的执行过程。

Pipeline(流水线)技术

是把指令的取指-译码和指令的执行独立开来的技术。

虽然每条指令的过程还是要经过取指-译码-执行三个阶段最少3个CPUCycle。

但是多个指令同时并行先后进行,保证总体的指令吞吐速率理想情况下可以保证在每个指令只要一个CPUCYCLE。

Pipeline技术必须要有哈弗结构支持,即必须把指令空间与数据空间隔离存放。

流水线阻断

流水线中阻断现象也十分普遍,下面就各种阻断情况下的流水线性能进行详细分析。

流水线阻断总体有两种情况:

1.资源冲突阻断:

a)如果前一指令的某Stage与后一指令某Stage在同一个Cycle执行,但是前一指令此Stage占用了后一指此Stage的资源,则后一指令此Stage的工作会被延迟执行。

b)被延迟执行的动作会停留在前一个Stage状态,则前一个Stage的状态就不能进入新的指令的动作。

c)依次前推,则总有一个取指Stage的指令被阻断,那么其后一个指令也被阻断而不能被取指。

d)所以,每产生一个Cycle的阻断,就会让CPU的执行延迟一个Cycle。

即此指令后面的所有指令都会被延迟一个Cycle被执行。

e)解决的方法是:

使用Cache让存放变得更快;变量集群使用,记录减少变量存放到memory的需要。

2.跳转阻断:

a)跳转阻断有很多情况产生,比如函数调用/返回,循环的break/continue,if等条件判断,循环跳转,中断跳转的产生。

b)一旦某条指令要进行跳转时,它就会设置LR寄存器,阻止后续的指令进入执行Stage,并修改PC指针,执行跳转后的目标代码。

c)解决的方法是:

减少循环、条件判断、分支结构的使用。

DSPPipeline技术

DSP具有8个独立的执行单元,所以每个CYCLE可以执行8条指令(要求其总线宽度是256bit)。

即DSP是8个pipeline并行处理的技术。

所以DSP每个阶段取8个指令,然后在译码阶段把8个指令分配到8个执行单元去处理。

所以必须保证被同时取的指令之间没有相关性(即一个指令的执行不需要其他指令的结果参与),否则会得到错误的结果。

所以,DSP引入了NOP指令,如果不能实现这一的要求,则DSP的编译器,则DSP优化器会在其编译的指令后面添加NOP指令。

表示此Cycle不能执行8条有效指令,只能擦入空指令。

则这样就会有某些执行单元在此CYCLE空闲了。

DSPPipeline阻断

DSPPipleline的阻断处理相对比较复杂一些,因为它涉及到8独立执行单元的阻断。

1.资源冲突阻断:

a)如果某个Unit因为资源冲突阻断,或者因为一个指令需要多个Cycle执行。

则此Unit会被阻断。

b)当某个Unit被阻断时,其上一个阶段的指令就不能往下传递。

一直阻断到此Unit的取值动作。

c)所以当有阻断发生是,FG并不会请求8条指令,而是请求1-7条,或者不请求(8个Unit全部阻断了)。

这样没有被阻断的Unit还是能够充分运行的。

2.跳转阻断:

a)

NOP

Notdispatchedinstruction

ItisanemptyinstructioninDPpacket.

如果一个指令标识需要DelayN个slot,则需要在这个指令后面跟N个NOP指令(对于那些自身不带NOP的指令,比如B)(但是对于BNOP则不需要的)。

通过寄存器的定位技巧

1.查看NRP寄存器的值,则可以直接查看在哪个周期的指令异常了(NRP指令的前一周期就是crash的指令)(使用A10/B10……可以看到此函数的参数)

2.查看B3寄存器的值,跳到此代码段查看前面一个的Jump指令。

看是jump到哪个函数了,则是在此函数中出异常了。

则可以看到是谁调用的此crash的函数。

(使用A4/B4……可以看到parent的参数)

3.如果参数是二维指针,则此参数所在类存一般都是栈内的某个地址。

(可以根据栈空间的特点知道具体应该是哪个地址)

CPUdatapath&control

说明:

1.RegisterA也是由两片寄存器组组成的,A0:

A1/…/A30:

A31的pair是分布在两个组片中的

2.STpath是把寄存器的值写入内存的路径

3.LDpath是把内存的值加载到寄存器中的路径

4.DApath是读写寄存器的路径

5.Xpath是跨组读写寄存器的路径

A&Bpathgeneralpurposeregisters

1.EachA&Bpathhas3232-bitregister,namedA0-A31,B0-B31.

2.Itsupports40bit&64bitvalue.Ifvalueislargerthan32bit,itneedsregister-pair.The32LSBstoresineven-numberedregister,suchA0,andthe8or32MSBstoresinodd-numberedregister,suchA1.

3.Generalpurposeregisterscanbeusedfordata,addresspointers,conditionregisters.

8functionalunits

1.8functionalunitscanbedividedinto2groups,G1:

L1,S1,M1,D1forAregisterpath,andG2:

L2,S2,M2,D2forBregisterpath.

2.Eachfunctionunitshasitsspecialfunction,suchas+/-/*/>/<.Butsomeoperationscanbedealinallunits

Unitpath

TheC6000CPUhas2generouspurposeregisterfiles(A&B),8functionunits(L1/S1/D1/M1&L2/S2/M2/D1).

The8functionunitshavedifferentpathtoaccessdataordataaddress:

1.LPath:

LD1/LD2:

AccessdatapathofA&Bregisterfiles

a)从A/B中读取数据

2.DA1/DA2:

accessdataaddresspathofA&Bregisterfiles

a)把数据保存到A/B中

3.ST1/ST2:

writedatapathofA&Bregisterfiles

a)把立即数或者控制寄存器保存到A/B中

4.1X/2X:

crosspathofA&Bregisterfiles,toaccessopposite-side.

a)跨A/B读取数据

5.说明:

a)前面三个路径统称为T路径(LD、ST、DA)。

在具体汇编指令上,只会显示为T或者X路径,不会具体显示某一种T路径。

b)X路径是在跨A/B寄存器使用的,用或不用情况是一定的

c)现在只有使用了X路径,或者LDW、STW指令会显示具体使用的路径名称。

RegisterFileCrossPaths

1.G1unitscanread/writedatafrom/intoAregisters.AndtheG2unitscanread/writedatafrom/intoBregisters.SoG1unitshavecrosspathtoAregisters,andG2unitshavecrosspathtoBregister.

2.Atthesametime,Aregistershavecrosspathstoopposite-Bregisters,suchasAxisconnecttoBx.SofunctionunitsofAregisterscanaccessBregister.

Normalregisters

Reservedby表示谁负责保存这个寄存器中的值,如果是Parent,则是Caller;如果是Child则是calledfunction。

这里的Parent与child是与某此调用动作相关。

如果脱离具体的某此调用,基本所有的函数都即是parent又是child。

或者说,在某此函数调用时,哪些寄存器是在调用之前就要压栈保存(可能同时赋值的)——parent类的寄存器;哪些寄存器是在调用后如果使用到了才需要压栈保存的——child类寄存器。

寄存器中的值,始终是根据此次调用(即Crash时的调用)的参数状态。

即Parent寄存器保存的Crashfunction的Caller的参数;而child寄存器保存的是crash本函数的参数。

所以可以查看A10、B10……查看异常函数的参数;查看A4/B4……查看上层函数的参数。

同一指令周期并行执行的指令,不能同时使用同一寄存器。

SP/B15&FP/A15&PC&DP

1.SP/B15:

是栈顶指针(B15可以在gPdb查看)。

启动时需要手动初始化。

2.FP/A15:

是本函数的栈底指针。

现在没有使用,FP始终等于SP。

A15没有使用。

3.PC:

是PFC(programfetchcounter),是取指位置,是jump指令操作的寄存器(不能在gPdb中查看,也没有具体意义,因为异常处理时PC也会变)

4.DP:

初始化是.bss(为全局变量和静态变量保留(不包含const类全局变量))段的起始地址。

用于指示全局变量的基址。

启动时需要手动初始化。

5.

SP&B15(stackpointer)

B15就是SP的值,它们是同一个寄存器。

表示栈顶指针。

SP指针必须是8字节对齐的。

UnalignedSPCanCauseApplicationCrash。

B15isthestackpointer(SP),whichpointstothenextunusedlocationon

thestack。

FP&A15(framepointer)

A15就是SP寄存器。

Theframepointerisusedtoreadargumentsfromthestackandtohandleregisterspillinginstructions.

A4:

A5&A3(functionreturnvalue)

A4(或者A4:

A5):

是函数返回值(非结构体返回值)存放的寄存器。

通常其值的来源是上一函数的返回值。

A3:

如果返回的是一个结构,则返回结构的支持存放在这里。

B3&IRP&NRP(functionreturnaddress)

B3:

普通函数,当前调用的返回地址。

之前调用的返回值已经压入栈中了。

IRP:

可掩中断调用返回地址。

NRP:

不可掩中断调用返回地址。

B3:

836178A0AaSysComMsgRelay:

836178A02246MV.L1A4,A1//T1

836178A20247||MV.L2B4,B0

836178A401BC94F6||STW.D2T2B3,*SP--[4]

836178A89014A121[!

A1]BNOP.S1C$L37(PC+40=0x836178c8),5//T2

836178AC80040264||[A1]LDW.D1T1*+A1[0],A0

836178B0D014A120[!

A0]BNOP.S1C$L37(PC+40=0x836178c8),5//T3

836178B41000C813CALLP.S2$Tramp$L$PI$$_AaSysComMsgSend(PC+1600=0x83617ee0),B3//T4

//跳转到AaSysComMsgSend函数(FPAaSysComMsgSend),并把T5的代码的地址保存在B3中

836178B800002276||STW.D1T2B0,*+A0[1]

836178BCE0200003.fpheadn,l,W,BU,nobr,nosat,0000001

836178C001BC92E6LDW.D2T2*++SP[4],B3//下一周期T5

836178C46C6ENOP4

PFC&retPC&PCE1

1.PFCistheprogramfetchcounter

2.retPCrepresentstheaddressofthefirstinstructionoftheexecutepacketintheDCstageofthepipeline

3.PCE1(programcounter)representstheaddressofthefirstinstructioninthefetchpacketintheE1stageofthepipeline..

Controlregisterfile

Table2-6.ControlRegisters

AcronymRegisterNameSection

AMRAddressingmoderegisterSection2.8.3

CSRControlstatusregisterSection2.8.4

GFPGFRGaloisfieldmultiplycontrolregisterSection2.8.5

ICRInterruptclearregisterSection2.8.6

IERInterruptenableregisterSection2.8.7

IFRInterruptflagregisterSection2.8.8

IRPInterruptreturnpointerregisterSection2.8.9

ISRInterruptsetregisterSection2.8.10

ISTPInterruptservicetablepointerregisterSection2.8.11

NRPNonmaskableinterruptreturnpointerregisterSection2.8.12

PCE1Programcounter,E1phaseSection2.8.13

ControlRegisterFileExtensions(C64x+DSP)

DIERDebuginterruptenableregisterSection2.9.1

DNUMDSPcorenumberregisterSection2.9.2

ECRExceptionclearregisterSection2.9.3

EFRExceptionflagregisterSection2.9.4

GPLYAGMPYA-sidepolynomialregisterSection2.9.5

GPLYBGMPYB-sidepolynomialregisterSection2.9.6

IERRInternalexceptionreportregisterSection2.9.7

ILCInnerloopcountregisterSection2.9.8

ITSRInterrupttaskstateregisterSection2.9.9

NTSRNMI/ExceptiontaskstateregisterSection2.9.10

REPRestrictedentrypointaddressregisterSection2.9.11

RILCReloadinnerloopcountregisterSection2.9.12

SSRSaturationstatusregisterSection2.9.13

TSCHTime-stampcounter(high32)registerSection2.9.14

TSCLTime-stampcounter(low32)registerSection2.9.14

TSRTaskstateregister

这些控制寄存器,直接使用就可以了。

TI会把他们定义为全局变量。

比如

extern__cregistervolatileunsignedintEFR;

这任何时刻,EFR表示“EFR”寄存器的值。

Exceptions

Exceptions

1.外部中断:

由CPU的外围设备产生的,输入到CPU内,产生的中断叫外部中断。

如果是外部严重错误(Fatalerror)将会产生NMI中断。

2.内部中断:

CPU内部自己产生的,比如溢出异常、指令异常、内存访问异常、资源冲突、等,称为内部中断。

内部中断会有寄存器记录其产生的原因的。

3.ResetInterrupt:

GPIO23,强制重启中断。

不可掩。

4.NMI-EXCPHNDL_EFR_NXF(non-maskableinterrupt):

是CPU硬件错误

a)TheNMIEbitinTSRmustbeset,thenNMIwilloccur

b)Settingtheglobalexceptionenable(GEE)bitinthetaskstateregister(TSR)to1,thisinterruptwillbehaveasanexception.

5.IXF-EXCPHNDL_EFR_IXF:

是CPU计算异常

a)比如指令异常、内存异常,资源异常、除0溢出异常等

6.EXF-EXCPHNDL_EFR_EXF:

是外设上报到CPU的异常

7.SXF-EXCPHNDL_EFR_SXF:

是软件通过SWE指令特意触发的异常,相当于error2。

8.所有的异常,在执行结束后都会继续执行(出了断电异常)。

一般芯片的异常后停止运行的现象,是APP软件自己实现的,即在底层运行一个死循环。

CPUcontrolregisters

1.PC(PCE1)是用来指示下一条要执行的指令的,即存放的是下一条要执行的指令的地址。

几乎所有的MCU都不允许MOV指令修改PC值,这是一个常识。

2.中断服务表指针寄存器ISTP(interruptservicetablepointer)用于确定中断服务程序在中断服务表中的地址。

ISTP中的字段ISTB确定IST的地址的基值,另一字段HPEINT确定特定的中断,并给出这一特定中断取指包在IST中的位置。

3.IFR(中断标志寄存器):

显示出有终端请求但尚未得到服务的中断。

4.IER(中断使能寄存器):

使能后禁止中断处理。

5.IRP(可屏蔽中断返回指针寄存器):

包含从可屏蔽中断返回的地址,该中断返回通过指令BIRP完成。

6.NRP(不可屏蔽中断返回指针寄存器):

包含从不可屏蔽中断返回的地址,该中断返回通过指令BNRP完成。

7.CSR(控制状态寄存器):

控制全局使能或禁止中断。

8.AMR(寻址模式寄存器):

制定是否使用线性或循环寻址,若循环寻址还指定循环地址大小。

9.EN(端结方式):

1=小端终结;0=大端终结。

10.EventEncoder(事件编码器):

事件寄存器ER(包括ERL和ERH)用于捕获对应于64个EDMA通道的事件。

在事件编码器中只是负责提交请求,事件的优先局依赖于EDMA通道参数的设定,并且在TransferCrossbar中才正式排定。

11.协处理器控制位

CR0中的位1~4分别标记位MP(算术存在位)、EM(模拟位)、TS(任务切换位)和ET(扩展类型位),它们控制浮点协处理器的操作。

EM位控制浮点指令的执行是用软件模拟,还是由硬件执行。

EM=0时,硬件控制浮点指令传送到协处理器;EM=1时,浮点指令由软件模拟。

12.中断描述符表寄存器IDTR

IDTR长48位,高32位存段基址,低16位存段界线。

由于80386只支持256个中断/异常,所以IDT表的最大长度是2K,以字节位单位的段界线为7FFH。

IDTR表示IDT表的方式与GDTR表示GDT表的方式相同。

Pipeline

PipelineStages

Allinstructionsrequirethesamenumberofpipelinephasesforfetchanddecode,butrequireavaryingnumberofexecutephases.

Fetch--Decode–Execute

Knowledgepoints

Networkmaterials

5stage的

F/D- Fetch (from 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1