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 时间!
这么长! |