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.

[参考译文] TMS320F28379S:无符号长整型(UINT32)值溢出检查的好方法

Guru**** 2530660 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/914138/tms320f28379s-good-way-for-unsigned-long-uint32-value-overflow-check

器件型号:TMS320F28379S

你(们)好。

我目前正在处理一个程序 、该程序需要在与另一个浮点(REAL32)变量进行乘法后检查无符号长整型(UINT32)值溢出。 我目前的方式是:

1、乘法后将结果存储在 无符号 长整型(UINT32)缓冲器中

2、对照常数 uint32_MAX_VAL      4294967295.0检查缓冲器值

3.如果拒绝更新值,如果在范围内,则将缓冲区复制到最终无符号日志(UINT32)变量

但检查将在时间较敏感的地方进行、并将被多次调用。 恐怕这可能会导致超时。 我的问题是:

a.是否有其他方法可以检查变量溢出?

b. 浮点(REAL32)计算是否耗时? 是否有任何计算执行时间的文档?  

c.或者我应该将所有内容转换为 long long (uint64)? 与 浮点(REAL32)相比、哪一个需要更长的时间?

d.将 UINT32转换为 REAL32是否很耗时?

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

    姚,

    请给我一天时间、了解一下这方面的最佳选择、然后返回给您。

    谢谢、

    Sira

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

    姚,

    我假设您在用 C 语言编写代码。如果您要执行 uint32 x float32、我相信编译器将使用 UI32TOF32指令首先将 uint32转换为 float32。 然后、它将使用 MPYF32指令执行乘法。

    此时、STF 寄存器的 LVF 标志将指示是否发生溢出。 因此、您可以使用它来检查溢出、而不是在代码中添加 if (product > Max_value)条件?

    然后、您将浮点值转换回 uint32、我相信编译器将为此使用 F32TOUI32指令。

    您可以参考 SPRUEO2了解 FPU 指令及其执行周期。 上面列出的指令全部是2p 周期指令、即单周期指令、前提是第二条指令是不冲突的指令。

    我认为、如果在没有 FPU64硬件的 F28379S 上改用双精度、最终会花费更长的时间。

    谢谢、

    Sira

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

    感谢您的回复! 最好知道有一个用于检查溢出的标志! 这将使一切变得容易得多。

    我已经阅读了您提到的手册。 我知道需要先将 STF 寄存器的值移动到 ST0寄存器。 您能告诉我如何调用 MOVST0并在 C 语言中读取 ST0寄存器吗?  我以前从未使用过汇编语言。

    此外、如何将 long long (int64)转换为 float (REAL32)? SPRUEO2中没有用于此类转换的指令、这意味着转换需要很长时间吗?

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

    姚,

    让我考虑一下实现这一目标的最佳方法。 为此、请向我发送您当前的 C 代码。

    其他要点:

    -您还可以将 STF 寄存器移动到存储器位置(MOV32 mem32、STF)

    -阅读 SPRU514S 的第7.5节、了解如何将 C 与汇编语言连接

    谢谢、

    Sira

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

    您好,Sira,

    感谢您的回复。 我决定将所有内容移动到64位变量、因为我们发现32位浮点的准确度不够。 尽管如此、感谢您向我展示这些内部寄存器和汇编技术、我相信这些技术将来会很方便。 感谢你的帮助。

    此致、

    李浩民