说到测mcu效率,其实业界有一个很好的工具,脚CoreMark,他的设计思想是让MCU去跑不同的逻辑,分别调用特定的指令,同时开启硬件定时器,以1ms为周期定时跑10s,这样计算测试项跑完后,每个测试项所消耗的时间,测完后再根据一定规则算出总分。
很不幸的是,貌似CoreMark跑分并未涉及到Helium部分。因此我决定采用类似的思路,在启用Helium和不启用Helium的环境下,使用同一配置的硬件定时器来计算跑完计算代码所消耗的时间,以此获得Helium的开关对效率提升程度的结论。
硬件准备
RA系列的定时器,其实应该叫General PWM Timer,其主要功能是PWM波形产生,另外有两个附加的功能,AD转换的时钟信号,以及通用定时器。RA8集成了一个32位8通道定时器(通道0至通道7)以及一个16位6通道的定时器(通道8至通道13)。
为了能获取更精确的效果,我选用了32位定时器作为计时基准(在定时器时钟固定的情况下,更多的位数可以记录更长的时间,从而避免数据翻转带来的异常统计困难问题)。
软件修改
RASC配置
还是老套路,从stacks开始修改。
之后点击Generate Project Context生成工程后关闭RASC。
代码修改
定时器实现文件
bsp_gpt_timing.c
主要功能是定时器初始化,启用,获取当前计时,关闭等入口的实现,对接FSP层。
#include "bsp_gpt_timing.h" unsigned long time_ms_ticks; void GPT_Stop_timer(void) { R_GPT_Stop(&g_timer0_ctrl); time_ms_ticks = 0; R_GPT_CounterSet(&g_timer0_ctrl, 0); } void GPT_Start_timer(void) { time_ms_ticks = 0; R_GPT_CounterSet(&g_timer0_ctrl, 0); R_GPT_Start(&g_timer0_ctrl); } void GPT_Timing_Init(void) { R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg); GPT_Start_timer(); } unsigned long GPT_Get_Tick(void) { return time_ms_ticks; } void gpt0_timing_callback(timer_callback_args_t * p_args) { time_ms_ticks ++; }
定时器头文件
bsp_gpt_timing.h
主要作用是把接口暴露给应用使用
#ifndef __BSP_GPT_TIMING_H #define __BSP_GPT_TIMING_H #include "hal_data.h" void GPT_Timing_Init(void); void GPT_Start_timer(void); void GPT_Stop_timer(void); unsigned long GPT_Get_Tick(void); #endif
应用修改
里面所做的功能为初始化定时器并每隔1000个定时中期打印一次计时,若时间精确的话,此时钟应该与PC时钟一致。
...... #include "bsp_debug_uart.h" #include "bsp_gpt_timing.h" void hal_entry(void) { unsigned long oldtime = 0; /* TODO: add your own code here */ Debug_UART_Init(); GPT_Timing_Init(); printf("debug uart init OK\n\r"); ...... while(1) { if((GPT_Get_Tick() - oldtime) >= 1000) { oldtime = GPT_Get_Tick(); printf("Tick %ldms\n\r",oldtime); } } } ......
效果验证
按照打印时间和电脑时间变化的对比,计时3min,未发现误差(3min 1s内的误差),可判定硬件定时器开启成功。