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.

C28x汇编程序问题:

大家好!

我是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:

    www.ti.com/.../spru430e

  • 谢谢你。这是源于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         

     

     

     

  • 这个问题,论坛里的try也问过我,请你把完整的例程发上来看看,另外也请对您的这部分反汇编进行截图。

    我做了一个类似的实验:

     

     

  • Forrest说得很好!

  • 谢谢你们2位。中断源程序和反汇编截图请见附件.

    好像论坛只允许上传一个附件,所以我把两个代码放在一个word文档里了。

    另外,能不能请你们告诉我,如何从反汇编中看到相关的DP中这6位是否被移位的信息吗?

    谢谢!

     

     

    ISR & disassembly.doc
  • 如下面的图所示,当用.set定义时,编译器并不认为地址所以编译器没有自动进行6位移位,需要程序员写>>6.

                                   另一种形式的定义,编译器自动进行6位移位,需要程序员无需写>>6。

    楼主可以看到,ADCST的地址定义为07119h,DP应该是1C4h。res_3的地址是0X7A0,DP应为0x1E

     

  • 谢谢你。那么你说的另外一种方式是要如何定义呢?是不是DSP中的外设地址定义都是用.set先预定义的啊?

  • 各种设置方法都可以用。

    另一种就是上面一直谈到的_res_3的设置方法。请看上面的示例。