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.

[参考译文] CCS/TMS320F28335:浮点计算时间支持

Guru**** 2589245 points
Other Parts Discussed in Thread: C2000WARE, TMS320F28335

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/737452/ccs-tms320f28335-floating-point-calculation-time-comsuption

器件型号:TMS320F28335
主题中讨论的其他器件:C2000WARE

工具/软件:Code Composer Studio

尊敬的 TI 专家:

我将 CCS 8.2和 TI F28335实验套件用于我的项目。

首先,我使用 C2000ware 中的示例代码来查看使用 fastRTS 执行 atan()所需的周期数。

示例的目录为 C:\ti\c2000\C2000Ware_1_00_05_00\libraries\math\FPUfastRTS\c28\examples。

我发现第140行中的 atan()需要58个周期。 我通过在 atan()之前设置一个断点来进行计数、并在按下 F5之前和之后查看 CPUTIMER / TIMER0TIM 的差异。 (我不确定是否可以这样测量周期。) 结果接近于它在 SPRCA75中声明的值(对于 atan 为51个周期)。

但是、当我尝试在自己的项目中执行相同的操作时、我发现 atan 需要150个周期、通过重复上述方法进行测量。

我按照启用 fastRTS 的指令操作、并正确设置链接器顺序。 我非常确信它使用的是 fastRTS 而不是正常的 RTS。 这是因为,如果我更改链接器顺序以让正常 RTS 优先,那么当我在 atan()行上按 F5时,它将进入 atanf (float y,float x),并且需要更长的时间。 如果我使链接器顺序正确(fastRTS 优先)、那么当我按 F5时、它不会进入 atanf (float y、float x)。 这意味着它使用 fastRTS。

我的映射文件如下所示。 atan()位于 pll1.c. 我已将 pll1.c 中的所有函数复制到 RAM。 因此、我只能在 ramFuncs 部分中看到 pll1.obj、而不是.text 部分。

RAMFuncs  0   00305987   000011c3    运行 ADDR = 00009000
三、会议的报告

………………
                 003065a0   00000104    pll1.obj (ramFuncs)
三、会议的报告

.text     0   0030000a   0000566d     
         
………….
                 003046e1   0000012b    rts2800_fpu32.lib:e_logf.c.obj (.text)
.
                 00304a47   00000110    rts2800_fpu32.lib:e_expf.c.obj (.text)
                 00304b57   00000107                      :LL_div28.asm.obj (.text)
三、会议的报告
                 00304fa8   00000083    rts2800_fpu32.lib:fd_mpy28.asm.obj (.text)
三、会议的结果
                 00305206   00000056    rts2800_fpu32.lib:boot28.asm.obj (.text)
                 0030525c   0000004f    rts2800_fpu32_fast_补 遗.lib:atan2_f32.obj (.text)
.
                 00305438   00000034    rts2800_fpu32_fast_补 遗.lib:cos_F32.obj (.text)
                 0030546c   00000034                                      :Sin_F32.obj (.text)
                 003054a0   0000002d    ePWM.obj (.text:retain)
                 003054cd   0000002a    rts2800_fpu32.lib:l_div28.asm.obj (.text)
                 003054f7   00000029                      :exit.c.obj (.text)
                 00305520   00000024                      :cpy_tbl.c.obj (.text)
                 00305544   00000021    rts2800_fpu32_fast_finc补.lib:sqrt_F32.obj (.text)
                 00305565   00000020    rts2800_fpu32.lib:l_tofsfpu32.asm.obj (.text)
                 00305585   0000001f                      :fd_tol28.asm.obj (.text)
                 003055a4   0000001e                      :ll_cmp28.asm.obj (.text)
                 003055c2   0000001d                      :memcpy.c.obj (.text)
                 003055df   0000001c                      :fs_tofdfpu32.asm.obj (.text)
                 003055fb   00000019                      :args_main.c.obj (.text)
                 00305614   00000019    rts2800_fpu32_fast_补 遗.lib:div_F32.obj (.text)
                 0030562d   00000018    rts2800_fpu32.lib:strncmp.c.obj (.text)
                 00305645   00000013    canrw.obj (.text)
                 00305658   0000000b    rts2800_fpu32.lib:u_div28.asm.obj (.text)
                 00305663   00000009                      :_lock.c.obj (.text)
                 0030566c   00000008    CodeStartBranch.obj (.text)
                 00305674   00000002    rts2800_fpu32.lib:pre_init.c.obj (.text)
                 00305676   00000001                      :startup.c.obj (.text)

      模块                           代码   初始化数据  未初始化数据
      ----                            ----   --------   ----------
   ..\src\
 三、会议的报告    
      pll1.obj                         520    0                 0    

我的问题是:

(1)通过查看 CPU 定时器的差异来测量周期是否正确?

(2)我自己的项目基于仅使用定点 IQmath 而不是浮点的旧项目。 我相信我已经打开了浮点单元,因为当我在 atan()行上按 F5时,它将进入 atanf (float y,float x)。

我只是想知道我错过了哪些寄存器或设置会为 atan 产生150个周期。 我应该如何检查? 我愿意花几天时间来研究原因并阅读一些内容。

提前感谢您。

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

    不知道与您比较的两个项目有关的任何信息、但我要查看的位置是 FAST atan 是否正在使用 fastRTS 支持库

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

    感谢你能抽出时间。 是的、我同意您的观点、务必检查是否使用 fastRTS。 我已经完成了前面提到的以下检查:

    (1)映射文件如下所示。 仅包括具有 RTS 的行。 它似乎正在使用 fastRTS、如"0030525c 0000004f 行所示 rts2800_fpu32_fast_f补 遗.lib:atan2_f32.obj (.text)"。

    (2)如果我更改链接器顺序以让正常 RTS 优先、则当我在 atan()行上按 F5时、它将进入 atanf (float y、float x)、并且所需的时间更长。 如果我使链接器顺序正确(fastRTS 优先)、那么当我按 F5时、它不会进入 atanf (float y、float x)。 这意味着它使用 fastRTS。

    您能否告知您是否有其他方法来检查是否使用 fastRTS?

    如果已经在使用 fastRTS、我可以检查什么以了解原因?

    我已经挣扎了几天、这对项目至关重要。 请帮帮我。

    非常感谢。

    .text 0 0030000a 0000566d

    ………….
    003046e1 0000012b rts2800_fpu32.lib:e_logf.c.obj (.text)
    .
    00304a47 00000110 rts2800_fpu32.lib:e_expf.c.obj (.text)
    00304b57 00000107 :LL_div28.asm.obj (.text)
    三、会议的报告
    00304fa8 00000083 rts2800_fpu32.lib:fd_mpy28.asm.obj (.text)
    三、会议的结果
    00305206 00000056 rts2800_fpu32.lib:boot28.asm.obj (.text)
    0030525c 0000004f rts2800_fpu32_fast_f补 遗.lib:atan2_f32.obj (.text)
    .
    00305438 00000034 rts2800_fpu32_fast_补 遗.lib:cos_F32.obj (.text)
    0030546c 00000034 :Sin_F32.obj (.text)
    三、会议的结果
    003054cd 0000002a rts2800_fpu32.lib:l_div28.asm.obj (.text)
    003054f7 00000029 :exit.c.obj (.text)
    00305520 00000024 :cpy_tbl.c.obj (.text)
    00305544 00000021 rts2800_fpu32_fast_finc补.lib:sqrt_F32.obj (.text)
    00305565 00000020 rts2800_fpu32.lib:l_tofsfpu32.asm.obj (.text)
    00305585 0000001f :fd_tol28.asm.obj (.text)
    003055a4 0000001e :ll_cmp28.asm.obj (.text)
    003055c2 0000001d :memcpy.c.obj (.text)
    003055df 0000001c :fs_tofdfpu32.asm.obj (.text)
    003055fb 00000019 :args_main.c.obj (.text)
    00305614 00000019 rts2800_fpu32_fast_补 遗.lib:div_F32.obj (.text)
    0030562d 00000018 rts2800_fpu32.lib:strncmp.c.obj (.text)
    三、会议的结果
    00305658 0000000b rts2800_fpu32.lib:u_div28.asm.obj (.text)
    00305663 00000009 :_lock.c.obj (.text)
    ………….
    00305674 00000002 rts2800_fpu32.lib:pre_init.c.obj (.text)
    三、会议的报告
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、正如您可以确认的、您正在使用快速实现、您是从 RAM 还是闪存运行它? 检查两个项目的链接器文件、以查看 fastRTS 库是否可能被放入 ramfuncs 段中、并且正在从 RAM 运行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ivan、

    使用 CPU 计时器以您所执行的方式测量执行情况是合理的。 结果还将包括函数调用开销。

    Mitja 建议检查链接的命令文件是非常正确的。 映射文件中的第一个 cloudmn 会告诉您模块链接的起始地址:
    0030525c 0000004f rts2800_fpu32_fast_f补 遗.lib:atan2_f32.obj (.text)

    在 F28335上、0x30520C 对应于 XINTF 区域7。 您似乎有外部存储器、并已将此代码放置在片外? 没有什么问题、但您将会对脱离芯片支付执行周期损失、因此150个周期并不是太令人惊讶。 示例中的链接器文件不使用 XINTF、因此我认为这是旧工程的一个功能。

    此致、

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

    Richard 和 Mitja、大家好、

    感谢你的建议。 我没有将 fastRTS 包含在 RAM 中、您是对的。 这就是计算 atan()需要150个周期的原因。

    映射文件显示:0030525c 0000004f rts2800_fpu32_fast_补 遗.lib:atan2_f32.obj (.text)。

    我认为地址是闪存、而不是 XINTF 区域7。 闪存地址从0x300000开始。  

    问题(1):我说得对吗?

    2.我已通过在.cmd 文件中添加以下内容将 faterRTS 库复制到 RAM 中、这是在线建议的。 此外、我还会在初始化期间将器件复制到 RAM 中。

     .text              :{rts2800_fpu32_fast_addr.lib(.text)},
                           LOAD = FLASHHTOC、     PAGE = 0
                           运行= RAML1L2L3、      页= 0
                           load_start (_fastrts_loadstart)、
                           load_end (_fastrts_loadend)、
                           run_start (_fastrts_runstart)

    编译工程后、映射文件中会显示以下内容。  

    .text     0   00308ba2   000000F1    run ADDR = 0000b3c2
                     00308ba2   0000004f    rts2800_fpu32_fast_补 遗.lib:atan2_f32.obj (.text)
                     00308bF1   00000034                                      :Cos_F32.obj (.text)
                     00308c25   00000034                                      :Sin_F32.obj (.text)
                     00308c59   00000021                                      :sqrt_F32.obj (.text)
                     00308c7a   00000019                                      :div_F32.obj (.text)

    我检查现在大约需要60个周期来完成 atan2、这是非常合理的。

    但是、我在编译时看到了以下警告。

    警告:重复的段名(工程名称).out (.text)(已忽略)

    问题(2):

    我是否以正确的方式将库复制到 RAM 中? 我可以忽略警告吗? 是否有任何其他方法可以在没有警告的情况下实现它? 我不想在稍后因警告而遇到其他奇怪的问题。

    非常感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、这是在闪存中、与 C2000系列不同的 MCU 具有稍微不同的存储器映射、因此您必须查看文档(tms320f28335.pdf 中的第159页)
    2.很显然,你达到了你想要的目标。 我以不同的方式执行它(因为我将不同的段加入一个段中、因为它使从闪存复制到 RAM 变得更容易)。 那么、这是我的解决方案:

    ramfuncs: {
    rts2800_fpu32_fast_补 编.lib (.text)
    rts2800_fpu32_fast_补 编.lib (.text)
    rts2800_fpu32_fast_补 编.lib (.text)
    rts2800_fpu32_fast_补 编.lib (.text)
    rts2800_fpu32_fast_补 编.lib (.text)
    rts2800_fpu32.lib (.text)
    *(ramfuncs)
    *(.TI.ramfunc)
    *(IQmath)

    负载= P_FF、
    运行= P_L78、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    run_size (_RamfuncsRunSize)、
    run_end (_RamfuncsRunEnd)、
    PAGE = 0、ALIGN (4)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Mitja、

    感谢您的评论。 您的方法比我在其他帖子中找到的方法更好、因为它在编译期间不显示任何警告。

    但是、我必须替换"rts2800_fpu32.lib 行 (.text)"中的"rts2800_fpu32.lib (.text)"、因为我的映射文件只有带有"asm"的文件。

    它似乎是 IQdiv28。 我找不到 rts2800_fpu32.lib (.text)。 我只有 rts2800_fpu32.lib (.text)和 rts2800_fpu32.lib (.text)我在代码中使用浮点除法。

    问题1:

    为什么我会获得如此多的奇怪文件、例如 rts2800_fpu32.lib:u_div28.asm.obj (.text)、rts2800_fpu32.lib (.text)和 rts2800_fpu32.lib (.text)、fd_mpy28.asm.obj? 这是否意味着我实际上使用定点进行浮点计算、反之亦然? 在项目中、我有 IQmath 和浮点数学。 以下是映射文件中所有与 IQ 和 RTS 相关的行。

    问题2:

    浮点除法应使用 fastRTS、但乘法仍应使用正常 RTS。 哪个 ext 库文件是乘法运算使用的? 我还想将正常 RTS 的乘法库复制到 RAM 中。 我的乘法比任何其他计算都多得多。

    .cinit    0   0030782a   00000a45     
             ………………
                     00308249   0000000e    rts2800_fpu32.lib:exit.c.obj (.cinit)
    .
                     0030825f   00000005    rts2800_fpu32.lib:_lock.c.obj (.cinit:_lock)
                     00308264   00000005                      :_lock.c.obj (.cinit:__unlock)
                     00308269   00000004                      :errno.c.obj (.cinit)
                     0030826d   00000002    --hole --[填充= 0]
    econst   0   00308910   00000266     
             三、会议的报告
                     00308af4   00000010    rts2800_fpu32.lib:e_expf.c.obj (.econst)
                     00308b04   00000010                      :e_logf.c.obj (.econst)
             三、会议的报告
                     00308b46   00000004    rts2800_fpu32.lib:e_expf.c.obj (.econst:_half)
                     00308b4a   00000004                      :e_expf.c.obj (.econst:_ln2HI)
                     00308b4e   00000004                      :e_expf.c.obj (.econst:_ln2LO)
    .text     0   0030000a   00005545     
             三、会议的结果
                     00304719   0000012b    rts2800_fpu32.lib:e_logf.c.obj (.text)
             .
                     00304a7b   00000110    rts2800_fpu32.lib:e_expf.c.obj (.text)
                     00304b8b   00000107                      :LL_div28.asm.obj (.text)
             三、会议的报告
                     00304fdc   00000083    rts2800_fpu32.lib:fd_mpy28.asm.obj (.text)
             三、会议的报告
                     0030523a   00000056    rts2800_fpu32.lib:boot28.asm.obj (.text)
             三、会议的结果
                     00305409   00000029    rts2800_fpu32.lib:exit.c.obj (.text)
                     00305432   00000024                      :cpy_tbl.c.obj (.text)
                     00305456   00000020                      :LL_tofsfpu32.asm.obj (.text)
                     00305476   0000001f                      :fd_tol28.asm.obj (.text)
                     00305495   0000001e                      :LL_cmp28.asm.obj (.text)
                     003054b3   0000001d                      :memcpy.c.obj (.text)
                     003054d0   0000001c                      :fs_tofdfpu32.asm.obj (.text)
                     003054ec   00000019                      :args_main.c.obj (.text)
                     00305505   00000018                      :strncmp.c.obj (.text)
             一
                     00305530   0000000b    rts2800_fpu32.lib:u_div28.asm.obj (.text)
                     0030553b   00000009                      :_lock.c.obj (.text)
             .
                     0030554c   00000002    rts2800_fpu32.lib:pre_init.c.obj (.text)
                     0030554e   00000001                      :startup.c.obj (.text)

    .ebss     1   0000c000   00000fa6    未初始化
             ………….
                     0000c93e   00000002    rts2800_fpu32.lib:_lock.c.obj (.ebss:__lock)
             .
                     0000cbbe   00000002    rts2800_fpu32.lib:_lock.c.obj (.ebss:__unlock)
             一
                     0000cc7c   00000001    rts2800_fpu32.lib:errno.c.obj (.ebss)
             ………………
                     0000cdee   00000006    rts2800_fpu32.lib:exit.c.obj (.ebss)
     

    IQMath    0   0030585f   000002a8    运行 ADDR = 00008310
                     0030585f   0000009d    IQmath_fpu32.lib:IQ24log.obj (IQmath)
                     003058fc   00000088                     :IQ24atan2PU.obj (IQmath)
                     00305984   00000060                     :IQ24mag.obj (IQmath)
                     003059e4   00000047                     :IQ16div.obj (IQmath)
                     00305a2b   00000047                     :IQ24div.obj (IQmath)
                     00305a72   00000042                     :IQ24sqrt.obj (IQmath)
                     00305ab4   00000027                     :IQ24cosPU.obj (IQmath)
                     00305adb   00000016                     :IQ16toF.obj (IQmath)
                     00305af1   00000016                     :IQ24toF.obj (IQmath)
    IQmathTables
    *         0   00306cda   00000b50    运行 ADDR = 0000a1d4
                     00306cda   00000b50    IQmath_fpu32.lib:IQmathTables.obj (IQmathTables)
    FPUmathTables
    *         0   00308270   000006a0    运行 ADDR = 0000ad24
                     00308270   000006a0    rts2800_fpu32_fast_补 码.lib:FPUmathTables.obj (FPUmathTables)
    fastRTS   0   00308b76   0000011b    运行 ADDR = 0000b3c4
                     00308b76   0000004f    rts2800_fpu32_fast_补 遗.lib:atan2_f32.obj (.text)
                     00308bc5   00000019                                      :div_F32.obj (.text)
                     00308bde   00000034                                      :Cos_F32.obj (.text)
                     00308c12   00000034                                      :Sin_F32.obj (.text)
                     00308c46   00000021                                      :sqrt_F32.obj (.text)
                     00308c67   0000002a    rts2800_fpu32.lib:l_div28.asm.obj (.text)
    .reset    0   003fffc0   00000002    DSECT
                     003fffc0   00000002    rts2800_fpu32.lib:boot28.asm.obj (.reset)



    再次感谢你的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    至于对象名称的差异、您的库似乎是使用不同的选项或使用不同的编译器构建的、这些编译器以不同的方式封装了库。

    1.该库是从多个源文件(显然每个操作一个.asm 文件)构建的。 无需查看库(源可用、因此您可以随意查看)、在对两个无符号整数进行除法时使用 u_div28、在对两个长整型值进行除法时使用 l_div28、在对两个长整型值进行除法时使用 l_div28。 您必须仔细查看整个项目、以确定您在何处使用它们。 我建议您将编译器设置为保留.asm 文件、并将 C 源代码交叉列出(-c_src_interlist)。 然后、您可以解析对这些函数的调用、并查看实际使用它们的位置
    2.乘法不需要库调用,因为它有直接的硬件指令可用。 加法和减法也是如此。