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.

[参考译文] TMS320F28075:#2614-D 使用--fp_mode=relaxed 启用 SIN 的 TMU 硬件支持。

Guru**** 2538950 points
Other Parts Discussed in Thread: TMS320F28075, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1163201/tms320f28075-2614-d-use---fp_mode-relaxed-to-enable-tmu-hardware-support-for-sin

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

您好!

我正在使用 rts2800_fpu32.lib 中的 sin 和 cos 函数。 我从 RAM 运行这些函数、 两个函数的执行时间总共为~2.7微秒。 CCS 建议"#2614-D 使用-fp_mode=relaxed 来启用 Sin 的 TMU 硬件支持"

但是,在更改设置“--fp_mode=relaxed”后, 两个函数的执行时间都为~3.2微秒。 我的印象是、"-fp_mode=relaxed"设置会使函数内联并减少总体时序、但结果不会以这种方式得到反映。  

这是否意味着、使用 rts2800_fpu32.lib 中的正弦和余弦函数并从 RAM 中运行这些函数是更好的解决方案?

我还有关于 rts2800_fpu32_fast_补 遗.lib 的问题。 我使用了该库中的 SINCOS 函数并从 RAM 运行。 时序 明显较低(~0.45微秒),但函数的输出始终分别为正弦和余弦报告1.0和1.0。 有趣的是 、Sincos 在从调试器运行时返回正确的值。 不确定发生了什么。 如果有任何帮助,将不胜感激。  

谢谢、

Leela

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

    Leela、

    F2807x 具有 TMU、因此您绝对应该使用该 TMU、而不是 FPUFastRTS 库。 FPUFastRTS 库用于 TMU 不可用的情况。 TMU 明显快于 FPUFastRTS 库。 TMU 和 FPUFastRTS 都会导致一些精度损失、因此需要"宽松"模式来启用 TMU 指令。

    现在、我们来谈谈您面临的具体问题:

    -使用"宽松"模式增加了时序。 这清楚地意味着 TMU 指令不会在应该使用的位置使用。 您是否曾尝试查看为您的代码生成的反汇编?

    -假设您使用的是32b 浮点调用、编译器应自动将正弦/余弦调用替换为相应的 TMU 调用。 您的代码中有哪些呼叫?

    -我不能说离线、为什么您的 FPUFastRTS 函数调用无法返回正确的结果。

    谢谢、

    Sira

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

    您好,Sira,

    感谢您的回答。 我指的是 sprueo2b.pdf、它说 fastRTS 库更快。 我缺少什么吗?
      

    谢谢、

    Leela

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

    您好,Sira,

    根据您的建议、我从 项目中删除了 fastRTS 库并设置 "-fp_mode=relaxed"。 下面是汇编代码。 您可以注意到、它具有 TMU 指令、 但时序仍大于标准库的正弦和余弦函数从 RAM 运行的时序。 请给出建议吗?

    谢谢、

    Leela

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

    您好!

    您在这里提到的文档是在开发带有 TMU 的芯片之前编写的。 因此、该片段仅适用于较旧的芯片、没有 TMU。

    此致、
    Andy

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

    尊敬的 Andy:

    感谢您的回答。 这澄清了我不应该使用  fastRTS 库的原因。  

    您能回答我有关 TMU 时序的问题吗?

    谢谢、

    Leela

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

    Leela、
    首先、我注意到您使用的是非常旧的编译器版本- 6.4.6。 您是否试用过最新版本?  
    第二、您是否已启用所有优化?  
    很难对时间说些什么、我需要知道您是如何测量这里的时间的。 代码片段会有所帮助。

    此致、
    Andy

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

    Andy、

    更改编译器版本或优化对于查看工程的当前状态而言具有很大的风险。 我将比较两种方法(从 RAM 运行标准库的 sin、cos 函数和  "-fp_mode=relaxed"、同时保持编译器版本和优化不变。 您认为这不是适当的比较吗?

    这是我的代码、并查看示波器中的差值。

    1. "-fp_mode=strict "

    2. "-fp_mode=relaxed"

    谢谢、

    Leela

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

    信号在示波器中反相

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

    我了解您对升级编译器的担忧、但我也知道旧版本中存在的许多错误、并在稍后修复。
    我认为、将最新一代的芯片与这种旧的编译器配对可能不是一个好主意、这主要是因为编译器可能无法完全了解芯片的功能、优化可能会更糟。
    您始终可以安装新编译器并编译代码片段、以便比较两个编译器的汇编输出。
    您还可以在此处发布上述代码的汇编输出吗? 包括 GPIO 设置和清除指令?
    代码是从闪存还是 RAM 执行? 如果从闪存执行、您的 CPU 频率和闪存时序是多少?

    此致、
    Andy

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

    很抱歉、评论了最新一代芯片- TMS320F28075不是最新一代 C28x 芯片。
    无论如何、较新的编译器可能会生成更高效的代码。

    Andy

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

    是否有方法从 RAM 运行"_relaxed_sin "和"_relaxed_cos"函数调用? 挑战是我无法在.map 文件中找到这些函数

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

    是的、您可以将库中选定的函数放入 RAM 中。
    但是、如果函数被内联、则必须将父函数放置在 RAM 中。 这可以通过使用函数名称的 simple pragma CODE_SECTION 来实现。
    必须在链接器 cmd 文件中放置来自 RTS 库的选定例程。

    此致、
    Andy

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

    Andy、

    父函数已从 RAM 运行、我相信 "__relaxed_sin "和"__relaxed_cos"是内联的。 因此 "_relaxed_sin 和"_relaxed_cos"已经从 RAM 运行。 有趣的是、时间不仅仅是标准库函数。  

    对于 独立运行时、rts2800_fpu32_fast_finc补 编.lib 中的 sincos 函数为何会针对任何 theta 报告"1"和"1"。 它们在从调试器运行时报告适当的值

    谢谢、

    Leela

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

    很有趣、我刚才评论了一些其他主题、这也可能适用于这里。

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1162796/tms320f28377d-running-rts2800_fpu-strcmp-function-from-ram-returns-bad-result/4376856#4376856

    如果 SINCOS 使用 OTP ROM 或闪存中的一些常量、则可能是存储器安全问题。
    请检查您保留功能的 RAM 部分是否属于"安全"类别。

    此致、
    Andy

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

    Andy、

    我希望您仔细检查我的链接器文件、看看您是否发现任何问题。 我在初始化期间执行 fumpathTables memcpy。  

    ================================================================


    存储器

    第0页:/*程序内存*/
    /*内存(RAM/FLASH)块可移动到 Page1进行数据分配*/
    /* begin 用于"引导至闪存"引导加载程序模式*/

    开始:origin = 0x084000,length = 0x000002
    RAMM0:origin = 0x000122、length = 0x0002DE
    RAMD0:origin = 0x00B000、length = 0x000800
    RAMLS0:origin = 0x008000、length = 0x002000
    复位:origin = 0x3FFFC0,length = 0x000002

    /*闪存扇区*/
    FLASHA:origin = 0x080000、length = 0x002000 //片上闪存*
    FLASHB:origin = 0x082000、length = 0x002000 //片上闪存*
    FLASHC:origin = 0x084002,length = 0x001FFE /*片上闪存*/
    FLASHD:origin = 0x086000、length = 0x002000 //片上闪存*/
    FLASHE:origin = 0x088000、length = 0x008000 //片上闪存*/
    /*FLASHF:origin = 0x090000,length = 0x008000 //片上闪存*/
    FLASHG:origin = 0x098000、length = 0x008000 //片上闪存*/
    FLASHH:origin = 0x0A0000,length = 0x008000 //片上闪存*/
    FLASHI:origin = 0x0A8000、length = 0x008000 //片上闪存*/
    FLASHJ:origin = 0x0B0000,length = 0x008000 //片上闪存*/
    FLASHK:origin = 0x0B8000、length = 0x002000 //片上闪存*/
    FLASHL:origin = 0x0BA000、length = 0x002000 //片上闪存*/
    FLASHM:origin = 0x0BC000、length = 0x002000 //片上闪存*/
    FLASHN:origin = 0x0BE000、length = 0x002000 //片上闪存*/

    第1页:/*数据存储器*/
    /*内存(RAM/FLASH)块可移动到 PAGE0进行程序分配*/

    BOOT_RSVD:origin = 0x000002,length = 0x000120 // M0的一部分,引导 ROM 将此用于栈*/
    RAMM1:origin = 0x000400、length = 0x000400 //片上 RAM 块 M1 *
    RAMD1:origin = 0x00B800,length = 0x000800

    RAMLS5:origin = 0x00A800,length = 0x000800

    RAMGS0:origin = 0x00C000,length = 0x008000
    FLASHF:origin = 0x090000,length = 0x008000 //片上闪存*


    部分

    /*分配计划领域:*/
    .cinit:> FLASHD PAGE = 0,align (4)
    .pinit:> FLASHD,PAGE = 0,ALIGN (4)
    .text:>> FLASHC | FLASHD PAGE = 0,ALIGN(4)
    codestart:> begin page = 0,align (4)



    ramfuncs

    l F021_API_F2837xD_FPU32.lib
    l rts2800_fpu32_fast_f늹 ular.lib (.text)//将正弦函数加载到 RAM 中


    负载= FLASHD、
    运行= RAMLS0、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    run_size (_RamfuncsRunSize)、
    run_end (_RamfuncsRunEnd)、
    PAGE = 0、ALIGN (4)

    FPUmathTables:load = FLASHF,
    运行= RAMGS0、
    run_start (_FPUmathTablesRunStart)、
    Load_start (FPUmathTablesLoadStart)、
    load_size (_FPUmathTablesLoadSize)、
    PAGE = 1.

    /*分配未初始化的数据段:*/
    .stack:>RAMM1 page = 1.
    .ebss:>> RAMLS5 | RAMGS0 PAGE = 1.
    .esysmem:> RAMLS5 PAGE = 1.

    /*初始化段进入闪存*/
    .econst:> FLASHD PAGE = 0,ALIGN (4)
    .switch:> FLASHD page = 0,align (4)

    .reset:> reset,page = 0,type = DSECT //未使用,*/

    /*
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //文件结束。
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *

    谢谢、

    Leela

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

    Leela、

    链接器文件对我来说看起来正常。 ramfuncs 被复制到安全的 LSRAM 中。 从安全存储器中执行的代码应该能够访问安全存储器和不安全存储器。 FPUTables 位于 GSRAM 中、这是不安全的、但正如我说过的、这不应该是问题。
    我不是很好。
    但是、无论如何、我会尝试使用 TMU、因为它应该比  rts2800_fpu32_fast_f늹 补程序中的 sincos 快大约3倍。

    此致、
    Andy

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

    Andy、

    TMU 肯定会增加时间。 我不知道原因。 如何查看 Sincos 函数的汇编代码? 我只能在汇编代码中看到以下引用。 有什么想法吗?

    LCR    #_SINCOS   

    全局_sincos

     

    谢谢、

    Leela

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

    您可以在 C2000Ware 的库文件夹中查看正弦汇编代码-其中包含源文件。
    第二种方法是在调试时、在 CCS 中打开 Dissembly 窗口、然后您可以单步执行汇编代码。

    此致、
    Andy

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

    Andy、

    感谢您将我指向  C2000Ware 中的库文件夹。 这很有帮助。 但是、我能否看到在项目中为 SINCOS 函数生成的汇编代码? 挑战是它在调试模式下工作。 只有在独立模式下运行时才会出现问题。

    谢谢、

    Leela

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

     Dissembly 窗口中的代码在调试或独立时应该没有不同。 当汇编步进时、您可以看到代码的确切指令、请参阅地址等 您可以在此处发布一些汇编代码的屏幕截图。
    当然、您可以对 TMU 解决方案执行相同的操作。

    Andy

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

    Andy、

    好消息!!! 我找到了这个问题、现在我能够使用  rts2800_fpu32_fast_finc补 码.lib 中的 sincos 函数。到十六进制转换的目标文件在我们的代码库中存在一些问题、该代码库仅处理32KB 的存储器、因此需要使用引导加载程序。 由于我添加了更多代码、导致存储器超过32K 字节、但引导加载程序未对其进行刷写。 如前所述、函数在调试模式下工作、但不在独立模式下工作。 它的工作原因是调试器能够下载整个程序、而我们的引导加载程序代码不能下载。 顺便说一下、 Sincos 函数仅花费~0.4usec、这明显低于 TMU 或 rts2800_fpu32.lib。 任何方式、感谢您的观看。

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

    好极了。
    但您是否尝试过 TMU 解决方案? 因为我怀疑正弦信号是否比 TMU 更快- FAST 补充库文档中给出的周期和数据表中给出的 TMU 周期表明 TMU 应该比 TMU 快大约3倍。

    我鼓励您尝试一下。

    此致、
    Andy

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

    Andy、

    由于我先前共享了时序、TMU 时序大于  rts2800_fpu32.lib

    这里是数字...

    TMU = 3.1 μ C

    rts2800_fpu32.lib = 2.7 μ s

    rts2800_fpu32_fast_补 遗.lib = 0.4usec

    谢谢、

    Leela

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

    如果是这种情况、则说明存在问题。 您应该检查为 TMU 生成的汇编。
    它肯定应该比两个库都快。

    此致、
    Andy