TA的每日心情 | 奋斗 2024-9-22 22:20 |
---|
签到天数: 944 天 连续签到: 1 天 [LV.10]以坛为家III
|
本帖最后由 9robot 于 2017-4-30 14:56 编辑
GD32F450性能很强悍,但是到底有多强呢?今天就试一试,拿Coremark跑个分呗。简单说Coremark的移植过程,之前在STM32F7上移植过,这次就很快完成移植了。
1、首先,选择一个完整的模板,主频设定在200M,把串口调试好,因为之后是采用出口输出跑分结果的。小红板主芯片的PD8、PD9和USB转TTL的芯片连接,可以向电脑发送数据,这里选择了去配置USART2,并重定向了printf函数,可以向串口助手打印数据,简化了结果输出。
2、下载好Coremark文件,可以直接去官网下载
3、将模板的启动文件改一下,把初始化时的堆栈改大一些,否则会出现问题,默认的都是0X00000400,这里我改成了0X00002000。
4、在工程中新建Coremark文件夹,将一下文件复制进去
5、在工程里添加文件,并包含头文件路径
6、添加初始化代码
1) portable_init 函数
Core_portme.c 中的 portable_init 函数在 Core_main.c 的 main 函数中首先被调用, 平台的初始化的函数(时钟, GPIO, 串
口) 可以放在这里。 将Main 函数中的初始化代码复制到 portable_init 函数中。- void portable_init(core_portable *p, int *argc, char *argv[])
- {
- systick_config();
- //led_init();
-
- gd_eval_com_init();
-
- ee_printf("it is OK\r\n");
-
-
- if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) {
- ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n");
- }
- if (sizeof(ee_u32) != 4) {
- ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n");
- }
- p->portable_id=1;
- }
复制代码 添加头文件- #include <inttypes.h>
- #include "gd32f4xx.h"
- #include "systick.h"
- #include <stdio.h>
- #include "usart.h"
复制代码 删除main函数,因为 Core_main.c中已经有了main函数
2)修改计时相关代码
start_time/ stop_time/ get_time 这几个函数,是 coremark 程序运行时计算程序运行时间所用。 这里使用 system tick 进行计
时, system tick 配置为 1ms 的中断间隔。 system tick 中断函数中更新 Tick 的值,每进一次中断加 1。 所以还需要修改
system tick 的中断处理函数。
1)在 Core_portme.c 中按下表找到需要修改的地方, 并按表格的内容进行修改:- void start_time(void) {
- //GETMYTIME(&start_time_val );
- Tick=0;
- SysTick_Config(SystemCoreClock/1000);
-
- }
复制代码- void stop_time(void) {
- //GETMYTIME(&stop_time_val );
- SysTick->CTRL&=SysTick_Counter_Disable;
- SysTick->VAL=SysTick_Counter_Clear;
-
- }
复制代码- CORE_TICKS get_time(void) {
- // CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val));
- // return elapsed;
- CORE_TICKS elapsed=(CORE_TICKS)Tick;
- return elapsed;
-
-
- }
复制代码 添加变量
#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;
7、修改systick中断函数- void delay_decrement(void)
- {
- extern __IO uint32_t Tick;
-
- Tick++;
- if (0U != delay){
- delay--;
- }
-
- }
复制代码 8、CoreMark 运行配置
1) 设置迭代次数
CoreMark 要求程序运行的最短时间至少是 10s, 根据使用的系统时钟等情况,可以在 Core_portme.h 中修改迭代次数。
#define ITERATIONS 12000
2) 设置打印信息
根据具体所用的编译器版本,优化配置进行修改。
3) 修改优化等级。将优化等级设定到最高
9、编译没有问题后下载到板子上,打开串口助手,按下复位按键,等一会就可以看到跑分结果
经过优化后GD32F450最高可以跑521分,如果不优化的话,基本只能到260多,因为我用的是MKD5,跑分结果应该会比IAR低一些,STM32F407的官方数据是在168M主频时可以跑566分,应该是在IAR环境下的结果;STM32F413在100M主频时可以跑339分,应该也是IAR环境下的结果,在论坛里查了一下,采用MDK跑分,STM32F413基本在260分左右。简单算了一下,GD32如果跑100M,应该也在260左右,(实际将主频降到120M后,分数为310),GD32F450的性能与STM32的大致相当,毕竟都是Cortex—M4的内核,但是GD32F450的主频更高,性能自然会提升一部分。
|
|