使用现代CPU(例如ARM)进行周期计数
在许多应用中,其指令执行与预期的输入激励具有已知时序关系的CPU可以处理如果该关系未知则需要更快CPU的任务。例如,在我使用PSOC生成视频的项目中,我使用代码每16个CPU时钟输出一个字节的视频数据。由于测试SPI设备是否准备就绪,如果不进行分支转移,则IIRC将花费13个时钟,加载和存储输出数据将花费11个时钟,因此无法测试该设备在字节之间的准备情况;取而代之的是,我只是安排让处理器在第一个字节之后的每个字节上精确执行价值16个周期的代码(我相信我使用了实际索引加载,虚拟索引加载和存储)。每行的第一次SPI写操作发生在视频开始之前,对于随后的每次写操作,都有一个16周期的窗口,在该窗口中可以进行写操作而不会导致缓冲区溢出或欠载。分支循环生成了一个13周期的不确定性窗口,但是可预测的16周期执行意味着所有后续字节的不确定性都将适合相同的13周期窗口(又适合于当写入可接受时的16周期窗口内)发生)。 对于较旧的CPU,指令时序信息是清晰,可用且明确的。对于较新的ARM,时序信息似乎更加模糊。我了解从闪存执行代码时,缓存行为会使事情难以预测,因此我希望应该从RAM执行任何周期计数的代码。即使从RAM执行代码,规范也有些含糊。使用循环计数代码仍然是一个好主意吗?如果是这样,使它可靠工作的最佳技术是什么?可以安全地假设某个芯片供应商不会在某种程度上悄无声息地使用“新改进的”芯片,从而在某些情况下缩短了某些指令的执行周期的程度? 假设以下循环在一个字边界上开始,那么如何根据规范精确地确定将花费多长时间(假设具有零等待状态内存的Cortex-M3;对于该示例,与系统无关的其他内容)。 myloop: mov r0,r0; 简短的简单说明,可以预取更多说明 mov r0,r0; 简短的简单说明,可以预取更多说明 mov r0,r0; 简短的简单说明,可以预取更多说明 mov r0,r0; 简短的简单说明,可以预取更多说明 mov r0,r0; 简短的简单说明,可以预取更多说明 mov r0,r0; 简短的简单说明,可以预取更多说明 加r2,r1,#0x12000000; 2字指令 ; 重复以下操作,可能使用不同的操作数 ; 将继续增加价值直到发生进位 itcc addcc r2,r2,#0x12000000; 2字指令,加上itcc的额外“字” itcc addcc r2,r2,#0x12000000; 2字指令,加上itcc的额外“字” itcc addcc r2,r2,#0x12000000; 2字指令,加上itcc的额外“字” itcc addcc r2,r2,#0x12000000; 2字指令,加上itcc的额外“字” ; ... etc,带有更多条件的两个单词的指令 子R8,R8,#1 bpl myloop …