打印

STM32F407 的CPU循环指令速度测试

[复制链接]
6037|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
airwill|  楼主 | 2011-12-5 13:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F4DISCOVERY 板 RAM中运行, 用 32Khz 的定时中断来检测 CPU 频率和 icnt 的值.
在main() 里这样处理:

do ; while(--icnt);  

   186:                 do ; while(--icnt);  
0x20000538 1E7F      SUBS          r7,r7,#1
0x2000053A D1FD      BNE           0x20000538
编译后的执行代码: (icnt 就是 r7)

CPU 频率通过测试 Systick 的值来计算, Systick 采用 1/8 HCLK.

void RTC_WKUP_IRQHandler(void) {
static uint32_t wticks, wcnt;
uint32_t cnt = tckcnt, tck = SysTick->VAL;
wsysfrq = (tckcnt - wcnt)* (SysTick->LOAD +1) + wticks - tck;
wcnt = cnt; wticks = tck;
isyscnt = -icnt; icnt = 0;
RTC_ClearITPendingBit(RTC_IT_WUT);
EXTI_ClearITPendingBit(EXTI_Line22);
}

void SysTick_Handler(void) {
tckcnt++;
}  

我现在设定1秒 RTC_WKUP 中断2次, 并通过石英钟比对, 问题不大.

运行中测得: wsysfrq = 0xA036DC  计算得 cpu 频率 167996864Hz
测得: isyscnt = 0xD58DA6    计算得 0.5S 执行了循环 13995430次.
这样 1秒可以执行 27990860 次
0x20000538 1E7F      SUBS          r7,r7,#1
0x2000053A D1FD      BNE           0x20000538
这样的循环.
于是算得 这个循环需要 6 个 CPU 时间!
这么长!
沙发
香水城| | 2011-12-5 13:58 | 只看该作者
打开ARM加速器了吗?如果没有则不奇怪。

使用特权

评论回复
板凳
香水城| | 2011-12-5 14:01 | 只看该作者
忘记问一句,设定了几个Flash的等待周期?

使用特权

评论回复
地板
airwill|  楼主 | 2011-12-5 15:12 | 只看该作者
在 RAM 中运行, 是没有 ART 的支持的

使用特权

评论回复
5
seawwh| | 2011-12-5 16:25 | 只看该作者
请问搂主程序中的下面中断发生的频率是多少? 建议关闭这个中断再测。

void SysTick_Handler(void) {
tckcnt++;
}

使用特权

评论回复
6
airwill|  楼主 | 2011-12-5 16:37 | 只看该作者
楼上的问题问得好, 如果这个中断太频繁会影响精度.
SysTick 的中断频率是 1KHz, 基本不会影响测试结果.

使用特权

评论回复
7
seawwh| | 2011-12-5 16:39 | 只看该作者
关闭这个中断再测的结果如何?

使用特权

评论回复
8
seawwh| | 2011-12-6 10:22 | 只看该作者
我以前在72M的F103上做过了一个延时程序, 在Flash中运行,结果是大约22条指令/us,这还没有考虑子程序的进入和退出时间。
    考虑搂主的测试结果,168M下每条指令需要6个时钟,那么 28条/us,这个结果和72M的F103相仿。
这显然有些不合逻辑。LZ是否可在Flash中打开加速器测试一下?
    这是我用的延时程序(72M 时钟下的)
void Delay_us(u32 T) {
  T=T*11;
  while (T) T--;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入 TI 模拟技术论坛!

556

主题

17724

帖子

884

粉丝