硬件乘除标准库-IQmath库-非硬件乘除的使用

硬件乘除标准库-IQmath库-非硬件乘除的使用

以下以CH32V203为测试芯片进行测试:

非硬件乘除的使用

  • MRS关闭硬件乘除法

第一步:

取消勾选Use wchprintfloat(-lprintfloat)

取消勾选Use iqmath(-llQmath_RV32)

第二步:

取消勾选Multiply extension (RVM)

取消勾选Extra Compressed extension (RVXW)

解析:CH32V203为青稞V4B内核,支持硬件乘除法;指令集为RV32IMAC,且支持扩展指令集(XW); 扩展指令集中Multiply extension (RVM)单独在MRS中列出,但是其实际也是包含在RVXW扩展指令集中的,且此扩展指令集对应的“硬件指令集寄存器(misa)”可以使用CH32V203读取出值为“0x4090 1105”,其Bit12为Integer Multiply/Divide extension选型,且此位为“1”;因此在不适用硬件乘除法时应当取消勾选这两项进行测试。

  • 测试结果(后附测试程序)

不使用硬件乘除法时,CH32V203使用144MHz主频进行400000次乘法计算,耗时大约为1782ms

硬件乘除的使用

  • MRS开启硬件乘除法

勾选Multiply extension (RVM)

勾选Extra Compressed extension (RVXW)

  • 测试结果(后附测试程序)

使用硬件乘除法时,CH32V203使用144MHz主频进行400000次乘法计算,耗时大约为546ms

IQmath库的使用

  • MRS配置说明

第一步:

通过MRS导出IQMath库

第二步:

解压缩文件后选择与所用芯片匹配的IQMath库

CH32V203的内核为青稞V4B,且支持扩展指令集

由下表可以看出导入对应的IQmath_RV32IMACXW库即可

第三步:

将对应的IQmath_RV32IMACXW库导入到所使用的工程文件中

第四步:

程序中添加#include"IQmath_RV32.h"头文件

MRS配置中勾选Use iqmath(-llQmath_RV32)

  • 测试结果(后附测试程序)

使用IQMath库时,CH32V203使用144MHz主频进行400000次乘法计算,耗时大约为70ms

测试程序

#include "debug.h"

#include"IQmath_RV32.h"

void SysTick_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

u32 counter=0;

void SYSTICK_Init_Config(u64 ticks)

{

SysTick->SR = 0;

SysTick->CNT = 0;

SysTick->CMP = ticks;

SysTick->CTLR =0xF;

NVIC_SetPriority(SysTicK_IRQn, 15);

NVIC_EnableIRQ(SysTicK_IRQn);

}

void SysTick_Handler(void)

{

printf("welcome to WCH\r\n");

SysTick->SR = 0;

counter++;

printf("Counter:%d\r\n",counter);

}

float sum=0;

float pi=3.1415926;

_iq q_sum=_IQ(0.0);

int main(void)

{

__IO int i,j,z;

uint32_t start,end;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

SystemCoreClockUpdate();

Delay_Init();

USART_Printf_Init(115200);

SYSTICK_Init_Config(144000000-1);

start=SysTick->CNT;

for(i=0;i<100;i++)

for(j=0;j<100;j++)

for(z=0;z<40;z++)

sum=pi*z;

end=SysTick->CNT;

printf("start = %d\r\n",start);

printf("end = %d\r\n",end);

printf("Time = %d ms\r\n",(end-start)/144000);

printf("sum = %f\r\n",sum);

start=SysTick->CNT;

for(i=0;i<100;i++)

for(j=0;j<100;j++)

for(z=0;z<40;z++)

q_sum=_IQmpy(_IQ(3.1415926),_IQ(z));

end=SysTick->CNT;

printf("start = %d\r\n",start);

printf("end = %d\r\n",end);

printf("Time = %d ms\r\n",(end-start)/144000);

printf("sum = %f\r\n",_IQtoF(q_sum));

while(1);

}

posted @ 2024-01-03 13:42  WCH_CH32  阅读(427)  评论(0编辑  收藏  举报