当前位置:网站首页>【调试记录1】提高MC3172浮点运算能力,IQmath库的获取与导入使用教程

【调试记录1】提高MC3172浮点运算能力,IQmath库的获取与导入使用教程

2022-08-11 05:24:00 McuBoy~C

【调试记录1】提高MC3172浮点运算能力,IQmath库的获取与导入使用教程

背景:
TI针对没有浮点运算器的定点DSP推出了IQmath库,在使用Q格式对数据进行分析和处理的过程中,十分方便,代码也变得更加简洁。
而在RISC-V架构的也有人实现或者一致了IQmath库。本文目的在于获取RISC架构的IQmath库,并在MC3172 MCU芯片上导入与使用。

MC3172芯片是感芯科技公司新推出的一款单核多线程的MC3172芯片。点击进入官网链接

工程模板准备

打开官方网站,前往以下链接:
图片1
在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/
点击跳转

原网站

版权声明
本文为[McuBoy~C]所创,转载请带上原文链接,感谢
https://blog.csdn.net/cjmsd/article/details/126257671