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.

关于asm(" NOP")和asm(" RPT #N || NOP")占用的时钟周期

关于asm(" RPT #0 || NOP");这个语句很让我头疼,

我在ccs寄存器窗口里观察cputimer0tim的值,发现
asm(" NOP");)执行完这句减2;

asm(" RPT #0 || NOP")执行完这句减3,
asm(" RPT #255 || NOP")执行完这句减258,
asm(" RPT #256 || NOP")执行完这句再次变成了减3,
asm(" RPT #511 || NOP")执行完这句再次变成了减258

  • 建议你直接看一下反汇编是咋回事吧,

    注意一下是否有开优化等级。

    asm(" RPT #256 || NOP")执行完这句再次变成了减3。

    另外,如果想延时,建议可以直接调用DELAY_US函数。

    ERIC

  • 第一,你的测试方法有问题,RPT汇编语句如果是立即数测试方式,操作数应该是一个8位数据,最大不超过255,所以你给256就溢出魏0了,给511就又溢出为255了。

    第二,你用timer测试,看到的执行系统时钟数会多一个系统时钟,所以nop指令其实只占用一个系统时钟

    第三,如果是 RPT #0 || NOP,那就会占用两个系统时钟,因为RPT指令如果操作数是立即数,本身就会占用一个系统时钟,然后NOP还会占用一个系统时钟。所以这就是为什么你测试出来这个语句是3个系统时钟的原因,但是无论立即数是多少,RPT指令执行一次就占用一个系统时钟,区别只是NOP重复多少次。

    建议你好好阅读C2000汇编语言手册:SPRU430E

  • SPRU430E我有,请问一般什么时候用C,什么时候用汇编?

  • 你指的是用NOP指令延时还是用Delayus函数吗?

  • 当你只需要延时一个系统周期,或者几个精准系统周期的时候就用nop,如果时间要长一点,比如一两个us,就用C语言。