RVB2601移植CoreMark
lwperson
RVB2601开发板上的主IC, CH2601是一颗RISC-V架构的单片机,数据手册描述主频最高可到220MHz, 这个比起STM32F103最高72MHz, STM32F407最高168MHz可是相当有惊喜的呢,不过比起STM32H7系列最高480MHz当然还是逊色积分。当然以上的数据只是手册中的数据,如果只是为了玩玩超频当然也是可以的,不过用在实际产品中最好还是不要超过手册中给出的频率啦,甚至还有降频使用啦,要不然在不同的环境中你的单片机程序可能就很容易跑飞或者一些其它的一些问题了。
要测试一款处理器的性能怎样,当然是跑分了,电脑有某大师,手机有某兔兔,单片机自然也不例外,有CoreMark。当在工作中需要设计一款嵌入式或者单片机产品的时候,了解一款处理器的性能可以让我们更好的对处理器进行选型。避免我们杀鸡用牛刀或者杀牛用削铅笔的小刀。当然我们也不可以迷信跑分,毕竟一款带有处理器的产品是需要软硬件紧密配合。
CoreMark在单片机的移植非常简单,下面简述一下在RVB2601上的移植过程:
1.打开RVB2601提供的SDK中的ch2601_helloworld工程,这个工程初始化了RVB2601板子上的串口,并且printf函数是可用的,方便我们打印信息。我们将在这个工程中的基础上移植。
2.ch2601_helloworld工程中的src分组中加入coremark的代码,core_list_join.c, core_main.c, core_matrix.c, core_portme.c, core_state.c, core_util.c这几个文件都是从coremark官网下载的。
3.提供一个10ms的时间轴,因为coremark的代码中用到了CLOCKS_PER_SEC这个值,而这个值在CDK\CSKY\PACK\newlib\v7.4.3\include\time.h中定义的是100。如果大家移植到不同的单片机平台时要注意这个值,比如移植到stm32这个值在keil_v5\ARM\ARMCC\include\time.h中定义的是1000,这个时候我们只要提供一个1ms的时间轴就好了。
4.因为在进行coremark相关函数的计算时要运行10秒钟以上才能打印完整的信息,所以要把core_portme.c中的ITERATIONS中的值修改成一个合理的值。
就是这么简单,main.c文件的修改如下,当然在编译的时候报了一个错,提示crc16重复定义了,这个时候只要把CDK\CSKY\PACK\aos\v7.4.3\src\crc16.c中的 crc16函数注释掉就好了。
#include <stdlib.h>
#include <string.h>
#include <aos/aos.h>
#include "aos/cli.h"
#include "main.h"
#include "app_init.h"
#include "oled.h"
#include <drv/timer.h>
#include <drv/gpio_pin.h>
#include <drv/porting.h>
#define TAG "app"
static csi_gpio_pin_t pin;
static csi_timer_t g_timer;
volatile uint32_t w_tick = 100;
static void timer_event_cb_reload_fun(csi_timer_t *timer_handle, void *arg)
{
w_tick ++;
csi_gpio_pin_toggle(&pin);
}
int main(void)
{
board_yoc_init();
LOGD(TAG, "%s\n", aos_get_app_version());
oled_init();
csi_pin_set_mux(PA7, PIN_FUNC_GPIO);
csi_gpio_pin_init(&pin, PA7);
csi_gpio_pin_dir(&pin, GPIO_DIRECTION_OUTPUT);
csi_timer_init(&g_timer, 0);
csi_timer_attach_callback(&g_timer, timer_event_cb_reload_fun, NULL);
csi_timer_start(&g_timer, 10000);
printf("CPU freq %d Hz\r\n",soc_get_cpu_freq(0));
extern void coremark_main(void);
coremark_main();
while (1)
{
//LOGD(TAG, "Hello world! YoC");
aos_msleep(1000);
}
return 0;
}
把移植好的代码下载到RVB2601,可以看到串口调试助手打印如下信息
[ 0.020]INIT Build:May 11 2021,14:10:50
[ 0.020]app e5
CPU freq 196608000 Hz
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 1547
Total time (secs): 15.470000
Iterations/Sec : 517.129929
Iterations : 8000
Compiler version : GCC8.4.0
Compiler flags : level 3 (-O3)
Memory location : STACK
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0x5275
Correct operation validated. See README.md for run and reporting rules.
CoreMark 1.0 : 517.129929 / GCC8.4.0 level 3 (-O3) / STACK
在CPU主频196.608 MHz下跑分517分,登录下coremark的官网看了下,这个跑分比180MHz的STM32F446RE 602.44分低一些。不过对于一款单片机来说性能也是非常可观不错的。
在这里要特别说明一下,CPU的coremark跑分和CPU频率、编译器、以及编译时的优化等级还有代码的运行空间,是否打开单片机的缓存,这些都是有很大的关系。所以大家在比较评估时还是应该要客观看待这个分数。
附件下载: