1赞

3回答

2收藏

GD32F450——Coremark跑分

GD32 GD32 5837 人阅读 | 3 人回复 | 2017-04-30

本帖最后由 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 函数中。
  1. void portable_init(core_portable *p, int *argc, char *argv[])
  2. {
  3.         systick_config();
  4.     //led_init();
  5.         
  6.           gd_eval_com_init();
  7.    

  8.         ee_printf("it is OK\r\n");
  9.         
  10.         
  11.         if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) {
  12.                 ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n");
  13.         }
  14.         if (sizeof(ee_u32) != 4) {
  15.                 ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n");
  16.         }
  17.         p->portable_id=1;
  18. }
复制代码
添加头文件
  1. #include <inttypes.h>
  2. #include "gd32f4xx.h"
  3. #include "systick.h"
  4. #include <stdio.h>
  5. #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 中按下表找到需要修改的地方, 并按表格的内容进行修改:
  1. void start_time(void) {
  2.         //GETMYTIME(&start_time_val );
  3.         Tick=0;
  4.         SysTick_Config(SystemCoreClock/1000);
  5.         
  6. }

复制代码
  1. void stop_time(void) {
  2.         //GETMYTIME(&stop_time_val );

  3.         SysTick->CTRL&=SysTick_Counter_Disable;
  4.         SysTick->VAL=SysTick_Counter_Clear;
  5.         
  6. }
复制代码
  1. CORE_TICKS get_time(void) {
  2. //        CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val));
  3. //        return elapsed;
  4.         CORE_TICKS elapsed=(CORE_TICKS)Tick;
  5.         return elapsed;
  6.         
  7.         
  8. }
复制代码
添加变量

#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中断函数
  1. void delay_decrement(void)
  2. {
  3.                 extern __IO uint32_t Tick;
  4.    
  5.           Tick++;
  6.     if (0U != delay){
  7.         delay--;
  8.     }
  9.         
  10. }
复制代码
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的主频更高,性能自然会提升一部分。


GD32F450_Coremark.zip

332.45 KB, 下载次数: 39

如何将coremark程序移植到STM32上.pdf

1.12 MB, 下载次数: 46

分享到:
回复

使用道具 举报

回答|共 3 个

倒序浏览

沙发

suoma

发表于 2017-4-30 22:33:55 | 只看该作者

谢谢分享学习一下
板凳

stary666

发表于 2017-5-2 09:31:11 | 只看该作者

下载看看;,,,,
地板

Veikoboy

发表于 2017-5-4 13:47:28 | 只看该作者

mark mark mark mark
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条