打印
[信息]

【实战经验】如何将CoreMark程序移植到STM32上

[复制链接]
3317|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 香水城 于 2017-8-16 11:04 编辑

如何将CoreMark程序移植到STM32上

前言
CoreMark是一项测试处理器性能的基准测试。代码使用C语言写成,包含:列举,数学矩阵操作和状态及CRC等运算法则。目前CoreMark已迅速成为测量与比较处理器性能的业界标准基准测试。CoreMark的得分越高,意味着性能更高。在CoreMark的官网上可以大家可以看到各家处理器型号的CoreMark得分。也可以从CoreMark的官网上下载测试代码,亲自测一下自己手中的片子的性能。CoreMark官网的连接地址:
http://www.eembc.org/coremark/index.php。本文将一步步来介绍如何将下载的CoreMark测试代码移植到STM32MCU上进行测试。
下载CoreMark测试代码
通过上文给出的链接进到CoreMark官网。
点击Download,

根据页面的指导,先注册再下载测试代码
CoreMark的测试代码文件包括:
 core_list_join.c
 core_main.c
 core_matrix.c
 core_state.c
 core_util.c
 coremark.h
 simple/core_portme.c
 simple/core_portme.h

新建CoreMark STM32工程
1)打开STM32CubeMX,选择新建Project, 在接下来的窗口中选择目标MCU的型号。可以通过MCU筛选器进行筛选,见下图。这里我们选择STM32F746NG。
2)选择使用外部晶振
3)配置时钟
Step1 :PLL source选择外部高速时钟(HSE,25MHz)
Step2 :系统时钟源选择PLLCLK
Step3 :HCLK设置为216MHz,回车后工具会自动计算出合适的PLL配置参数。

4)配置串口
根据所用测试板子具体使用的串口进行配置。这里我们使用的USART1(PA9,PA10端口)。
Step1:使能USART1。
Step2:将USART1重映射到PA9和PA10引脚。可以在右图直接点击对应引脚,在跳出的列表中选择USART的第二功能。不知道引脚的位置可以在上方的Find窗口内输入引脚的名称来查找引脚的位置。
Step3 :到Configuration页面,对串口进行参数配置。

设置串口参数为:
波特率:9600Bits/s
数据长度:8bit(包括奇偶校验位)
校验:ODD
停止位:1 bit
5) 生成IAR项目代码
做完上面的设置后,就可以让CubeMX帮我们生成代码了。
选择Projec-->Generate Code,在跳出的Project配置窗口中指定项目名称和保存路径。选择要使用的工具链,这里选择EWARM。
配置最小堆栈大小。
点击“OK”后,CubeMX会自动在指定路径生成一个IAR的工程。这个工程已经包含了所有用到的底层驱动和并已经添加了系统初始化的代码。

添加CoreMark代码
现在我们已经有了一个初步的项目工程。接下来要做的就是添加CoreMark代码。
1)将前面下载的CoreMark代码文件拷贝到新建的工程中。

2)添加文件到工程
打开新建的工程Coremark_Project。在Application/User目录下新建一个目录Coremark,将core_list_join.c /core_main.c/core_matrix.c/core_state.c/core_util.c这5个文件添加进去。(选中左边工程中User目录->单击右键->Add->Add Group/Add Files)
再将core_portme.c添加到User目录下。
因为core_main.c文件里已经包含了一个main函数,所以需要在工程中将默认创建的main.c文件删除。
完成后的工程文件结构如下:
3)添加include路径
在Options->C/C++ Compiler->Preprocessor下增加include路径:$PROJ_DIR$\..\Src\Coremark。

配置Coremark文件
我们已经添加了所有需要的文件,但现在程序还是不能正常运行。因为默认生成的main.c文件已经被从项目中删除了,我们需要在Core_portme.c中添加初始化的代码,并根据不同的计时方法修改Core_portme.c中计时相关函数和代码。
添加初始化代码
1) portable_init函数
Core_portme.c 中的portable_init函数在Core_main.c的main函数中首先被调用,平台的初始化的函数(时钟,GPIO,串口,缓存)可以放在这里。所以我们将CubeMX生成的Main函数中的初始化代码拷贝到portable_init函数中。
修改前 :
修改后:
STM32F7内核有4K Bytes的数据缓存(DCache)和指令缓存(ICache),程序在Flash中通过AXI总线运行时,为了达到最高的性能需要把数据缓存和指令缓存打开。STM32其他的系列没有缓存也就不需要添加这部分代码。另外,如果在linker文件里配置将代码放在了其他的位置,缓存也不一定要打开,比如程序在Flash中通过ITCM总线运行,具体看程序的配置。
2)添加下面函数
将main.c中的SystemClock_Config,MX_USART1_UART_Init和MX_GPIO_Init函数拷贝过来。并添将加printf重定向的代码。
3)在文件开头添加函数声明和变量定义:
4)添加新的include文件

修改计时相关代码
start_time/ stop_time/ get_time这几个函数,是coremark程序运行时计算程序运行时间所用。这里使用system tick进行计时,system tick配置为1ms的中断间隔。system tick中断函数中更新Tick的值,每进一次中断加1。所以还需要修改system tick的中断处理函数。
1)在Core_portme.c中按下表找到需要修改的地方,并按表格的内容进行修改:

2)在Core_portme.c文件中添加新定义的变量和函数
system tick的中断处理函数在stm32f7xx_it.c中。stm32f7xx_it.c文件包含所有中断处理入口函数。根据不同的平台,这个文件的名字稍有不同。找到SysTick_Handler函数进行修改。
修改前:
修改后:

CoreMark运行配置
1)设置迭代次数
CoreMark要求程序运行的最短时间至少是10s, 根据使用的系统时钟等情况,可以在Core_portme.h中修改迭代次数。
2)设置打印信息
根据具体所用的编译器版本,优化配置进行修改。

3)修改优化等级。
Options->C/C++ Compiler->Optimizations, 选择High for speed 和No size constraints以达到最优的运行速度。

运行结果
程序已经完全配置好,并编译成功。
现在我们连接STM32F746Discovery板,打开串口调试助手,看看运行结果。

调试信息
1. 如果出现“ERROR! Must execute for at least 10 secs for a valid result!“的错误提示,说明ITERATIONS设定太小,可适当增加ITERATIONS的值。
2.如果串口接受不到调试信息,请检查代码中配置的串口是否是板子上所使用的串口。并检查串口的参数配置是否正确(波特率,数据位个数,校验位等)
3.如果测试的结果与所预知的结果相差很大(比如从CoreMark网站上查到的结果),请检查系统时钟是否配置正确(SystemCoreClock的值是否正确),system tick配置是否正确(Tick的值是否正常)


更多实战经验请看:【ST MCU实战经验汇总贴】


沙发
airwill| | 2016-5-5 12:57 | 只看该作者
不错的资料
只是我不关心怎么移植, 就关心测试的结果.

使用特权

评论回复
板凳
zhanghuichun| | 2016-11-15 11:48 | 只看该作者
哥们能把源码分享出来吗?

使用特权

评论回复
地板
henry_3006| | 2017-2-27 17:07 | 只看该作者
多谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:STM32技术专家

596

主题

17058

帖子

283

粉丝