RISC-V技术william hill官网
直播中

Himalayas

8年用户 4经验值
擅长:可编程逻辑 模拟技术 处理器/DSP 控制/MCU
私信 关注
[经验]

【兆易创新GD32VF103R-START开发板试用体验】GD32VF103运算能力测试

GD32VF103系列MCU是兆易创新推出的基于RISC-V内核的32位MCU,采用芯来科技Bumblebee内核,最高主频108MHz。据官方的宣传资料,GD32VF103的处理能力为153 DMIPS,即1.41DMIPS/MHz,相比于Cortex M3的1.25 DMIPS/MHz提高了13%左右,而它的功耗更低,同主频下动态功耗仅为Cortex M3的一半。

GD32VF103R-START这款评估板采用GD32VF103RBT6,板子比较简洁,包括主芯片、板载仿真器、USB串口、OTG、电源口、开关、复位键、1个用户按键、4个用户LED,并引出了一些IO。
需要注意的是,评估板的USB口采用了不太主流的mini-USB,而不是常见的micro-usb或type-c,并且没有附赠数据线,这导致我一时竟找不到可用的数据线,只能去X宝淘一条。。

image.png

为了验证这款MCU的处理能力,选了一款Cortex M3内核的MCU(STM32F103RBT6)进行对比,令两款MCU进行相同点数的FFT运算,统计运算时间,从而比较处理性能的差异。

公平起见,FFT函数均不试用任何优化和加速的方法,采用通用的基2 FFT算法,关于FFT算法的C代码详见:Free small FFT in multiple languages (nayuki.io)

首先看GD32VF103的表现,开发环境用的是MounRiver Studio:
image.png

在示例工程的基础上加入256点FFT运算的代码,每做一次FFT将一个LED灯翻转一次,代码如下:

float sincos_tbl[256][2] = {};

uint16_t reverse_bits(uint16_t x, int n) {
    uint16_t result = 0;
    int i;
    for (i = 0; i < n; i++, x >>= 1)
        result = (result << 1) | (x & 1U);
    return result;
}

void fft256(float array[][2], const uint8_t dir) {
    const uint16_t n = 256;
    const uint8_t levels = 8;

    const uint8_t real =   dir & 1;
    const uint8_t imag = ~real & 1;
    uint16_t i;
    uint16_t size;

    for (i = 0; i < n; i++) {
        uint16_t j = reverse_bits(i, levels);
        if (j > i) {
            float temp = array[i][real];
            array[i][real] = array[j][real];
            array[j][real] = temp;
            temp = array[i][imag];
            array[i][imag] = array[j][imag];
            array[j][imag] = temp;
        }
    }

    // Cooley-Tukey decimation-in-time radix-2 FFT
    for (size = 2; size <= n; size *= 2) {
        uint16_t halfsize = size / 2;
        uint16_t tablestep = n / size;
        uint16_t i;
        for (i = 0; i < n; i += size) {
            uint16_t j, k;
            for (j = i, k = 0; j < i + halfsize; j++, k += tablestep) {
                uint16_t l = j + halfsize;
                float tpre =  array[l][real] * cos(2 * PI * k / 256) + array[l][imag] * sin(2 * PI * k / 256);
                float tpim = -array[l][real] * sin(2 * PI * k / 256) + array[l][imag] * cos(2 * PI * k / 256);
                array[l][real] = array[j][real] - tpre;
                array[l][imag] = array[j][imag] - tpim;
                array[j][real] += tpre;
                array[j][imag] += tpim;
            }
        }
        if (size == n)
            break;
    }
}

void led_init(void);

/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{  
    led_init();
    
    while(1){
        gpio_bit_set(GPIOA, GPIO_PIN_7);
        fft256(sincos_tbl,0);
        gpio_bit_reset(GPIOA, GPIO_PIN_7);
        fft256(sincos_tbl,0);
    }
}

/*!
    \brief      initialize the LEDs
    \param[in]  none
    \param[out] none
    \retval     none
*/
void led_init(void)
{
    /* enable the LEDs clock */
   rcu_periph_clock_enable(RCU_GPIOA);
   rcu_periph_clock_enable(RCU_GPIOC);
   /* configure LEDs GPIO port */
   gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_10);
   gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);

   /* turn off LEDs */
   gpio_bit_reset(GPIOA, GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_10);
   gpio_bit_reset(GPIOC, GPIO_PIN_13);
}

用示波器观测LED的电压波形如下:
image.png

image.png

测试结果主频108MHz的GD32VF103运算2次256点FFT耗时约65ms

同样的代码在STM32F103的表现如下:
image.png

测试结果主频72MHz的STM32F103运算2次256点FFT耗时126.9ms

由于GD32VF103的主频是STM32F103的1.5倍,简单的推算,当GD32VF103主频72M时计算2次256点FFT耗时约65ms*1.5=97.5ms

126.9/97.5 = 1.3

从而得出相同主频下GD32VF103的处理能力相比STM32F103提升约30%,与官方的数据13%略有出入,但差的不多,仅供参考。

功耗方面的对比由于条件所限暂时无法进行。

回帖(1)

dianzi

2022-7-15 10:17:23
相同主频下GD32VF103的处理能力相比STM32F103提升约30%,与官方的数据13%略有出入,但差的不多,仅供参考。

这是比官方标的还要高啊。。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分