[XMC™] 基于XMC1302,如何在ModusToolbox中加载CMSIS DSP库,如何计算三角函数的运行时间?

[复制链接]
2432|30
 楼主| IFX_Lingling 发表于 2024-7-1 16:59 | 显示全部楼层 |阅读模式

问题:

基于XMC1302,如何在ModusToolbox中加载CMSIS DSP库,如何计算三角函数的运行时间?
答案:

步骤一:使能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 数**算库


图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()。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:
简介:关于英飞凌——我们致力于打造一个更加便利、安全和环保的世界,在赢得自身成功发展的同时,积极践行企业社会责任。

136

主题

224

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部