如果是用keil的话,可以按菜单上的debug进入调试模式,然后可以看到左边多了一个窗口,里面会显示当前各个寄存器、堆栈、PC指针的值,其中有一个项是sec,就是表示程序运行时间的。
想知道一条指令的执行时间,可以把PC指针指向这条指令,然后在下一条指令处设置断点,先按“reset”清零一下sec的值,再按“RUN”运行程序,从sec处就可以知道这条指令的运行时间了。
如果定义为i uint32_t的话,在iar里面应该是三条汇编,既一条递加,一条比较,一条跳转。一条指令为6个机器周期,所以总共时间应该是i*3*6个机器周期,如果系统时间为72mhz,一条机器周期为1/72m。大概应该是这样。
SysTick 就是一个定时器而已,只是它放在了NVIC(嵌套中断控制器)中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断)。
滴答中断:操作系统进行运转的时候,也会有“心跳”。
它会根据“心跳”的节拍来工作,把整个时间段分成很多小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。
这个心跳,可以通过定时器来周期性触发,而这个定时器就是systick。很明显,这个“心跳”是不允许任何人来随意地访问和修改的。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。
{
SysTick_Current=0; //当前值为0
SysTick_Reload=72000; //重装载寄存器,系统时钟72M,中断一次1mS(1ms=0.001s=1/72M*72000)
TimingDelay =nTime; // 读取延时时间
SysTick_CSR=0x07; // 使能SysTick计数器
while(TimingDelay!= 0); // 判断延时是否结束
SysTick_CSR=0x06;// 关闭SysTick计数器
}
void Delay_Nus(uint32_t nTime) //us级的延时函数
{ SysTick_Current=0;
SysTick_Reload=72; //重装载寄存器,系统时钟20M中断一次1mS
TimingDelay=nTime;
SysTick_CSR=0x07; // 使能SysTick计数器
while(TimingDelay!= 0); // 判断延时是否结束
SysTick_CSR=0x06;// 关闭SysTick计数器 }
时钟每跳1兆次,可以执行1.25兆条指令。指令周期=时钟周期*1.25,时钟周期是1/72mhz,故指令周期是(1.25/72mhz)约是0.0174us。
stm32 属于ARM CortexM3,多数指令是单周期的。
cortex-m3是三级流水线,同时执行3条指令,指令周期不定,分支指令也可能清空流水线,导致预先执行的指令失效。
ARM官方的数字是1.25MIPS/MHz,我的理解就是每个周期平均执行1.25条指令。
扩展资料:
计算机之所以能自动地工作,是因为CPU能从存放程序的内存里取出一条指令并执行这条指令;紧接着又是取指令,执行指令,如此周而复始,构成了一个封闭的循环。除非遇到停机指令,否则这个循环将一直继续下去。
指令周期 :CPU从内存取出一条指令并执行这条指令的时间总和。
CPU周期 :又称机器周期,CPU访问一次内存所花的时间较长,因此用从内存读取一条指令字的最短时间来定义。
时钟周期: 通常称为节拍脉冲或T周期。一个CPU周期包含若干个时钟周期。
参考资料来源:百度百科-指令周期
单条指令执行时间:STM32F10X单片机在主频为72MHz下,C语言程序执行一条指令需要的时间可认为10ns~100ns。
开启一个定时器,在程序当前行和下一行代码上打上断点,调试,运行至代码处,查看定时器计数寄存器值,再运行,继续查看定时器寄存器值,计算出时间差。
看程序被编译的汇编代码,通过汇编代码执行周期数计算时间。
本文标签:stm32测试运行时间