本帖最后由 wolfgang2015 于 2018-7-24 17:18 编辑
终于用正点原子的库跑出Coremark得分
分值还不错,能达到(Keil比IAR编译器要少几个百分点) CoreMark 1.0 : 2452.667409 / Please putcompiler version here (e.g. gcc 4.1) -O3 -Optimize for Time / STACK
在上次用用SysTick 跑出来一个偏离很远的Coremark分值后,将Systick用PIT替换; 具体使用PIT的方法,可参考“号令者RT1052光盘资料(A盘)\4,程序源码\2,标准例程-库函数版本\实验8 PIT定时器中断实验”进行设置。 CoreMark的移植暂不说,就本次移植发现的问题,希望各位在应用中注意。
使用正点原子的库函数版本移植Cormark的内容时,需要对部分代码作调整,否则不能得到正确的CoreMark跑分:
1、在void RT1052_Clock_Init(void) 函数中,SystemCoreClockUpdate()函数之前增加以下代码设定PIT系统时钟配置参数 - /* Configure PIT divider */
- CLOCK_SetMux(kCLOCK_PerclkMux, 1U); /* Set PERCLK_CLK source to OSC_CLK*/
- CLOCK_SetDiv(kCLOCK_PerclkDiv, 0U); /* Set PERCLK_CLK divider to 1 */
- SystemCoreClockUpdate();
复制代码这里使用晶振的24MHz,直接配置给PIT作为时钟源。 不分频提供给PIT使用,24MHz。确保Coremark的跑分时间足够。
2、NXP官方在以下常量的类型定义中,是定义了src的内容,将Sys.c文件中以下定义的常量末尾增加.src的内容 - const clock_arm_pll_config_t armPllConfig =
- {
- //Fout=Fin*div_selcet/2=24*100/2=1200Mhz;
- .loopDivider = 100,
- .src = 0,
- };
- const clock_sys_pll_config_t sysPllConfig =
- {
- //Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator) = 24*(20+1*2+0/1)=24*22=528MHz
- .loopDivider = 1,
- .numerator = 0,
- .denominator = 1,
- .src = 0,
- };
- const clock_usb_pll_config_t usb1PllConfig =
- {
- //0: Fout=Fref*20=24*20=480M;
- //1: Fout=Fref*22=24*22=528M
- .loopDivider = 0,
- .src = 0,
复制代码 以上结构体均要增加.src=0的内容,若不增加以上结构,即便代码相同,Coremark跑分也差别很大。似乎相关参数没有正确被设定,达不到设定的运行速度,会导致跑分大大降低。
追究这几个类型定义:clock_arm_pll_config_t 、clock_sys_pll_config_t 、clock_usb_pll_config_t
官方给出的结构定义中,均包含 .src部分,常量不出初始化这些部分的值,结构体的数字没有得到赋值,默认的会出现一些不可预见的错误。因此最好将结构体的值初始化完整。
|