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.
创建了一个测试、该测试使用正常的乘法/除法填充256个浮点值、然后使用 IQ20使用相应的 IqmathLib 运算来填充另256个阵列、其中:
前2个选项(-mload 和-mcode-region=any)是必须的、因为我们需要低 FRAM 和 HIFRAM。 最后一个是不幸的(_LARGE_DATA.lib)、但这只是看起来使用 GCC 进行编译并且指定了内存要求(请参阅)。
浮点值和数学填充值由调试 LED 围绕并在示波器上进行跟踪:
结果也并不乐观:
此外、当尝试将 IqmathLib 结果转换为 float (使用_IQ20toF)以与实数 float 值进行比较时、代码不再起作用、甚至调试会话在刷写后会立即卡住:
如上所述、似乎是一个限值? 到247时、项目仍然可以工作、也可以调试、而使用248或以上版本时、不再需要。 247/248构建之间的映射差异未显示任何特殊情况来损坏代码:
随附测试项目。
e2e.ti.com/.../test_5F00_GCC.zip
非常感谢您提供帮助或建议!
丹尼尔
关于速度、您的定点版本不会比浮点版本具有速度优势、因为它还会执行浮点运算。
_IQ20((float)(i + 1U)
这会将整数转换为浮点数、然后再返回、这是没有充分理由的。 更糟糕的是、您会得到浮点乘法。 (请参阅头文件中的_IQ20定义。)
至于阵列大小增加时出现故障的情况、似乎堆栈空间不足。
谢谢! 事实上、这大大改善了 IQmath 测试时序!
根据 David 的建议修改的代码为:
static _iq20 xm[TEST_SIZE]; static void math_test(void) { _iq20 f1 = _IQ20(2.103f); _iq20 f2 = _IQ20(1.135f); xm[0] = _IQ20(1.0f); for (uint16_t i = 2; i <= TEST_SIZE; i++) { if (xm[i - 2U] > _IQ20(1.0f)) { xm[i - 1U] = _IQ20div((_IQ20mpy(f1, _IQ20(i + 1U)) + _IQ20mpy(f2, _IQ20(i - 1U))), xm[i - 2U]); } else { xm[i - 1U] = _IQ20mpy((_IQ20mpy(f1, _IQ20(i + 1U)) + _IQ20mpy(f2, _IQ20(i - 1U))), xm[i - 2U]); } } }