[DSP编程]

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

[复制链接]
1319|3
手机看帖
扫描二维码
随时随地手机跟帖
xiaqiang2006|  楼主 | 2019-10-12 23:29 | 显示全部楼层 |阅读模式
       最近在用F2812,在使用TI官方代码时 ,应用到了PMSM历程。这个历程中有一个DLOG_4CH模块,
记录4组数据,用于CCS调试环境下显示曲线。该模块的实现代码使用了汇编语言,我在读汇编代码时 ,
遇到了一些问题,读不通。特来寻求帮助。
        下面把部分代码附上:
        模块定义,使用C语言实现。
typedef struct
{
    long  task;          // 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)  
    int  trig_value;     // Input: Trigger point (Q15)        
    int  prescalar;      // Parameter: Data log prescale      
    int  skip_cntr;      // Variable:  Data log skip counter      
    int  cntr;           // Variable:  Data log counter      
    long write_ptr;      // Variable:  Graph address pointer               
    int  size;           // 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[2],#0
        MOVL    XAR5,#DLOG_4CH_buff1
        MOVL    *+XAR4[4],XAR5      ; write_ptr=DLOG_4CH_buff1
               
        
        MOV     AL,*+XAR4[6]        ; ACC=size
        MOV     *+XAR4[3],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[2]           ; skip_cntr=skip_cntr+1
        MOV     ACC,*+XAR5[2]       ; ACC=skip_cntr
        SUB     ACC,*+XAR5[1]       ; ACC=skip_cntr-prescalar
        SBF     DL_EXIT,NEQ         ; if (skip_cntr+1) < prescalar, then exit
        
        MOV     *+XAR5[2],#0        ; skip_cntr=0   
        MOV     ACC,*+XAR5[3]       ; ACC=cntr
        SBF     DLOG_END,EQ
                        
        DEC     *+XAR5[3]           ; 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[4],XAR6      ; write_ptr=DLOG_4CH_buff1
               
        MOVL    XAR6,#POS_TRIG_S1   
        MOVL    *--XAR4,XAR6        ; task=POS_TRIG_S2

        MOV     AL,*+XAR5[6]        ; ACC=size
        MOV     *+XAR5[3],AL        ; cntr=size
      
DL_EXIT:        
        LRETR   

使用特权

评论回复
Redbeannnnnn| | 2019-12-27 15:38 | 显示全部楼层
楼主调通了吗?我现在也要用DLOG_4CH了,不会用- -

使用特权

评论回复
蒋博1026| | 2019-12-30 09:21 | 显示全部楼层
给不出解决方案了,只能等楼主解决好之后分享出来了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

11

帖子

1

粉丝