xiaqiang2006 发表于 2019-10-12 23:29

应用DLOG_4CH模块中读汇编代码遇到的问题。

       最近在用F2812,在使用TI官方代码时 ,应用到了PMSM历程。这个历程中有一个DLOG_4CH模块,
记录4组数据,用于CCS调试环境下显示曲线。该模块的实现代码使用了汇编语言,我在读汇编代码时 ,
遇到了一些问题,读不通。特来寻求帮助。
      下面把部分代码附上:
      模块定义,使用C语言实现。
typedef struct
{
    longtask;          // Variable:Task address pointer   
    int*iptr1;         // Input: First input pointer (Q15)      
    int*iptr2;         // Input: Second input pointer (Q15)         
    int*iptr3;         // Input: Third input pointer (Q15)
    int*iptr4;         // Input: Fourth input pointer (Q15)
    inttrig_value;   // Input: Trigger point (Q15)      
    intprescalar;      // Parameter: Data log prescale      
    intskip_cntr;      // Variable:Data log skip counter      
    intcntr;         // Variable:Data log counter      
    long write_ptr;      // Variable:Graph address pointer               
    intsize;         // Parameter: Maximum data buffer   
    int(*init)();      // Pointer to init function         
    int(*update)();    // Pointer to update function         
} DLOG_4CH;   
      初始化函数实现,使用汇编语言。
_DLOG_4CH_init:                                    
      MOVL    XAR5,#POS_TRIG_S1
      MOVL    *XAR4,XAR5          ; task=#POS_TRIG_S1
      ADDB    XAR4,#10            ; XAR4->trig_value
      
      MOV   *+XAR4,#0
      MOVL    XAR5,#DLOG_4CH_buff1
      MOVL    *+XAR4,XAR5      ; write_ptr=DLOG_4CH_buff1
               
      
      MOV   AL,*+XAR4      ; ACC=size
      MOV   *+XAR4,AL      ; cntr=size
      LRETR

      在读这个初始化函数时,对于第二行:
      MOVL    *XAR4,XAR5          ; task=#POS_TRIG_S1
有疑问,我从代码前后可以猜到在这里寄存器XAR4是指向一个DLOG_4CH对象的地址的。
但是我查遍整个工程,也没有发现对XAR4的赋值。希望高手指点一二,指出XAR4是怎样赋值的。谢谢!



xiaqiang2006 发表于 2019-10-12 23:31

这是update函数的实现,使用汇编语言:
_DLOG_4CH_update:   
      SETC    SXM
      MOVL    XAR5,XAR4         ; XAR4->task
      MOVL    XAR7,*XAR4++      ; XAR4->iptr1, XAR7=task            
      ADDB    XAR5,#10            ; XAR5->trig_value
      LB      *XAR7               ; Branch to TASK   
      
POS_TRIG_S1:
      MOV   ACC,*XAR5         ; ACC=trig_value
      MOVL    XAR6,*XAR4          ; XAR6=iptr1
      SUB   ACC,*XAR6         ; ACC=(trig_value - *iptr1)
      BF      DL_EXIT,LEQ         ; Exit if ACC <= 0
                                       
      MOVL    XAR6,#POS_TRIG_S2   
      MOVL    *--XAR4,XAR6      ; task=POS_TRIG_S2
      LRETR
               
POS_TRIG_S2:                  
      MOV   ACC,*XAR5         ; ACC=trig_value
      MOVL    XAR6,*XAR4          ; XAR6=iptr1
      SUB   ACC,*XAR6         ; ACC=(trig_value - *iptr1)
      BF      DL_EXIT,GEQ         ; Exit if ACC >= 0
                                                   
      MOVL    XAR6,#DL_TRIGGERED   
      MOVL    *--XAR4,XAR6      ; task=POS_TRIG_S2
      LRETR
               
DL_TRIGGERED:                                 
      INC   *+XAR5         ; skip_cntr=skip_cntr+1
      MOV   ACC,*+XAR5       ; ACC=skip_cntr
      SUB   ACC,*+XAR5       ; ACC=skip_cntr-prescalar
      SBF   DL_EXIT,NEQ         ; if (skip_cntr+1) < prescalar, then exit
      
      MOV   *+XAR5,#0      ; skip_cntr=0   
      MOV   ACC,*+XAR5       ; ACC=cntr
      SBF   DLOG_END,EQ
                        
      DEC   *+XAR5         ; cntr=cntr-1
      ADDB    XAR5,#4             ; XAR5->write_ptr

      MOVL    XAR6,*XAR5          ; XAR6=write_ptr
      ADDB    XAR6,#1             ; XAR6=write_ptr+1
      MOVL    *XAR5,XAR6          ; write_ptr=write_ptr + 1
      SUBB    XAR6,#1             ; XAR6=write_ptr

      MOV   AR0,#BUFF_SIZE      ; AR0=BUFF_SIZE
      
                              
; Log sample pointed by IPTR1      
      MOVL    XAR7,*XAR4++      ; XAR7=iptr1
      MOV   AL,*XAR7            ; AL=*iptr1
      NOP   *,ARP6
      MOV   *0++,AL             ; *write_ptr=*iptr1, XAR6=write_ptr+size

; Log sample pointed by IPTR2         
      MOVL    XAR7,*XAR4++      ; XAR7=iptr2
      MOV   AL,*XAR7            ; AL=*iptr2
      NOP   *,ARP6
      MOV   *0++,AL             ; *write_ptr=*iptr2, XAR6=write_ptr+size

; Log sample pointed by IPTR3                           
      MOVL    XAR7,*XAR4++      ; XAR7=iptr3
      MOV   AL,*XAR7            ; AL=*iptr3
      NOP   *,ARP6
      MOV   *0++,AL             ; *write_ptr=*iptr3, XAR6=write_ptr+size

; Log sample pointed by IPTR4                  
      MOVL    XAR7,*XAR4++      ; XAR7=iptr4
      MOV   AL,*XAR7            ; AL=*iptr4
      NOP   *,ARP6
      MOV   *0++,AL             ; *write_ptr=*iptr4, XAR6=write_ptr+size
      LRETR

; Reinitialise the module to log the data when the logging is triggered next
      
DLOG_END:

      MOVL    XAR6,#DLOG_4CH_buff1
      MOVL    *+XAR5,XAR6      ; write_ptr=DLOG_4CH_buff1
               
      MOVL    XAR6,#POS_TRIG_S1   
      MOVL    *--XAR4,XAR6      ; task=POS_TRIG_S2

      MOV   AL,*+XAR5      ; ACC=size
      MOV   *+XAR5,AL      ; cntr=size
      
DL_EXIT:      
      LRETR   

Redbeannnnnn 发表于 2019-12-27 15:38

楼主调通了吗?我现在也要用DLOG_4CH了,不会用- -

蒋博1026 发表于 2019-12-30 09:21

给不出解决方案了,只能等楼主解决好之后分享出来了
页: [1]
查看完整版本: 应用DLOG_4CH模块中读汇编代码遇到的问题。