本帖最后由 yangjiaxu 于 2022-9-23 23:44 编辑
#申请原创#[url=home.php?mod=space&uid=760190]@21小跑堂 @21ic小管家 [/url]
大家好,我是豆包,上一贴主要讲了开发板的前期的环境搭建工作,其实写的还是较为简单,因为野火团队都已经给搭建好环境了,所以也不需要重新搭建,这给我们省了很多的时间和省去了很多不必要的麻烦。 “跨界”,这个词大家应该都比较熟悉,通俗的说就是在一个领域有所成就,还可以在另一个领域有所建树,其实“跨界”就是“整合”,将两个不相关的领域整合到一起,本帖我来展现一下使用coremark来测试一下imxRT1021的性能,看看imxRT1021是如何“跨界”的。 首先要准备一个工程,这个工程需要带有串口打印功能,和基本的时钟配置功能,本次我将采用上回说到的LED工程来实现,值得注意的是,该工程采用的是keil实现; 图1 需要的文件 拷贝到工程之后,就开始进行项目移植了。 coremark_v1.0 barebones --移植到裸机下需要修改的文件 core_portme.h -- 移植平台工程具体配置信息 core_portme.c -- 计时以及板级初始化实现 cvt.c ee_printf.c -- 打印函数串口发送实现 core_main.c --主程序入口 core_state.c --状态机控制子程序 core_list_join.c --列表操作子程序 core_matrix.c --矩阵运算子程序 core_util.c --CRC计算子程序 coremark.h --工程配置与数据结构定义 将文件添加完成之后,就需要进行修改了,首先就是将初始化部分添加到coremark的void portable_init(core_portable *p, int *argc, char *argv[])之中; void portable_init(core_portable *p, int *argc, char *argv[])
{
/* Init board hardware. */
/* 初始化内存保护单元 */
BOARD_ConfigMPU();
/* 初始化开发板引脚 */
BOARD_InitPins();
/* 初始化开发板时钟 */
BOARD_BootClockRUN();
/* Init timer for microsecond function. */
timer_pit_init();
/* 初始化调试串口 */
BOARD_InitDebugConsole();
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;
}
添加完成之后就可以删掉原来的mian.c文件了,因为该初始化文件已经包含了串口以及时钟的配置等等,所以初始化部分就算是完成了,接下来就需要修改计时部分的功能代码。 说实话,网上针对imxRT1021的跑分操作还是比较少的,好在有大佬痞子衡的详细教程,让我摆脱了仅仅跑分六百多的疑问,其实就是将原来Cortex-M内核里的SysTick改为imxRT的PIT计时器,说实话,我也是第一次使用imxRT系列,针对其外设还不是很熟悉,所以就跟着大佬走吧,肯定没错,我在这里将时钟修改成PIT计时器,修改代码如下: /* Set PERCLK_PODF. */
CLOCK_SetDiv(kCLOCK_PerclkDiv, 0x1);
/* Set per clock source. */
CLOCK_SetMux(kCLOCK_PerclkMux, 0x0);
接下来是串口打印功能,由于我们之前的工程已经带有串口打印功能,所以这边代码就可以这么修改即可。
void uart_send_char(char c) {
if (c == '\n')
{
char tmp = '\r';
LPUART_WriteBlocking((LPUART_Type *)BOARD_DEBUG_UART_BASEADDR, (const uint8_t *)&tmp, 1);
}
LPUART_WriteBlocking((LPUART_Type *)BOARD_DEBUG_UART_BASEADDR, (const uint8_t *)&c, 1);
/* Output of a char to a UART usually follows the following model:
Wait until UART is ready
Write char to UART
Wait until UART is done
Or in code:
while (*UART_CONTROL_ADDRESS != UART_READY);
*UART_DATA_ADDRESS = c;
while (*UART_CONTROL_ADDRESS != UART_READY);
Check the UART sample code on your platform or the board documentation.
*/
}
好了,最后就是配置一下宏定义, #define COMPILER_VERSION "MDK-ARM Plus V5.34.0.0"
#define COMPILER_FLAGS "-o3" /* "Please put compiler flags here (e.g. -o3)" */
#define MEM_LOCATION "STACK"
#define ITERATIONS 25000//此处需要设置让coremark跑到大于10秒,测试数据方可有效<span style="background-color: rgb(255, 255, 255);"> </span>
至此,coremark的工程配置就告一段落了,编译,下载,即可看到跑分结果 图2 跑分结果 2046.09 官方的imxRT1020系列的跑分结果是2517 CoreMark/1070 DMIPS @ 500 MHz 说实话,我这个 2046.09的跑分结果还是差很多的,我修改了一些配置,发现也没有让跑分增加,就很绝望,最后,看到痞子衡大佬的介绍才知道,这个coremark的跑分结果是受编译器影响的,采用IAR的话估计结果会更好一些吧,但是通过coremark的排行榜 https://www.eembc.org/coremark/scores.php看,imxRT1021在与竞品STM32H743对比的话,还是完全超越的。
总结:其实coremark只能代表MCU的某一个参数,并不能代表这个MCU有多优秀,其实我个人觉得还是把这个MCU的生态建立起来,用的人多了,这MCU就会发挥它的作用了。好了,imxRT1021的 “跨界”测试至此要到尾声了,接下来会更加深入的体验imxRT1021,来挖掘它的性能,敬请期待~
|