在用户手册中,找不到关于说明TST指令时钟周期的,不知是多少呢?
写延时程序时要计算指令的时钟周期,才能知道延时的时间是多少,程序如下图所示:
在IAR5.50的观察窗口中也又不能正确的显示指令执行的时钟周期,这方面不如keil方便,IAR 窗口如下:
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.
在用户手册中,找不到关于说明TST指令时钟周期的,不知是多少呢?
写延时程序时要计算指令的时钟周期,才能知道延时的时间是多少,程序如下图所示:
在IAR5.50的观察窗口中也又不能正确的显示指令执行的时钟周期,这方面不如keil方便,IAR 窗口如下:
TST是伪指令,它实际执行的是CMP指令,CMP是双时钟周期指令。所以程序执行TST需要2个系统时钟。
不是指导书写错了,MSP430的指令的执行周期不仅仅和指令有关还和指令的寻址模式相关。
TST 语句是个伪指令,它实际执行的的是CMP #0, RX的语句。
数据手册有标明:
同样的CMP语句,如果是寄存器到寄存器寻址,就是1个CLOCK,如果是立即数到寄存器寻址,就是2个CLOK
例如 CMP R5, R8 执行就是1个CLOCK
CMMP #03, R8 执行就是2个CLOCK
CMP, MOV,ADD, SUB属于一类的指令,所以上图中查找CMP 的立即数和寄存器寻址应该对应这一栏:
而楼主给出的图是CMP在EDE寻址模式下所消耗的时钟,不是立即数寻址消耗的时钟。
另外需要注意,MSP430的2系列和5/6系列的指令也是不一样的。以上分析是基于2系列作的
刚又确认了下,CMP #N, R要消耗3个CLK,
分析如下:
CMP属于MSP430的 Format I 指令, Format I 指令对应的时钟周期见表 4-18 的#N一栏。
这一栏表示 Source = #N, Des = Rm, 其时钟周期为3。例如 BITX #20, R8, 其消耗的CYCLE就是3。
在表4-19中也列出了MOV和CMP不同,MOV,BRA 在立即数到寄存器寻址只用2个周期,CMP, ADD, SUB等要3个周期,
之前太武断的认为MOV和CMP属于同一类指令,消耗的周期就一样了。
刚做了一个测试代码来测试,确实TST只用了1个CLOCK, 很奇怪。
顺便做了下其他的汇编代码测试,发现语句的实际消耗CLOCK不仅仅和汇编指令相关,和实际数也有关,
例如我测试了"MOV #0x20,R6" 语句和MOV #0x01,R6 语句,第一句执行要2个CLOCK,这个和数据手册相符合,而奇怪的是第二个语句就只要1个CLOCK,
同理,CMP #0X20, R7 语句要2个CLOCK, CMP #0X01,R7语句就只要1个CLOCK。
那贵公司设计的MCU到底是什么回事!令人难以琢磨,能不能有规范的说法!
这个问题我先去咨询下BU,从目前的情况看,语句所消耗的CLOCK不仅和汇编语句相关,而且还和寻址模式相关。实际测试发现二元汇编指令还和立即数相关,初步估计是立即数如果是在常数表中的数据和非常数表的数据所耗的时间也不一样。
关于TST 指令的消耗时间的解答:
TST dsr 指令实际执行的是CMP #0,dst指令,CMP属于MSP430的二元指令,其消耗的CLOCK根据源和目的地址的不同而不同。
从表面看CMP #0,dsr指令用的是src:立即数 dst:寄存器的寻址,而实际上由于源操作数是0, 所以编译器会把#0分配给R3来处理,相当于CMP #0,R7就是执行CMP R3, R7的指令,这样,在查看表3-16的时候,就是看Rn -> Rm那一栏。消耗的时钟就是1个CLOCK。
如果执行CMP #6,R7, 就是立即数和寄存器寻址,看的就是#->Rm那一栏,就要2个CLOCK。
这是MSP430用来节约处理时间的一个创新。所有在常数表中的数,在做立即数处理时,都会被分配到R3寄存器,作为寄存器寻址的模式.这些数包括-1,0,1,2,4,8,255。