STM32F769I-DISCO(STM32官网) Coremark移植与跑分测试 Coremark是被公认为比较标准的测试处理器性能工具,基本成为了业界标准,网上移植Coremark到STM32的教程很多,不过这里还是把自己的移植过程写下了,当做是记笔记了,顺便自己研究了下,做了些小改动,比官方移植文档里少了很多修改代码的内容,简单了很多。
首先当然是去官网下载Coremake源代码,接着下载和安装STM32CUBEMX,IAR,以及STM32CubeF7库文件,这个过程就直接略过了。
第一部分 待测试MCU的准备工作,主要包括建立一个能成功运行的STM32工程,配置好STM32F769的系统时钟,配置好串口输出和printf函数重定向,用于测试结果的输出,下面使用STM32CubeMX配合IAR来完成以上工作。
1. 用Cubemx新建一个工程,选择开发板STM32F769I-DISCO
2. 打开RCC,使用外部时钟,为获得最高性能,CPU时钟配置为最高的216 MHz
3. 开发板自带ST-LINK V2-1,设计了虚拟串口功能,连接MCU的USART1,PA9,PA10,打开USART1,用于测试结果输出,配置参数如图
4. 打开ART加速器,指令预取指,CPU DCache和ICache
5. 接下来就是生成工程,选择EWARM,使用IAR打开工程
6. 试着编译一下,没有错误,没有警告,然后添加串口重定向代码,切记一定要写在USER CODE BEGIN x 和USER CODE END x之间,这段代码可以在STM32CubeF7库中以下文件找到
STM32Cube_FW_F7_V1.5.0\Projects\STM32F769I_EVAL\Examples\UART\UART_Printf\Src\main.c
7. 在主函数添加测试代码,即可变意思下载看到效果(假设你已经正确安装了ST-LINK驱动) 至此,第一部分的准备工作就完成了,下面开始第二部分。
第二部分 移植Coremark
1. 解压先前下载的Coremark,将相关文件复制到工程中
2. 将Coremark代码文件添加到IAR工程中,并添加头文件的包含路径
3. 此时编译,就会有些错误了,因为移植工作还没有完成,找到core_portme.c中的void portable_init(core_portable *p, int *argc, char *argv[])函数,将main.c中main函数的初始化代码部分复制到此函数中
这里调用的SystemClock_Config()和 Error_Handler()函数在main.c中,也需要复制到core_portme.c中,同时复制main.c文件开头的头文件包含和函数声明放在文件最开始地方
其他外设初始化函数,在用cube生成工程的时候选择了生成独立的.c和.h文件,所以不需要复制。
4. 此时main.c文件中的内容已经都被搬到了core_portme.c中,将它从工程中删除,因为core_main.c中也有个main函数,如果不删除会冲突。 5. 接下来是修改定时器的相关代码,使用SysTick计时,SystemClock_Config 函数中SysTick被配置为没1ms产生一次中断,在中断中对计时全局变量uwTick进行加1,相关代码如下: core_portme.c中的start_time();stop_time();等函数通过GETMYTIME这个宏获取时间,start_time_val和stop_time_val实际上都是uint32_t,记录开始和结束计时的当前值,就是当前uwTick的值 这个宏也是在core_portme.c中定义的,明白了它的意义后,我们就知道怎么修改了 HAL_GetTick这个函数就是返回uwTick的当前值,正是我们所需要的,
EE_TICKS_PER_SEC这个值表示每秒钟的Tick次数,SysTick每 1ms产生一次中断,所以该值应该为1000,这样,计时相关代码就修改好了。 6. 此时编译工程,发现还有两个错误: 先看第二个,ITERATIONS表示迭代次数,在core_portme.c中用到,CoreMark要求程序运行10秒以上,该值需要根据不同情况自己修改位合适的值,有时要多次测试 再看第一个错误, FLAGS_STR实际上是COMPILER_FLAGS没有定义,编译器参数 这里的信息是在最终结果中输出显示的,所以我们在工程中设置什么,就可以写什么。
现在先设置优化等级,为 HighSpeed,No_size_constraints 所以根据刚刚的设置,COMPILER_FLAGS可以定义如下图,顺便也把编译器的信息放上去 -Ohs表示优化等级为 HighSpeed。
7. 到这里,再编译工程,已经没有错误没有警告,移植完全成功,接下来就是下载测试,查看结果了
不过,本人在测试的时候,遇到了两个错误: 错误1#.
一运行,发现没反应,悲剧了,进入了HardFault错误 遇到这种错误,最常见的就是 Memory越界访问或者堆栈溢出,由于Cube生成工程的时候没有修改堆栈,为默认值,于是将其改大,
果然这个问题立马迎刃而解了。
问题2#.
现在总算能运行了,但是还是出错了
查看下时间,9.2秒,嗯,前面说了至少要10秒,所以这是迭代次数不够的错,将ITERATIONS由10000改为15000, 再次测试:
这次总算没出什么问题了,跑分结果1086.327,与官方结果基本相符。
|