硬件乘除标准库-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);
}