TA的每日心情 | 开心 2018-6-21 08:39 |
---|
签到天数: 8 天 连续签到: 2 天 [LV.3]偶尔看看II
|
这次野火i.MX RT1052板卡的申请活动能够通过非常荣幸。前段时间被RT1050碾压的性能优势刷了屏,野火很快就推出了基于RT1052的开发板,想必也一定会吸引不少的关注。我这次的计划是在野火的这块开发板上跑用于IoT的RTOS,并做文件系统和网络协议栈的适配。
周一就收到板子了,一个透明的盒子,囊括了所有的套件。开箱图忘照了,就盗一张评测文章中的图来用吧
更多的细节就不介绍了,可以移步介绍非常详细的的评测文章
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验证一下吧,是骡子是马拉出来遛遛
首先,到官网把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接口中
- void portable_init(core_portable *p, int *argc, char *argv[])
- {
- if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) {
- ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n");
- }
- if (sizeof(ee_u32) != 4) {
- ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n");
- }
- p->portable_id=1;
- /* Init board hardware */
- BOARD_ConfigMPU();
- BOARD_InitPins();
- BOARD_BootClockRUN();
- BOARD_InitDebugConsole();
- /* Init timer for microsecond function */
- timer_pit_init();
- printf("iMX RT1052 Configured to run CoreMark(TM) [OSC: %dHz, CPU: %dHz]\n\r",
- CLOCK_GetFreq(kCLOCK_OscClk), CLOCK_GetFreq(kCLOCK_CpuClk));
- }
复制代码
2. 参考文章中计时功能的实现方法,用PIT实现计时功能,并实现GETMYTIME
- void timer_pit_init(void)
- {
- /* Structure of initialize PIT */
- pit_config_t pitConfig;
- PIT_GetDefaultConfig(&pitConfig);
- /* Init pit module */
- PIT_Init(PIT, &pitConfig);
- /* Set max timer period for channel 0 */
- PIT_SetTimerPeriod(PIT, kPIT_Chnl_0, (ee_u32)~0);
- /* Start channel 0 */
- PIT_StartTimer(PIT, kPIT_Chnl_0);
- }
- #define NSECS_PER_SEC CLOCKS_PER_SEC
- #define CORETIMETYPE ee_u32
- #define GETMYTIME(_t) (*_t=~PIT_GetCurrentTimerCount(PIT, kPIT_Chnl_0))
- #define MYTIMEDIFF(fin,ini) ((fin)-(ini))
- #define TIMER_RES_DIVIDER 1
- #define SAMPLE_TIME_IMPLEMENTATION 1
- #define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER)
复制代码
3. 根据开发板的配置修改测试中的相应参数,如CLOCKS_PER_SEC
- #define ITERATIONS 20000 /* ~10sec exec */
- #define CLOCKS_PER_SEC 24000000 /* Timer clock = Fosc 24MHz */
- #define FLAGS_STR "-O3"
- #define DICEN 0 /* 1=ART ON, 0=ART OFF */
- #define ee_printf printf
- #define ee_size_t size_t
复制代码
然后编译、下载就可以运行了,但是由于CoreMark中printf字符串里的回车都使用的是'\n',因此打出来就是这样的。。。
4. 所以还需要重新实现一下fputc
- int fputc(int ch, FILE *f)
- {
- uint8_t re = '\r';
- /* Send data. */
- if (ch == '\n') {
- LOG_Push((&re), 1);
- }
- return LOG_Push((uint8_t *)(&ch), 1);
- }
复制代码
但此时的CoreMark跑分只有可怜的900多分这是为什么呢?
参考文章中的说明可以知道,3000多分的跑分需要确定两件事情:一、Core Clock是否确定配置为600MHz;二、工程代码段/数据段是否放在了ITCM/DTCM RAM。野火板子的时钟配置的是528MHz,这个会造成一定的影响,但不至于导致分数差一半,另一个主要原因是使用默认target的工程配置是base_demo_flexspi_nor_debug的,代码是在NOR Flash中运行的
而野火的文档中指出目前的demo中还不支持sram和sdram的norflash版本
试了下用调试器放在sram中的全速跑,竟然还和在NOR Flash中的跑分一样,不知道是不是受调试器控制的原因。。。没办法,这个问题暂且先不调查了。。。但我们还可以通过优化等其他手段来提升性能的,比如将优化级别提高到Level 3 (-O3),跑分就可以达到1300多分了,前段时间在STM32F407上运行过CoreMark(代码在片内Flash中跑),跑分仅有280多分
而i.MXRT在片外Flash中跑竟然已经达到1300多分了,可见性能差距;而且根据官方的数据,如果测试正常,是会达到惊人的3000多分的;但这个数据却没有在自己的环境上跑出来,还是没找到飞一般的感觉,始终觉得有些不甘心呐
|
|