玩轉X-CTR100 l STM32F4 l DSP指令集性能測試


我造輪子,你造車,創客一起造起來!塔克創新資訊【塔克社區 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/

    

本文介紹X-CTR100控制器 DSP庫的使用,對STM32F4的DSP庫有個基本的了解,並針對三角函數有無DSP指令進行性能測試。

原理

STM32F4采用Cortex-M4內核,相比Cortex-M3系列除了內置硬件FPU單元,在數字信號處理方面還增加了DSP指令集,支持諸如單周期乘加指令(MAC),優化的單指令多數據指令(SIMD),飽和算數等多種數字信號處理指令集。相比Cortex-M3,Cortex-M4在數字信號處理能力方面得到了大大的提升。Cortex-M4執行所有的DSP指令集都可以在單周期內完成,而Cortex-M3需要多個指令和多個周期才能完成同樣的功能。

ST官方提供了一整套的DSP庫方便我們開發使用,在ST提供的標准庫:stm32f4_dsp_stdperiph_lib.zip里面就有。

目錄STM32F4xx_DSP_StdPeriph_Lib_V1.4.0→Libraries→CMSIS→DSP_Lib下可以找到DSP庫文件和測試實例。

Sourse中是所有DSP庫文件源代碼,Examples文件夾下是一些測試實例。

    

DSP庫主要包含以下幾個分庫:

BasicMathFunctions

基本數學函數:提供浮點數的各種基本運算函數,如向量加減乘除等運算。

CommonTables

arm_common_tables.c文件提供位翻轉或相關參數表。

ComplexMathFunctions

復雜數學功能,如向量處理,求模運算的。

ControllerFunctions

控制功能函數。包括正弦余弦,PID電機控制,矢量Clarke變換,矢量Clarke逆變換等。

FastMathFunctions

快速數學功能函數。提供了一種快速的近似正弦,余弦和平方根等相比CMSIS計算庫要快的數學函數。

FilteringFunctions

濾波函數功能,主要為FIR和LMS(最小均方根)等濾波函數。MatrixFunctions

矩陣處理函數。包括矩陣加法、矩陣初始化、矩陣反、矩陣乘法、矩陣規模、矩陣減法、矩陣轉置等函數。

StatisticsFunctions

統計功能函數。如求平均值、最大值、最小值、計算均方根RMS、計算方差/標准差等。

SupportFunctions

支持功能函數,如數據拷貝,Q格式和浮點格式相互轉換,Q任意格式相互轉換。

TransformFunctions

變換功能。包括復數FFT(CFFT)/復數FFT逆運算(CIFFT)、實數FFT(RFFT)/實數FFT逆運算(RIFFT)、和DCT(離散余弦變換)和配套的初始化函數。

ST提供了.lib格式的文件,方便使用這些庫。這些.lib文件就是由Source文件夾下的源碼編譯生成的,如果想看某個函數的源碼,可以在Source文件夾下面查找。.lib格式文件路徑:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0→Libraries→CMSIS→Lib→ARM,總共有8個.lib文件,和M4F相關的有兩個:

arm_cortexM4bf_math.lib(浮點Cortex-M4大端模式)

arm_cortexM4lf_math.lib(浮點Cortex-M4小端模式)

STM32F4的內核CortexM4F采用小端模式,所以選擇:arm_cortexM4lf_math.lib(浮點Cortex-M4小端模式)。

例程

本例程 通過計算兩種方法計算三角函數,測量計算時間,間接進行性能對比。

硬件說明

硬件資源:

  • 串口UART1

硬件連接:

使用MicroUSB數據線連接X-CTR100 COM接口。

軟件說明

將DSP Lib庫加入到工程,相關頭文件已在X工程模板中加入。

    

使用DSP庫的所有功能,還需要添加以下幾個全局宏定義:

1、__FPU_USED

2、__FPU_PRESENT

3、ARM_MATH_CM4

4、__CC_ARM

5、ARM_MATH_MATRIX_CHECK

6、ARM_MATH_ROUNDING

在main.c文件中包含如下頭文件。

#include "math.h" //標准數學函數庫

#include "arm_math.h" //使用DSP的數學函數庫

測試代碼如下,分別使用DSP庫三角函數和標准三角函數進行計算,測量計算時間,時間越少性能越好。

int main(void)

{

    uint32_t i, tmp;

    float angle;

    float sinx, cosx;

 

    /* X-CTR100初始化 */

    AX_Init(115200);

    printf("***X-CTR100 DSP指令集性能測試例程***\r\n\r\n");

 

    //模塊初始化及配置

    AX_TIMER_TIM6_Init(1);

 

    while (1)

    {

        //不使用DSP優化的sin,cos函數

        AX_TIMER_TIM6_SetCounter(0);

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

        {

            cosx = cosf(angle);

            sinx = sinf(angle);

            angle += 0.001f;//角度自增

        }

        tmp = AX_TIMER_TIM6_GetCountert();

        printf("無DSP 運行時間:%d us | ", tmp);

 

        //有使用DSP優化的sin,cos函數

        AX_TIMER_TIM6_SetCounter(0);

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

        {

            cosx = arm_cos_f32(angle);

            sinx = arm_cos_f32(angle);

            angle += 0.001f;//角度自增

        }

        tmp = AX_TIMER_TIM6_GetCountert();

        printf("有DSP 運行時間:%d us \r\n", tmp);

 

        AX_Delayms(1000);

        AX_LEDG_Toggle();

    }

}

實現效果

測試結果如下圖,有DSP情況下計算速度提升約1倍左右。

    

總結

通過本文學習,可以了解STM32F4DSP指令集及ST提供DSP庫的使用。項目中如果需要頻繁的數學運算,並有性能要求,建議使用DSP相關計算函數。

參考

正點原子——ALIENTEK探索者STM32F407開發板相關資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM