【GD32E503评测】GD32E503VET6 性能测试
[复制链接]
2.4 GD32E503VET6 性能测试
2.4.1 指标初步分析
使用GD32E503开发产品,研发工程师基本会考虑两个指标:功耗和性能。
功耗非常难算的,而且跟硬件使用频率、环境及程序等相关。按照功能接口把单片机的功耗按照下面的划分:内部功耗(与频率有关)、数字输入输出口、输入口、模拟接口等。我们直接引用GD32E5032 datasheet资料,查询资料如下:
如何综合考虑GD32E503各方面性能?在嵌入式处理器领域,常见测试CPU性能方法有:Dhrystone 和 CoreMark。Dhrystone方法陈旧,且 一直没有更新,我也没有没有移植成功,因此本文将借助于CoreMark测试方法。
CoreMark标准于2009年由EEMBC组织的Shay Gla-On提出,并且试图将其发展成为工业标准,从而代替陈旧的Dhrystone标准。
CoreMark is a simple, yet sophisticated benchmark that is designed specifically to test the functionality of a processor core. Running CoreMark produces a single-number score allowing users to make quick comparisons between processors.
CoreMark跑分是通过运行C语言代码得出来的分数。主要包含如下的运算法则:列举(寻找并排序),数学矩阵操作(普通矩阵运算)和状态机(用来确定输入流中是否包含有效数字),最后还包括CRC(循环冗余校验)。
2.4.2 CoreMark核心程序
参考CoreMark官网信息,地址:https://www.eembc.org/coremark/index.php
最新版本是1.0。
2.4.3 兆易创新(GigaDevice)官方开发包
下载兆易创新(GigaDevice) GD32E50x_Demo
2.4.4 集成开发环境为IAR EWARM
Fig 33 IAR版本示意图
2.4.5 移植CoreMark程序
首先,选择一个完整的模板,以demo例程中,串口例程04_USART_Printf 为模板进行配置,简化了配置过程。
Fig 34 开发板UART0原理图
由于GD32E503V-EVAL开发板核心芯片GD32E503VET6的处理器操作频率最高位180MHz,推荐将主频设定在180M。我没有修改。
将初始化时的堆栈改大一些,否则会出现问题,默认的都是0X00000800,这里我改成了0X00002000。
开启 options > linker >Override default > Edit,修改为:0x2000
新建Coremark文件夹,添加Coremark程序
在工程里添加文件,并包含头文件路径
(1) Core_portme.c 添加初始化代码
1) portable_init 函数
Core_portme.c 中的 portable_init 函数在 Core_main.c 的 main 函数中首先被调用, 平台的初始化的函数(时钟, GPIO, 串口) 可以放在这里。 将Main 函数中的初始化代码复制到 portable_init 函数中。
2) 添加变量和函数
#define SysTick_Counter_Disable ((uint32_t)0xFFFFFFFE)
#define SysTick_Counter_Enable ((uint32_t)0x00000001)
#define SysTick_Counter_Clear ((uint32_t)0x00000000)
__IO uint32_t Tick;
3) 添加头文件
4) 删除main函数,因为Core_main.c有main函数
5) 修改计时器代码
start_time/ stop_time/ get_time 这几个函数,是 coremark 程序运行时计算程序运行时间所用。 这里使用 system tick 进行计时, system tick 配置为 1ms 的中断间隔。 system tick 中断函数中更新 Tick 的值,每进一次中断加 1。 所以还需要修改system tick 的中断处理函数。 Core_portme.c 中按下表找到需要修改的地方
start_time(void)
{
//GETMYTIME(&start_time_val);
Tick=0;
SysTick_Config(SystemCoreClock/1000);
}
stop_time(void)
{
//GETMYTIME(&stop_time_val);
SysTick->CTRL&=SysTick_Counter_Disable;
SysTick->VAL=SysTick_Counter_Clear;
}
get_time(void)
{
CORE_TICKS elapsed=(CORE_TICKS)Tick;
return elapsed;
}
6) 注释无用语句
//#define NSECS_PER_SEC CLOCKS_PER_SEC
//#define CORETIMETYPE clock_t
//#define GETMYTIME(_t) (*_t = clock())
//#define MYTIMEDIFF(fin, ini) ((fin) - (ini))
//#define TIMER_RES_DIVIDER 1
//#define SAMPLE_TIME_IMPLEMENTATION 1
//static CORETIMETYPE start_time_val, stop_time_val;
7) 其他
#define EE_TICKS_PER_SEC 1000
关联printf函数
/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
usart_data_transmit(EVAL_COM0, (uint8_t)ch);
while (RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE));
return ch;
}
(2) 修改systick.c函数
(3) 运行配置
CoreMark 要求程序运行的最短时间至少是 10s, 根据使用的系统时钟等情况,可以在 Core_portme.h 中修改迭代次数。
#define ITERATIONS 12000
(4) CoreMark运行配置
1) 设置迭代次数
CoreMark要求程序运行的最短时间至少是10s, 根据使用的系统时钟等情况,可以在Core_portme.h中修改迭代次数。
#define ITERATIONS 12000
2) 设置打印信息
根据具体所用的编译器版本,优化配置进行修改。在Core_portme.h中修改
找到 COMPILER_FLAGS修改为
#ifndef COMPILER_FLAGS
#define COMPILER_FLAGS "-Ohs -no_size_constraints"
#endif
3) 优化等级
2.4.6 CoreMark结果
(我没有修改主频,结果如下;)
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 23833
Total time (secs): 23.833000
Iterations/Sec : 503.503546
Iterations : 12000
Compiler version : Please put compiler version here (e.g. gcc 4.1)
Compiler flags : -Ohs -no_size_constraints
Memory location : STACK
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0xd340
Correct operation validated. See README.md for run and reporting rules.
CoreMark 1.0 : 503.503546 / Please put compiler version here
(e.g. gcc 4.1) -Ohs -no_size_constraints / STACK
|