21ic电子技术开发论坛

标题: 基于XMC1302,如何在ModusToolbox中加载CMSIS DSP库,如何计算三角函数的运行时间? [打印本页]

作者: IFX_Lingling    时间: 2024-7-1 16:59
标题: 基于XMC1302,如何在ModusToolbox中加载CMSIS DSP库,如何计算三角函数的运行时间?

问题:

基于XMC1302,如何在ModusToolbox中加载CMSIS DSP库,如何计算三角函数的运行时间?[size=14.6667px]
答案:
步骤一:使能CMSIS DSP库

基于 ModusToolBox 3.2 创建的工程,会自动从 https://github.com/ARM-software/CMSIS_5/tree/5.8.0 下载 CMSIS DSP 和 NN 库 到 mtb_shared 文件夹,但是这些库默认不会自动使能,使能这些库只需要在 makefile 文件中加入 COMPONENTS+= CMSIS_NN CMSIS_DSP,然后在用户代码文件中 include 对应的 .h 文件(比如 #include "arm_math.h")就可以了。添加方法如图1:加载CMSIS DSP库。关于不同版本的操作方法有区别,更详细的可以参考:如何在 ModusToolBox IDE 中加载 CMSIS DSP 数**算库
[attach]2270338[/attach]


图1:加载CMSIS DSP库

步骤二:计算函数运行时间

在 Modus Toolbox 中没有寄存器可以直接查看某条语句或者某个函数的执行时间,可以利用 ARM Cotex-M 核自带的 System Tick 来实现这个功能。System Tick 是以 CPU Clock 作为它的源时钟,因此 1 个 System Tick 的 count 就表示一个机器周期,下面是可以参考的代码片段:


uint32_t DURATION_TIME;
float result1;
  SysTick->CTRL = 0;/*Disable SysTick*/
    SysTick->LOAD = 0xffffff; /* Count down from maximum value */
    SysTick->CTRL = 0x5; /* Enable SysTick and use processor clock */
    SysTick->VAL = 0; /* Clear current value to 0 */
    result1 = arm_sin_f32(0.5f);
    DURATION_TIME = SysTick->VAL; /* Get duration time */
    SysTick->CTRL = 0; /* Disable SysTick */


则运行时间为t,t=(1/MCLK) *(0xffff- DURATION_TIME) us





作者: IFX-XiaoluZhu    时间: 2024-7-29 09:52
实用的方法,点赞

作者: shenxiaolin    时间: 2024-7-29 22:01
感谢分享

作者: yangjiaxu    时间: 2024-7-30 10:37
这种计算时间的方式很不错,计算的比较准确而且还不费劲

作者: uptown    时间: 2024-8-4 10:59
调用你想要测量的三角函数,例如arm_sin_f32()或arm_cos_f32()。

作者: juliestephen    时间: 2024-8-4 12:12
#include "xmc_systick.h" // 包含XMC1302的Systick定时器头文件

uint32_t start_time, end_time; // 用于记录时间的变量

// ... 其他代码 ...

// 记录开始时间
start_time = XMC_SYSTICK_GetTimerValue();

// 调用三角函数
arm_sin_f32(input_angle_rad, &sine_value);

// 记录结束时间
end_time = XMC_SYSTICK_GetTimerValue();

// 计算运行时间
uint32_t elapsed_time = end_time - start_time;

作者: 10299823    时间: 2024-8-4 13:44
下载CMSIS DSP库的源代码。通常可以从ARM官方网站或GitHub获取。
将CMSIS DSP库的源代码文件夹复制到项目的src目录下。

作者: uptown    时间: 2024-8-4 15:19
#include "arm_math.h" // CMSIS DSP库头文件
#include "cyhal.h"    // Cypress HAL库头文件

#define TEST_SIZE 1000 // 定义测试数据的大小

// 初始化测试数据
float32_t test_input[TEST_SIZE];
float32_t test_output[TEST_SIZE];

int main(void) {
    cy_rslt_t result;

    // 初始化硬件抽象层
    result = cyhal_init();
    if (result != CY_RSLT_SUCCESS) {
        CY_ASSERT(0);
    }

    // 初始化测试数据
    for (int i = 0; i < TEST_SIZE; i++) {
        test_input[i] = i * 0.1f; // 示例数据
    }

    // 计时开始
    uint32_t start_time = cyhal_sysclk_get_count();

    // 调用CMSIS DSP库的sin函数
    arm_sin_f32(test_input, test_output, TEST_SIZE);

    // 计时结束
    uint32_t end_time = cyhal_sysclk_get_count();

    // 计算运行时间
    uint32_t duration = end_time - start_time;

    // 打印结果或进行其他处理
    // ...

    for (;;) {
        // 进入低功耗模式或执行其他任务
    }
}

作者: usysm    时间: 2024-8-4 16:58
System Tick定时器的精度和处理器时钟频率的影响,这种方法可能无法提供非常精确的时间测量,但它对于评估函数性能或进行相对比较通常是足够的。

作者: kkzz    时间: 2024-8-5 10:10
添加CMSIS DSP库到项目中。这通常可以通过在Project Explorer中右键点击项目,选择“Add New Item”,然后选择“Library”来完成。在弹出的对话框中,选择“CMSIS DSP”库,然后点击“Finish”。

作者: IFX-Frank    时间: 2024-8-5 10:15
谢谢分享~

作者: elsaflower    时间: 2024-8-5 12:42
float32_t input_angle_rad = 0.5f; // 输入角度,以弧度为单位
float32_t sine_value; // 存储正弦值的变量

// 计算正弦值
arm_sin_f32(input_angle_rad, &sine_value);

作者: macpherson    时间: 2024-8-5 14:41
CMSIS DSP库通常可以从ARM的官方GitHub仓库(如CMSIS_5)中获取最新版本。

作者: wwppd    时间: 2024-8-5 20:16
通过计算起始点和结束点之间的时钟周期差来获取运行时间。

作者: maqianqu    时间: 2024-8-5 22:03
使用 CMSIS DSP 库中的三角函数,例如 arm_sin_f32。

作者: 1988020566    时间: 2024-8-6 10:01
可以从 ModusToolbox 官方网站 下载并安装。

作者: gygp    时间: 2024-8-6 13:57
可以创建一个函数startTimer()来启动定时器,另一个函数stopTimer()来停止定时器并返回经过的时间。

作者: youtome    时间: 2024-8-6 16:24
设置System Tick定时器的加载值(LOAD寄存器),通常设置为一个较大的值(如0xFFFFFF),以便能够测量较短的执行时间。
启用System Tick定时器,并设置其使用处理器时钟。

作者: olivem55arlowe    时间: 2024-8-6 21:16
#include <xcore.h> #include <math.h> #include <time.h> int main(void) { time_t start, end; double runtime; // 初始化定时器 init_timer(); // 开始计时 start = read_timer(); // 执行三角函数运算 trigonometric_function(); // 结束计时 end = read_timer(); // 计算运行时间 runtime = (end - start) / (double)TIMER_CLOCKS_PER_SEC; printf("The trigonometric function took %f seconds to run.
", runtime); return 0; }

作者: modesty3jonah    时间: 2024-8-8 09:40
调用您想要测量运行时间的三角函数,例如arm_sin_f32()或arm_cos_f32()。

作者: robertesth    时间: 2024-8-8 12:46
在调用三角函数之前和之后分别记录系统时间。
计算两个时间点之间的差值,即为三角函数的运行时间。

作者: earlmax    时间: 2024-8-8 14:19
在 Include paths 中,添加 CMSIS DSP 库的路径。

作者: primojones    时间: 2024-8-8 15:54
函数执行完毕后,读取SysTick定时器的计数值。

作者: pl202    时间: 2024-8-10 10:55
在ModusToolbox中,由于没有直接的寄存器或工具来查看某条语句或函数的执行时间,你可以利用ARM Cortex-M核自带的System Tick定时器来实现这个功能。

作者: olivem55arlowe    时间: 2024-8-10 13:11
观察串口输出或使用示波器测量实际的运行时间。

作者: sesefadou    时间: 2024-8-10 14:53
根据CPU的频率,将机器周期数转换为秒或毫秒。例如,如果CPU频率是100 MHz,那么每个机器周期就是0.01微秒。

作者: mattlincoln    时间: 2024-8-10 16:34
初始化系统时钟和所需的DSP资源。

作者: wengh2016    时间: 2024-8-10 18:20
实际运行时间可能会受到其他系统任务的影响,因此可能需要多次测量取平均值。

作者: mikewalpole    时间: 2024-8-10 20:07
在函数调用完成后,立即读取System Tick定时器的当前值,这个值代表了从清除定时器到函数执行完毕所经过的ticks数。

作者: bartonalfred    时间: 2024-8-10 21:43
在ModusToolbox中基于XMC1302创建一个新的工程。ModusToolbox 3.2及更高版本通常会自动处理一些依赖项的下载和配置。

作者: 可怜的小弗朗士    时间: 2024-8-12 16:47
这个好,可以评估性能





欢迎光临 21ic电子技术开发论坛 (https://bbs.21ic.com/)