打印
[XMC™]

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

[复制链接]
858|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

问题:

基于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 数**算库


图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 | 只看该作者
这种计算时间的方式很不错,计算的比较准确而且还不费劲

使用特权

评论回复
5
uptown| | 2024-8-4 10:59 | 只看该作者
调用你想要测量的三角函数,例如arm_sin_f32()或arm_cos_f32()。

使用特权

评论回复
6
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;

使用特权

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

使用特权

评论回复
8
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 (;;) {
        // 进入低功耗模式或执行其他任务
    }
}

使用特权

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

使用特权

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

使用特权

评论回复
11
IFX-Frank| | 2024-8-5 10:15 | 只看该作者
谢谢分享~

使用特权

评论回复
12
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);

使用特权

评论回复
13
macpherson| | 2024-8-5 14:41 | 只看该作者
CMSIS DSP库通常可以从ARM的官方GitHub仓库(如CMSIS_5)中获取最新版本。

使用特权

评论回复
14
wwppd| | 2024-8-5 20:16 | 只看该作者
通过计算起始点和结束点之间的时钟周期差来获取运行时间。

使用特权

评论回复
15
maqianqu| | 2024-8-5 22:03 | 只看该作者
使用 CMSIS DSP 库中的三角函数,例如 arm_sin_f32。

使用特权

评论回复
16
1988020566| | 2024-8-6 10:01 | 只看该作者
可以从 ModusToolbox 官方网站 下载并安装。

使用特权

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

使用特权

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

使用特权

评论回复
19
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; }

使用特权

评论回复
20
modesty3jonah| | 2024-8-8 09:40 | 只看该作者
调用您想要测量运行时间的三角函数,例如arm_sin_f32()或arm_cos_f32()。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

105

主题

189

帖子

5

粉丝