DSP汇编指令学习笔记.docx
- 文档编号:29811330
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:40
- 大小:550.75KB
DSP汇编指令学习笔记.docx
《DSP汇编指令学习笔记.docx》由会员分享,可在线阅读,更多相关《DSP汇编指令学习笔记.docx(40页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP 汇编 指令 学习 笔记
![提示](https://static.bdocx.com/images/bang_tan.gif)