This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好!
我是DSP产品的新手。最近在看DSP程序例程上有一段语句是这样的:
_ISR_Run: ;(13 cycles to get to here from ISR trigger)
;CONTEXT_SAVE
PUSH AR1H:AR0H ; 32-bit
PUSH XAR2 ; 32-bit
PUSH XAR3 ; 32-bit
PUSH XAR4 ; 32-bit
;----------------------------------------
PUSH XT ; 32-bit
NOP
;---------------------------------------------------------
;---------------------------------------------------------
MOVW DP,#ADCST>>6 ; 我看SPRU里写应当是让DP指向含有ADCST的页,那么右移6位是什么意思呢?
MOV AL,@ADCST ;
AND AL,#0x0004 ;
B ADC_Conv, NEQ ;
能不能请哪位朋友帮我解释一下高亮部分是什么意思啊? 我查了SPRU513D,没有发现DP寻址方式里有这种 MOVW DP, #xx 再加右移的方式啊?
另外,能不能请帮我看一下下面的语句,我把我的理解加了高亮,能不能请各位帮我看看我是不是理解对了啊?谢谢各位
MOVL XAR4,#(_dlog) ; 把变量dlog的地址给XAR4,即把XAR4当指针用
MOV ACC,*XAR5 ;把XAR5的内容赋给ACC(即把XAR5当指针用)
MOV *+XAR5[2],#0 ; 把0给XAR5[2],????, XARn也可以当数组用吗?
MOVL XAR7,*XAR4++ ; 先把XAR4的内容给XAR7,然后XAR4加1。即XAR4当指针用,XAR7不当指针用?
MOV @ADCTRL2,#0x4100 ; 把0X4100写入ADCTRL2寄存器
谢谢
关于加亮这句,我认为是写错了,忽视MOVW会自动右移六位。
MOV *+XAR5[2],#0 意思是把0给到XAR5+2的地址
详见下面的文档C28x Indirect Addressing Modes:
谢谢你。这是源于TI的例程。但似乎例程在运行上没有什么问题啊?是不是我挪去这个>>也是OK的呢?
源程序这里是用汇编处理ADC采样结果,全段如下。但似乎这种MOVW DP #xx >>6 使用了很多次。有没有可能是通用的呢?谢谢哦
_ISR_Run: ;(13 cycles to get to here from ISR trigger)
;CONTEXT_SAVE
PUSH AR1H:AR0H ; 32-bit
PUSH XAR2 ; 32-bit
PUSH XAR3 ; 32-bit
PUSH XAR4 ; 32-bit
;----------------------------------------
PUSH XT ; 32-bit
NOP
;---------------------------------------------------------
MOVW DP,#ADCST>>6 ; Make sure ADC conversion has completed
ADC_Conv:
MOV AL,@ADCST ; check seq1 busy bit
AND AL,#0x0004 ; This code may not be needed with proper timing
B ADC_Conv, NEQ ; and buffer code that doesn't use the ADC result and
; runs from the start of the ISR till the completion of ADC conversion
ADC_NchDRV 3 ; 3 Channel, (i.e. N=3)
ADC_Reset:
MOVW DP,#ADCTRL2>>6 ; Reset ADC SEQ
MOV @ADCTRL2,#0x4100 ; RST_SEQ1=1, SOCA-SEQ1=1
; ADC Sample Point Calculation
MOVW DP,#TBPHS3>>6
MOV AL,@TBPHS3 ; TBPHS3
ADD AL,@TBPRD3 ; TBPRD3
LSR AL,#1 ; ACC = (TBPRD3 + TBPHS3)/2
MOV @CMPB3, AL ; CMPB3 = (TBPRD3 + TBPHS3)/2
;---------------------------------------------------------
; Datalog to store and plot upto four variables in the control flow
MOVW DP,#dlog_cntr
INC @dlog_cntr
CMP @dlog_cntr,#4
B EXIT_ISR, LT ; Execute this module 4x slower
MOV @dlog_cntr,#0 ; Reset loop counter
DLOG_4CH_update
EXIT_ISR:
;===================================
MOVW DP,#PIEACK>>6 ; Acknowledge PIE interrupt Group 3
MOV @PIEACK,#PIEACK_GROUP3
.endif ; EPWMn_ISR
.if(ADC_ISR)
; Case where ISR is triggered by ADC
MOVW DP,#ADCST>>6
MOV @ADCST,#0x010 ; Clear INT SEQ1 Int flag
MOVW DP,#PIEACK>>6 ; Acknowledge PIE interrupt Group 1
MOV @PIEACK,#PIEACK_GROUP1
.endif ; ADC_ISR
; Restore context & return
POP XT
;-----------------------------------
POP XAR4
POP XAR3
POP XAR2
POP AR1H:AR0H
IRET
谢谢你们2位。中断源程序和反汇编截图请见附件.
好像论坛只允许上传一个附件,所以我把两个代码放在一个word文档里了。
另外,能不能请你们告诉我,如何从反汇编中看到相关的DP中这6位是否被移位的信息吗?
谢谢!
如下面的图所示,当用.set定义时,编译器并不认为地址所以编译器没有自动进行6位移位,需要程序员写>>6.
另一种形式的定义,编译器自动进行6位移位,需要程序员无需写>>6。
楼主可以看到,ADCST的地址定义为07119h,DP应该是1C4h。res_3的地址是0X7A0,DP应为0x1E