LAOXU 发表于 2023-1-7 15:28:39

关于 STC32 数学函数库 的讨论

STC32 数学函数库, 官方提供的LIB, 我反汇编看了, 原想学习学习, 结果发现有不少问题, 有小问题, 也有大错误(会影响程序执行结果).

小问题:

一.官方库有点多, Large 模式和 Huge 模式 分开 两个库, 没必要, Keil 官方库, 这两种 模式, 都是合并成一个库的, 方便使用.

而让 Keil 官方分开的库, 是根据 Memory 储存模式不同, 分别 封装 不同的库, 其最主要的区别, 是 2字节指针 和 4字节指针.

2字节指针, 是为了兼容 51程序, 直接在 251上运行, 一般使用 Binary模式运行, 早期的芯片容量不大, 为节约内存而使用.

现在已完全没必要了.

STC32 采用 Source模式运行, 且芯片容量又大, 如 Memory 储存模式选择 Tiny模式, 大一点的程序就编译通不过了,

就算通过了, 且怀疑运行是否正常? 工作是否可靠? (官方手册强调 STC32G 是 4字节指针), 当用 2字节指针, 去访问

CODE 中的常数, 会产生什么结果? (我没测试过, 但大概率是不会有好结果的).

因此, STC32 专用库只需要编写 支持4字节指针即可, 这样, 完全可以只用一个库, 解决所有问题.


二.官方库编译时会产生大量警告及无用代码, 把库按照正规标准格式书写后编译, 这些警告及无用代码, 都会不存在了.

LAOXU 发表于 2023-1-7 15:37:11

大问题(错误):

三.STC32 官方库, 8位整数转浮点数, 16位整数转浮点数, 32位整数转浮点数, FPMU硬件中, 输入的都是有符号数, 而 Keil编译器,

输入是充许 有符号数 和 无符号数 两种类型, Keil编译器 通过软件 自动识别, 但 STC32官方库没有这方面的相关处理, 当输入无符号类型的数据,

当最高位为 1时, 转换结果 会出错.

四.浮点数比较(comp), 由于单精度浮点数运算的原因, 尾数会有一定的误差, 如将分别计算出的 2个浮点数, 直接进行精确比较是否相等, 可能

永远都是不相等的, 无法得出正确的结果, 因此, 精确比较无实用价值.

Keil编译器在这方面设了一个窗口门阀, 修正尾数最后一字节后再测试比较, 当两数绝对值相差值, 大约小于纯尾数小数的 1/65536 时, 认为是相等的,

否则不等, 输出 比较 大小结果.

假如 STC32 设计人员在 FPMU模块 comp功能上, 已经做到了窗口比较, 我认为 设计人员是个人才超级牛逼. 由于手头暂时没有开发板未作验证,

一般大概率判断, 是不会加入的.

LAOXU 发表于 2023-1-7 15:46:07

可能存在问题(错误):

五.STC32 官方库, 所有浮点数功能模块的调用, 都是直接简单调用, 不知 FPMU硬件模块, 对输入错误(非浮点数, 无穷大), 以及计算中可能出现的

溢出(无穷大), 怎样处理?

Keil编译器在这方面做的很好, 用一整套完整的流程判断软件, 提前判断分支处理意外错误输入, 且对最后计算结果作了是否溢出(无穷大)判断处理.

如 FPMU硬件模块未能做到以上这些, 直接简单调用, 将影响程序运行的可靠性和稳定性, 因此, 需要用软件在适当的地方, 修正相应的问题(非浮点数,

无穷大等). 等手头有开发板了, 我会作进一步验证, 如有问题, 会在软件中修正解决.


暂时想到这一些.
页: [1]
查看完整版本: 关于 STC32 数学函数库 的讨论