应用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是怎样赋值的。谢谢!
这是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 楼主调通了吗?我现在也要用DLOG_4CH了,不会用- - 给不出解决方案了,只能等楼主解决好之后分享出来了
页:
[1]