查看: 4332|回复: 1

[原创] 【野火i.MX RT1052学习笔记】1.还没找到飞一般的感觉

[复制链接]
  • TA的每日心情
    开心
    2018-6-21 08:39
  • 签到天数: 8 天

    连续签到: 2 天

    [LV.3]偶尔看看II

    发表于 2018-5-28 17:29:00 | 显示全部楼层 |阅读模式
    分享到:
    这次野火i.MX RT1052板卡的申请活动能够通过非常荣幸。前段时间被RT1050碾压的性能优势刷了屏,野火很快就推出了基于RT1052的开发板,想必也一定会吸引不少的关注。我这次的计划是在野火的这块开发板上跑用于IoT的RTOS,并做文件系统和网络协议栈的适配。
    周一就收到板子了,一个透明的盒子,囊括了所有的套件。开箱图忘照了,就盗一张评测文章中的图来用吧
    pic1.jpg

    更多的细节就不介绍了,可以移步介绍非常详细的的评测文章
    https://www.cirmall.com/evaluation/i-mx-rt1052-mini/
    先按照活动中给出的链接把官方的资料都从云盘上load下来
    https://www.cirmall.com/bbs/forum.php?mod=viewthread&tid=100028
    然后到keil官网下载MDK和与RT1052相对应的pack并安装,pack在野火提供的资料中有,MDK只能从官网下载了,800多MB,非常慢。。。
    然后就是组装好板子上电跑例程,看论坛里已经有很多坛友有详细的介绍了,或者按照《i.MX RT库开发实战指南》里面的指引,一步步地做就能很方便地创建一个工程并运行,我就不在这里重复了。那开箱贴总该做点啥吧,想起了刚刚研究过CoreMark,看到官网上RT1050的CoreMark跑分已经达到了残暴的3000多分,干脆移植个CoreMark验证一下吧,是骡子是马拉出来遛遛
    pic2.jpg

    首先,到官网把CoreMark代码下下来(官方刚转到github上,前几天还要需要在官网注册然后download zip包)
    https://github.com/eembc/coremark
    然后,网上已经有大牛在NXP官方的开发板【NXP i.MX RT1050 EVK】上移植过了
    http://www.cnblogs.com/henjay724/p/8727199.html
    参考文章中的步骤,用野火已经可以打印的固件库demo【5-新建工程-固件库版本】做基线,修改以下几点就可以顺利地跑起来了
    1. 在工程中除去原来的main.c,把相应的板级初始化挪到core_portme.c中的portable_init接口中
    1. void portable_init(core_portable *p, int *argc, char *argv[])
    2. {
    3.         if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) {
    4.                 ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n");
    5.         }
    6.         if (sizeof(ee_u32) != 4) {
    7.                 ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n");
    8.         }
    9.         p->portable_id=1;

    10.     /* Init board hardware */
    11.     BOARD_ConfigMPU();
    12.     BOARD_InitPins();
    13.     BOARD_BootClockRUN();
    14.     BOARD_InitDebugConsole();

    15.     /* Init timer for microsecond function */
    16.     timer_pit_init();

    17.     printf("iMX RT1052 Configured to run CoreMark(TM) [OSC: %dHz, CPU: %dHz]\n\r",
    18.            CLOCK_GetFreq(kCLOCK_OscClk), CLOCK_GetFreq(kCLOCK_CpuClk));
    19. }
    复制代码

    2. 参考文章中计时功能的实现方法,用PIT实现计时功能,并实现GETMYTIME
    1. void timer_pit_init(void)
    2. {
    3.     /* Structure of initialize PIT */
    4.     pit_config_t pitConfig;
    5.     PIT_GetDefaultConfig(&pitConfig);
    6.     /* Init pit module */
    7.     PIT_Init(PIT, &pitConfig);
    8.     /* Set max timer period for channel 0 */
    9.     PIT_SetTimerPeriod(PIT, kPIT_Chnl_0, (ee_u32)~0);
    10.     /* Start channel 0 */
    11.     PIT_StartTimer(PIT, kPIT_Chnl_0);
    12. }

    13. #define NSECS_PER_SEC CLOCKS_PER_SEC
    14. #define CORETIMETYPE ee_u32
    15. #define GETMYTIME(_t) (*_t=~PIT_GetCurrentTimerCount(PIT, kPIT_Chnl_0))
    16. #define MYTIMEDIFF(fin,ini) ((fin)-(ini))
    17. #define TIMER_RES_DIVIDER 1
    18. #define SAMPLE_TIME_IMPLEMENTATION 1
    19. #define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER)
    复制代码

    3. 根据开发板的配置修改测试中的相应参数,如CLOCKS_PER_SEC
    1. #define ITERATIONS      20000       /* ~10sec exec    */
    2. #define CLOCKS_PER_SEC        24000000    /* Timer clock = Fosc 24MHz */
    3. #define FLAGS_STR       "-O3"
    4. #define DICEN           0           /* 1=ART ON, 0=ART OFF */

    5. #define ee_printf       printf
    6. #define ee_size_t            size_t
    复制代码

    然后编译、下载就可以运行了,但是由于CoreMark中printf字符串里的回车都使用的是'\n',因此打出来就是这样的。。。
    pic3.jpg

    4. 所以还需要重新实现一下fputc
    1. int fputc(int ch, FILE *f)
    2. {
    3.     uint8_t re = '\r';
    4.     /* Send data. */
    5.     if (ch == '\n') {
    6.         LOG_Push((&re), 1);
    7.     }
    8.     return LOG_Push((uint8_t *)(&ch), 1);
    9. }
    复制代码

    但此时的CoreMark跑分只有可怜的900多分这是为什么呢?
    pic4.jpg

    参考文章中的说明可以知道,3000多分的跑分需要确定两件事情:一、Core Clock是否确定配置为600MHz;二、工程代码段/数据段是否放在了ITCM/DTCM RAM。野火板子的时钟配置的是528MHz,这个会造成一定的影响,但不至于导致分数差一半,另一个主要原因是使用默认target的工程配置是base_demo_flexspi_nor_debug的,代码是在NOR Flash中运行的
    pic5.jpg

    而野火的文档中指出目前的demo中还不支持sram和sdram的norflash版本
    pic6.jpg

    试了下用调试器放在sram中的全速跑,竟然还和在NOR Flash中的跑分一样,不知道是不是受调试器控制的原因。。。没办法,这个问题暂且先不调查了。。。但我们还可以通过优化等其他手段来提升性能的,比如将优化级别提高到Level 3 (-O3),跑分就可以达到1300多分了,前段时间在STM32F407上运行过CoreMark(代码在片内Flash中跑),跑分仅有280多分
    pic7.jpg pic8.jpg

    而i.MXRT在片外Flash中跑竟然已经达到1300多分了,可见性能差距;而且根据官方的数据,如果测试正常,是会达到惊人的3000多分的;但这个数据却没有在自己的环境上跑出来,还是没找到飞一般的感觉,始终觉得有些不甘心呐

    回复

    使用道具 举报

  • TA的每日心情
    难过
    2021-2-27 22:16
  • 签到天数: 1568 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2018-5-29 21:41:15 | 显示全部楼层
    一看就喜欢
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2025-1-12 18:39 , Processed in 0.138066 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.