将 CoreMark CPU跑分程序移植到 ESP32 上
Posted: Wed Nov 21, 2018 2:01 pm
Html:
http://blog.emake.run/CoreMark.html
Markdown:
## 将 CoreMark CPU跑分程序移植到 ESP32 上
_测试中,未针对ESP32优化, 仅供参考_
[前言]
- 衡量处理器的一个重要指标是功耗,另外一个重要指标便是性能。在处理器领域的 Benchmarks 非常众多,有某些个人开发的程序,也有某些标准组织,或者商业公司开发的Benchmarks, 本文在此不加以一一枚举。 在嵌入式处理器领域最为知名和常见的 Benchmarks 为Dhrystone 和 CoreMark。
- CoreMark是一个综合基准,用于测量嵌入式系统中使用的中央处理器(CPU)的性能。它是在2009由eembc的shay gal-on开发的,旨在成为一个行业标准,取代过时的dehrystone基准。代码用C编写,包含以下算法:列表处理(增删改查和排序)、矩阵操作(公共矩阵操作)、状态机(确定输入流是否包含有效数字)和CRC。用户可以自由的下载Coremark,并移植到自己的平台上运行,随后就可以看到分数。
[在ESP32上新建CoreMark工程]
- 拷贝hello_world例程
```bash
cp -r $IDF_PATH/examples/get-started/hello_world CoreMark
```
- clone `coremark`
```bash
cd CoreMark
git clone https://github.com/eembc/coremark.git
```
- 将测试代码拷贝出来
```bash
cd coremark
cp core_list_join.c core_main.c coremark.h core_matrix.c core_state.c core_util.c simple/core_portme.c simple/core_portme.h ../main/
cd ..
rm -rf coremark main/hello_world_main.c
```
- 修改`core_portme.c`文件
- 将`ITERATIONS`替换为你需要的迭代次数
- 38行
```c
volatile ee_s32 seed4_volatile=ITERATIONS;
```
->
```c
volatile ee_s32 seed4_volatile=10000;
```
- 修改`core_portme.h`文件
- 将`FLAGS_STR`替换为`"-Os"`
- 77行
```c
#define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */
```
->
```c
#define COMPILER_FLAGS "-Os" /* "Please put compiler flags here (e.g. -o3)" */
```
- 将`MAIN_HAS_NOARGC`宏定义为1
- 159行
```c
#define MAIN_HAS_NOARGC 0
```
->
```c
#define MAIN_HAS_NOARGC 1
```
- 修改`core_main.c`文件
- 将`main`替换为`app_main`
- 89行
```c
MAIN_RETURN_TYPE main(void) {
```
->
```c
MAIN_RETURN_TYPE app_main(void) {
```
- 将`%lu`替换为`%u`
- 287行
```c
ee_printf("CoreMark Size : %lu\n",(ee_u32)results[0].size);
```
->
```c
ee_printf("CoreMark Size : %u\n",(ee_u32)results[0].size);
```
- 288行
```c
ee_printf("Total ticks : %lu\n",(ee_u32)total_time);
```
->
```c
ee_printf("Total ticks : %u\n",(ee_u32)total_time);
```
- 303行
```c
ee_printf("Iterations : %lu\n",(ee_u32)default_num_contexts*results[0].iterations);
```
->
```c
ee_printf("Iterations : %u\n",(ee_u32)default_num_contexts*results[0].iterations);
```
- 配置`menuconfig`
```bash
make menuconfig
```
- 调整编译优化等级
`Compiler options → Optimization Level`
```bash
(X) Debug (-Og)
( ) Release (-Os)
```
->
```bash
( ) Debug (-Og)
(X) Release (-Os)
```
- 关闭`watchdog`
`Component config → ESP32-specific`
```bash
[*] Interrupt watchdog
```
->
```bash
[ ] Interrupt watchdog
```
- 调整`CPU frequency`
`Component config → ESP32-specific → CPU frequency`
```bash
( ) 80MHz
(X) 160MHz
( ) 240MHz
```
->
```bash
( ) 80MHz
( ) 160MHz
(X) 240MHz
```
- 目录树
```bash
tree -L 2
.
├── CMakeLists.txt
├── main
│ ├── CMakeLists.txt
│ ├── component.mk
│ ├── core_list_join.c
│ ├── core_main.c
│ ├── coremark.h
│ ├── core_matrix.c
│ ├── core_portme.c
│ ├── core_portme.h
│ ├── core_state.c
│ └── core_util.c
├── Makefile
├── README.md
├── sdkconfig
└── sdkconfig.old
```
- 编译下载
```bash
make -j4 flash monitor
```
[测试结果]
```bash
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 28190
Total time (secs): 28.190000
Iterations/Sec : 354.735722
Iterations : 10000
Compiler version : GCC5.2.0
Compiler flags : -Os
Memory location : STACK
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0x988c
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 354.735722 / GCC5.2.0 -Os / STACK
```
http://blog.emake.run/CoreMark.html
Markdown:
## 将 CoreMark CPU跑分程序移植到 ESP32 上
_测试中,未针对ESP32优化, 仅供参考_
[前言]
- 衡量处理器的一个重要指标是功耗,另外一个重要指标便是性能。在处理器领域的 Benchmarks 非常众多,有某些个人开发的程序,也有某些标准组织,或者商业公司开发的Benchmarks, 本文在此不加以一一枚举。 在嵌入式处理器领域最为知名和常见的 Benchmarks 为Dhrystone 和 CoreMark。
- CoreMark是一个综合基准,用于测量嵌入式系统中使用的中央处理器(CPU)的性能。它是在2009由eembc的shay gal-on开发的,旨在成为一个行业标准,取代过时的dehrystone基准。代码用C编写,包含以下算法:列表处理(增删改查和排序)、矩阵操作(公共矩阵操作)、状态机(确定输入流是否包含有效数字)和CRC。用户可以自由的下载Coremark,并移植到自己的平台上运行,随后就可以看到分数。
[在ESP32上新建CoreMark工程]
- 拷贝hello_world例程
```bash
cp -r $IDF_PATH/examples/get-started/hello_world CoreMark
```
- clone `coremark`
```bash
cd CoreMark
git clone https://github.com/eembc/coremark.git
```
- 将测试代码拷贝出来
```bash
cd coremark
cp core_list_join.c core_main.c coremark.h core_matrix.c core_state.c core_util.c simple/core_portme.c simple/core_portme.h ../main/
cd ..
rm -rf coremark main/hello_world_main.c
```
- 修改`core_portme.c`文件
- 将`ITERATIONS`替换为你需要的迭代次数
- 38行
```c
volatile ee_s32 seed4_volatile=ITERATIONS;
```
->
```c
volatile ee_s32 seed4_volatile=10000;
```
- 修改`core_portme.h`文件
- 将`FLAGS_STR`替换为`"-Os"`
- 77行
```c
#define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */
```
->
```c
#define COMPILER_FLAGS "-Os" /* "Please put compiler flags here (e.g. -o3)" */
```
- 将`MAIN_HAS_NOARGC`宏定义为1
- 159行
```c
#define MAIN_HAS_NOARGC 0
```
->
```c
#define MAIN_HAS_NOARGC 1
```
- 修改`core_main.c`文件
- 将`main`替换为`app_main`
- 89行
```c
MAIN_RETURN_TYPE main(void) {
```
->
```c
MAIN_RETURN_TYPE app_main(void) {
```
- 将`%lu`替换为`%u`
- 287行
```c
ee_printf("CoreMark Size : %lu\n",(ee_u32)results[0].size);
```
->
```c
ee_printf("CoreMark Size : %u\n",(ee_u32)results[0].size);
```
- 288行
```c
ee_printf("Total ticks : %lu\n",(ee_u32)total_time);
```
->
```c
ee_printf("Total ticks : %u\n",(ee_u32)total_time);
```
- 303行
```c
ee_printf("Iterations : %lu\n",(ee_u32)default_num_contexts*results[0].iterations);
```
->
```c
ee_printf("Iterations : %u\n",(ee_u32)default_num_contexts*results[0].iterations);
```
- 配置`menuconfig`
```bash
make menuconfig
```
- 调整编译优化等级
`Compiler options → Optimization Level`
```bash
(X) Debug (-Og)
( ) Release (-Os)
```
->
```bash
( ) Debug (-Og)
(X) Release (-Os)
```
- 关闭`watchdog`
`Component config → ESP32-specific`
```bash
[*] Interrupt watchdog
```
->
```bash
[ ] Interrupt watchdog
```
- 调整`CPU frequency`
`Component config → ESP32-specific → CPU frequency`
```bash
( ) 80MHz
(X) 160MHz
( ) 240MHz
```
->
```bash
( ) 80MHz
( ) 160MHz
(X) 240MHz
```
- 目录树
```bash
tree -L 2
.
├── CMakeLists.txt
├── main
│ ├── CMakeLists.txt
│ ├── component.mk
│ ├── core_list_join.c
│ ├── core_main.c
│ ├── coremark.h
│ ├── core_matrix.c
│ ├── core_portme.c
│ ├── core_portme.h
│ ├── core_state.c
│ └── core_util.c
├── Makefile
├── README.md
├── sdkconfig
└── sdkconfig.old
```
- 编译下载
```bash
make -j4 flash monitor
```
[测试结果]
```bash
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 28190
Total time (secs): 28.190000
Iterations/Sec : 354.735722
Iterations : 10000
Compiler version : GCC5.2.0
Compiler flags : -Os
Memory location : STACK
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0x988c
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 354.735722 / GCC5.2.0 -Os / STACK
```