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.

[参考译文] 编译器/TMS320F28375S:设置了 SUBL 和 OVM 的无符号长整型变量

Guru**** 2524550 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/649460/compiler-tms320f28375s-unsigned-long-variables-with-subl-and-ovm-set

器件型号:TMS320F28375S

工具/软件:TI C/C++编译器

查找有关如何使用具有32位无符号数学运算的 SUBL 编译器的帮助。

这 是一个系统、在该系统中、需要为所有有符号数学运算全局设置 OVM 一次。  然而、令人惊讶  的是、SUBL 正与无符号运算一同使用、而有符号饱和被应用于无符号数学运算。

例如

unsigned long global_a、global_B、global_C;

MAIN ()

ASM (" SETC OVM");

global_a = 0x7fffffffUL;

GLOBAL_B = 0x80000000UL;

GLOBAL_C = GLOBAL_B-GLOBAL_A;

该操作将使用 SUBL 而不是 SUBUL、并由于带有无符号变量的符号上下文而产生错误结果。   使用 SUBL 时、溢出将被视为饱和值为0x7ffffffff 和0x80000000的有符号数学运算。  这似乎很奇怪。  由于内核不支持0xffffffff 和0x00000000饱和的无符号 OVM 模式、编译器为什么会为这些操作选择 SUBL 而不是 SUBUL?

了解到 Subul 具有64位数学运算的预期用途(SUBL/SUBBL)、并且用户必须适当地管理 OVM ( 这可以通过选择性地应用 OVM 来解决)。   但是、我们需要了解这背后的原理。   这些文档未提供有关此潜在案例的任何明确警告。

v16.9.1.LTS。  未尝试17.9

此致、

Eric

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

    [报价用户="Eric Best"]这 是一个系统,在该系统中,需要为所有已签名的数学运算全局设置 OVM 一次。

    遗憾的是、这不受支持。  请参阅  C28x 编译器手册中标题为状态寄存器的部分。  它表明 OVM 假定为0。  当 C 函数启动时、或者在 C 函数调用的任何函数(无论是 C 还是汇编)返回时、它必须为0。  在执行手动编码的汇编函数时、OVM 可以更改为1、但必须在控制更改为 C 函数之前将其恢复为0。

    谢谢、此致、

    乔治