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宝淘一条。。
为了验证这款MCU的处理能力,选了一款Cortex M3内核的MCU(STM32F103RBT6)进行对比,令两款MCU进行相同点数的FFT运算,统计运算时间,从而比较处理性能的差异。
公平起见,FFT函数均不试用任何优化和加速的方法,采用通用的基2 FFT算法,关于FFT算法的C代码详见:Free small FFT in multiple languages (nayuki.io)
首先看GD32VF103的表现,开发环境用的是MounRiver Studio:
在示例工程的基础上加入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的电压波形如下:
测试结果主频108MHz的GD32VF103运算2次256点FFT耗时约65ms
同样的代码在STM32F103的表现如下:
测试结果主频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%略有出入,但差的不多,仅供参考。
功耗方面的对比由于条件所限暂时无法进行。
更多回帖