在 Assembly 中为德州仪器微控制器编写延迟函数
Writing a delay function in Assembly for a Texas Intruments microcontroller
我正在为 TI TMS320F28379D 微控制器编程。我需要编写一个延迟函数,其中时间单位是 CPU 周期。 Texas Instruments 提供了这样一个已经在汇编中实现的延迟函数。这是:
_F28x_usDelay:
SUB ACC, #1
BF _F28x_usDelay, GEQ
LRETR
平时我都是用C和C++写代码,对汇编只有基本的了解。这个功能非常简单。第一条指令从累加器寄存器中减1,然后使用分支指令BF 不断循环直到累加器中存储的值大于或等于0。LRETR 只是一条返回指令。
现在,必须知道每个循环需要多少个 CPU 循环。 TI 代码附带以下文档:
There is a 9/10 cycle overhead and each loop takes five cycles. The loop count is given by the following formula:
DELAY_CPU_CYCLES = 9 + 5*LoopCount
我不明白什么是“9/10 循环开销”以及为什么加 9 得到 DELAY_CPU_CYCLES。谁能给我解释一下?谢谢。
此 link 描述了 overhead 在这种情况下的一般含义。
在这个例子中,开销是不包括在循环中的循环,它们是用于调用和从函数中 return 的循环。根据记录的等式,执行循环的单次迭代需要 5 个周期,而仅从函数调用和 return 就需要 9 个周期的开销。例如,LRETR 指令不是循环的一部分,而是开销的一部分。
描述中的“9/10”可能是“9 或 10”的意思。调用函数和从函数 returning 的开销可能需要 9 或 10 个周期,具体取决于从何处调用它或管道问题。
我正在为 TI TMS320F28379D 微控制器编程。我需要编写一个延迟函数,其中时间单位是 CPU 周期。 Texas Instruments 提供了这样一个已经在汇编中实现的延迟函数。这是:
_F28x_usDelay:
SUB ACC, #1
BF _F28x_usDelay, GEQ
LRETR
平时我都是用C和C++写代码,对汇编只有基本的了解。这个功能非常简单。第一条指令从累加器寄存器中减1,然后使用分支指令BF 不断循环直到累加器中存储的值大于或等于0。LRETR 只是一条返回指令。
现在,必须知道每个循环需要多少个 CPU 循环。 TI 代码附带以下文档:
There is a 9/10 cycle overhead and each loop takes five cycles. The loop count is given by the following formula: DELAY_CPU_CYCLES = 9 + 5*LoopCount
我不明白什么是“9/10 循环开销”以及为什么加 9 得到 DELAY_CPU_CYCLES。谁能给我解释一下?谢谢。
此 link 描述了 overhead 在这种情况下的一般含义。
在这个例子中,开销是不包括在循环中的循环,它们是用于调用和从函数中 return 的循环。根据记录的等式,执行循环的单次迭代需要 5 个周期,而仅从函数调用和 return 就需要 9 个周期的开销。例如,LRETR 指令不是循环的一部分,而是开销的一部分。
描述中的“9/10”可能是“9 或 10”的意思。调用函数和从函数 returning 的开销可能需要 9 或 10 个周期,具体取决于从何处调用它或管道问题。