本帖最后由 [鑫森淼焱垚] 于 2024-12-27 10:07 编辑
书接上文,有了 perf_counter 加持,无需再次移植 Coremark,因为 perf_counter 已经集成了 Coremark。我们仅需修改一些配置文件和代码即可运行 Coremark。
1 修改点
1.1 修改代码
main() 函数修改如下,在调用 init_cycle_counter() 初始化 perf_counter 之后,再使用 __cycleof__() 统计 LED2 翻转速度,最后调用 coremark_main() 开始运行Coremark。
int main(void)
{
system_clock_config();
at32_board_init();
init_cycle_counter(false);
button_exint_init();
uart_print_init(115200);
printf("at32 mcu initialize ok.\r\n");
for (int i = 5; i > 0; i--) {
__cycleof__("LED2 toggle")
{
at32_led_toggle(LED2);
}
}
#ifdef __PERF_COUNTER_COREMARK__
coremark_main();
#endif
while (1);
}
1.2 修改工程属性增加两个宏定义
按照如下操作,给工程增加两个宏定义
- __PERF_COUNTER_COREMARK__ 只有定义了这个宏, perf_counter 组件才会使能 Coremark
- MEM_METHOD=MEM_STATIC 设置 Coremark 运行过程中的数据分配形式,这里使用静态数组,编译时就能确定数组地址
2 Coremark 跑分
代码中修改 Coremark 编译器优化等级的字符串位置如下:
AT32IDE 修改优化等级,按如下步骤操作:
2.1 优化等级 Optimize for Debug -Og
Debug 版本配置编译(其他都是 Release 版本配置)
2.2 优化等级 None -O0
2.3 优化等级 Optimize -O1
2.4 优化等级 Optimize more -O2
2.5 优化等级 Optimize most -O3
2.6 优化等级 Optimize size -Os
2.7 优化等级 Optimize fast -Ofast
2.8 统计对比
这些测试都是在供电电压 1.8V 、处理器时钟 80MHz 时测试的,又追加了一轮供电电压 3.3V,测试结果无差异。
优化等级
| LED2 Toggle 周期
| Coremark 分数
| -Og (Debug)
| 144.2
| 0.468221
| -O0 (None)
| 138.4
| 0.468212
| -O1 ()
| 53.6
| 1.605016
| -O2 (more)
| 46.8
| 1.846440
| -O3 (most)
| 69
| 1.811975
| -Os (size)
| 62
| 1.132000
| -Ofast (fast)
| 47.0
| 1.811990
|
从上面的数据可以看出 -Og Debug 模式速度最慢,而其他优化等级速度大约是它的4倍左右,差异还是很明显的。
|