This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C123GH6PM:类型转换太慢

Guru**** 2460850 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/653847/tm4c123gh6pm-type-casting-is-way-too-slow

器件型号:TM4C123GH6PM

您好!

我的问题是类型转换。 使用 CMSIS 的"ARM_Q15_TO_FLOAT"函数或仅使用普通"my_float =(float) my_Int16"、需要13ms 将256个值从 Int16_t 转换为 float、运行频率为80MHz。 这是怎么做的? 奇怪的是、它需要这么长的时间。 不应大致为:           256 *(1个负载+ 1个存储)/ 80、000、000 = 6.4us?  <<<忽略此问题

我正在使用 Tiva C LaunchPad。 欢迎提出任何建议。

编辑:这是转换代码的反汇编窗口。 cut_frame 的类型为 float32_t、而 ADC_OUT_0的类型为 int16_t

汇编代码位于 C 代码下方。

100: 对于(j = 0;j < 256;j++)
0x00002848 2400 MOV R4、#0x00
0x0000284A E00D B 0x00002868
101: s减半_FRAME[j]= ADC_OUT_0[j];
102: //arm_Q15_TO_float (adc_out_0、cute_frame、256);
103:}
104: 否则为{
0x0000284C 485B LDR R0、[PC、#364];@0x000029BC
0x0000284E F9300014 LDRSH R0、[r0、R4、LSL #1]
0x00002852 EE000A10 VMOV S0、r0
0x00002856 EEB80AC0 VCVT.F32.S32 s0、s0
0x0000285A F50D6000加载项 R0、SP、#0x800
0x0000285E EB000084 ADD R0、r0、R4、LSL #2
0x00002862 ED800A00 VSTR S0、[r0、#0x00]
0x00002866 1C64 添加了 R4、R4、#1
0x00002868 2CFF CMP R4、#0xFF
0x0000286A D9EF BLS 0x0000284C
0x0000286C E011 B 0x00002892 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您是否在 CCS 编译设置中启用了浮点支持? 您能否还检查反汇编并查看类型转换是如何编译到什么指令序列中的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、
    我已使用汇编代码更新了我的帖子。 FPU -启用单精度(uVision)。 尽管循环需要10条指令、但转换不应花费那么长的时间。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    两个问题

    1. 您是否计算出每条指令需要多少个周期?
    2. 您如何测量时间?

    我建议使用不同的环路尺寸进行多次测量。 比如64、128、256和512M。 然后绘制这些图。 我希望您在外推回零时会找到固定偏移、这将表示您需要减去的测量开销。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    1.您是指 C 指令吗? 环路内部只有1个、另一个会被注释掉。
    2.我正在使用 SysTick 计数器。 关键是、后面的代码要复杂得多(512点傅里叶变换、矢量复制、大量矩阵乘法)、所需时间大约为8ms。 但是、我肯定会看到不同长度所需的量。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Savo Pejovic"]1. 您是指 C 指令吗? [/报价]

    否、汇编指令。 任何合适的装配手册都应详细说明说明时序。 请记住、在该级别、您必须考虑内存访问时间和高速缓存问题。 您应该能够很好地了解预期的范围、即使不知道到底存在什么延迟(IE 执行最小值/最大值计算)

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这完全是我的错误。 我将 SysTick 变量放置在错误的位置。 感谢您的帮助。