在MC3172使用IQmath数学库,提高浮点运算能力
【调试记录1】提高MC3172浮点运算能力,IQmath库的获取与导入使用教程
背景:
TI针对没有浮点运算器的定点DSP推出了IQmath库,在使用Q格式对数据进行分析和处理的过程中,十分方便,代码也变得更加简洁。
而在RISC-V架构的也有人实现或者一致了IQmath库。本文目的在于获取RISC架构的IQmath库,并在MC3172 MCU芯片上导入与使用。
MC3172芯片是感芯科技公司新推出的一款单核多线程的MC3172芯片。点击进入官网链接
工程模板准备
打开官方网站,前往以下链接:
在Gitee下载【工程模板文件】并解压工程模板,得到如下文件:
安装 MounRiver Studio
一路Next即可。
IQmath库的获取
打开工程文件:
导出后,解压得到两个文件:.a 和.h文件
IQmath库的导入
这里新建两个文件夹,include放.h文件,lib放.a文件,直接如下拖进来,选择复制方式。
对.a文件进行配置:
配置好后,如下:
在项目中使用
打开main.c引入头文件:
打开头文件,可以见到有许多中文注释,并介绍了函数的作用,如下:
IQmath库的使用与测试
详细的使用介绍,见文末提供的资料文件。
在这里,通过计算三角函数sin,cos进行性能速度对比,通过计算同样次数的三角函数,并且进行IO电平反转,通过一个LED灯或者直接测量IO输出的频率,即可对比库函数的浮点计算与Q格式计算速度。
IO控制实现:
led.c文件
在这里插入代码片#include "../include/led.h"
void Led_Init(u32 gpio_sel,u32 gpio_pin)
{
INTDEV_SET_CLK_RST(gpio_sel,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));
GPIO_SET_OUTPUT_EN_VALUE(gpio_sel,(gpio_pin),GPIO_SET_ENABLE);
LED_OFF(gpio_sel,(gpio_pin));
}
/*
* led.h
*
* Created on: 2022年7月31日
* Author: 四维度
*/
#ifndef USER_CODE_LED_H_
#define USER_CODE_LED_H_
#include "../MC3172/MC3172.h"
#define LED_ON(gpio_sel,gpio_pin) GPIO_SET_OUTPUT_PIN_TO_0(gpio_sel,gpio_pin);
#define LED_OFF(gpio_sel,gpio_pin) GPIO_SET_OUTPUT_PIN_TO_1(gpio_sel,gpio_pin);
void Led_Init(u32 gpio_sel,u32 gpio_pin);
#define LED0_ADDR GPIOA_BASE_ADDR
#define LED0_Pin GPIO_PIN6
#define LED0_Init() Led_Init(LED0_ADDR,LED0_Pin)
#define LED0_ON LED_ON(LED0_ADDR,LED0_Pin)
#define LED0_OFF LED_OFF(LED0_ADDR,LED0_Pin)
#endif /* USER_CODE_LED_H_ */
文件路劲如下:
在main添加头文件,准备调用:
先对IQmath测试:
void thread0_main(void)
{
u32 i,j,k;
_iq s,c;
LED0_Init();
while(1){
LED0_ON
for (i = 0; i < 2000; ++i){
for (j = 0; j < 2000; ++j){
for (k = 0; k < 2000; ++k){
c=_IQcosPU(_IQ(3.1415926));
s=_IQsinPU(_IQ(3.1415926));
}
}
}
LED0_OFF
for (i = 0; i < 2000; ++i){
for (j = 0; j < 2000; ++j){
for (k = 0; k < 2000; ++k){
c=_IQcosPU(_IQ(3.1415926));
s=_IQsinPU(_IQ(3.1415926));
}
}
}
}
thread_end();
}
再对math库函数测试:
void thread0_main(void)
{
u32 i,j,k;
float s,c;
LED0_Init();
while(1){
LED0_ON
for (i = 0; i < 2000; ++i){
for (j = 0; j < 2000; ++j){
for (k = 0; k < 2000; ++k){
c=cos(_IQ(3.1415926));
s=sin(_IQ(3.1415926));
}
}
}
LED0_OFF
for (i = 0; i < 2000; ++i){
for (j = 0; j < 2000; ++j){
for (k = 0; k < 2000; ++k){{
c=cos(_IQ(3.1415926));
s=sin(_IQ(3.1415926));
}
}
}
}
}
thread_end();
}
两次测试程序分别下载到开发板,通过IO口PA6接上LED或者示波器即可观察到对比:
本文到这里结束,测试过程文件以及IQmath手册文末下载,感谢您的观看。
https://gitee.com/Jim-Chenming/mc3172/tree/master/
点击跳转