神农鼎
发表于 2023-9-9 17:32:50
用STC32的某些带 【硬件浮点+硬件三角函数】的芯片
STC32F12K54, STC8051H, STC32G96K256
========================================
带【硬件浮点+硬件三角函数】的部分MCU,是部分在去除对任何编译器的依赖!
大家只要指出硬件设计没错,或者硬件设计错在哪就行了 !
===有错就建议我们先出个应用注意事项
这部分过去没想过兼容 KEIL, 是利用硬件扩展局部去KEIL化
===暂时好像【硬件浮点+硬件三角函数】完全正确
STC8051H
【CPU最高跑 45MHz, 硬件浮点/三角函数最高跑 90MHz以上】
===edata/2K, xdata/32K
STC32G96K256
【CPU最高跑 90MHz ~ 100MHz, 硬件浮点/三角函数最高跑 180MHz ~ 190MHz以上】
===edata/64K, xdata/32K
杨为民
发表于 2023-9-9 20:32:16
楼主大言不惭:
“哪怕 KEIL 的方法是非标非主流的,也应该向她靠拢。”
“但无论 KEIL的编译器,是正标还是非标,哪怕存在一些非主流的,你必须适应她,向她靠拢,按照她的非标准来,”
楼主的标准、眼界、格局令人刮目相看,看来楼主是以KEIL的代言人自居了。
不过硬件设计的先行者是不会去等待KEIL软件的发展的。满园蛙声啼不住,STC已上具有FPU的32位单片机新台阶了。
直接硬件先行前行了
zxcv1973
发表于 2023-9-9 21:49:18
杨为民 发表于 2023-9-9 20:32
楼主大言不惭:
“哪怕 KEIL 的方法是非标非主流的,也应该向她靠拢。”
“但无论 KEIL的编译器,是正标还 ...
关键是C251的编译器只有KEIL一家,还只能去适应他,STC要能搞出自己的C251编译器最好了,还能不断增加新指令,现在加32位乘除MDU单元都是为了去适应KEIL,不然的话直接做成32位乘除指令多好
神农鼎
发表于 2023-9-9 22:34:15
现在加32位乘除MDU单元都是为了去适应KEIL,不然的话直接做成32位乘除指令多好
===这讲法有误,现在这个 MDU32, 在 KEIL C251的C程序设计相当于指令集 MDU32, 没耽误时间
MDU16是原指令集包含的部分,无MDU32,成本可以低些
LAOXU
发表于 2023-9-9 22:35:57
16、16位整数 转 浮点数(short-->float):
DMAIR = 0x28;
STC32F FPMU 的这个单元, 是 16位有符号整数 转 浮点数(short-->float),
而 KEIL 的这个单元, 是 16位无符号整数(含16位有符号整数) 转 浮点数(ushort 或 short -->float),
STC32F FPMU 的这个单元, 和 KEIL 的不一致,不能直接替代KEIL官方库,半年前我就提出了,但STC至今未修改,如直接使用,在转换无符号整数时, 当最高位为1,会产生意想不到的错误结果。
必须用软件修正后才能使用。
结论:单纯用功能上讲,没问题,100分。但和 keil不兼容,早就提了,至今未改,扣 10分,总分:90分。
LAOXU
发表于 2023-9-9 22:36:52
17、32位整数 转 浮点数(long-->float):
DMAIR = 0x29;
STC32F FPMU 的这个单元, 是 32位有符号整数 转 浮点数(long-->float),
而 KEIL 的这个单元, 是 32位无符号整数(含32位有符号整数) 转 浮点数(ulong 或 long -->float),
STC32F FPMU 的这个单元, 和 KEIL 的不一致,不能直接替代KEIL官方库,半年前我就提出了,但STC至今未修改,如直接使用,在转换无符号整数时, 当最高位为1,会产生意想不到的错误结果。
必须用软件修正后才能使用。
结论:单纯用功能上讲,没问题,100分。但和 keil不兼容,早就提了,至今未改,扣 10分,总分:90分。
LAOXU
发表于 2023-9-9 22:40:34
18、浮点数协处理器控制操作:
DMAIR = 0x31 及以上
keil 用不到,未测试。
LAOXU
发表于 2023-9-9 23:21:25
总结:
STC32F 的 FPMU 单元,主要测试工作已全部完成,总体感觉,FPMU 单元 设计的很成功,几乎挑不出问题。
不考虑运算速度,总体性能(精度)优于 KEIL,适当的插入一点软件修正,完全能替代 KEIL的官方库,提高单精度浮点数计算速度。
存在的重大安全隐患问题,只有一个:
浮点数比较(fpcmp3)单元 , DMAIR = 0x21;
执行 非浮点数时,直接按负溢出处理。这行不通的。
修改建议:
1、去掉对非浮点数的判断(不执行转负溢出处理),直接对输入数据比较。
2、或 增加对非浮点数的判断,一定要有正负符号位输出。
总之,碰到 非浮点数时,R7.0 符号位输出要正确才行。
其他问题(不是问题的问题,不改也行,加软件修正一下即可)
1、在 KEIL中,浮点数相减或比较,当指数为 0时,尾数 会和 0x07比较,能小于等于,结果则按 0处理。
2、在 KEIL中,浮点数检测,当指数为 0时(非规范浮点数),结果全部按 0处理。
LAOXU
发表于 2023-9-10 00:05:39
根据以上测试结果,对官方库 作了整理和修改,
主要改动地方有:
一.官方库有点多, Large 模式和 Huge 模式 分开 两个库, 没必要, Keil 官方库, 这两种 模式, 都是合并成一个库的, 方便使用.
而让 Keil 官方分开的库, 是根据 Memory 储存模式不同, 分别 封装 不同的库, 其最主要的区别, 是 2字节指针 和 4字节指针.
2字节指针, 是为了兼容 51程序, 直接在 251上运行, 一般使用 Binary模式运行, 早期的芯片容量不大, 为节约内存而使用.
现在已完全没必要了.
STC32 采用 Source模式运行, 且芯片容量又大, 官方手册强调 STC32G 是 4字节指针。
因此, STC32 专用库只需要编写 支持4字节指针即可, 这样, 完全可以只用一个库, 解决所有问题.
二.官方库编译时会产生大量警告及无用代码, 把库按照正规标准格式书写后编译, 这些警告及无用代码, 都不存在了。
三.STC32 官方库, 8位整数转浮点数, 16位整数转浮点数, 32位整数转浮点数, FPMU硬件中, 输入的都是有符号数, 而 Keil编译器,
输入是充许 有符号数 和 无符号数 两种类型, Keil编译器 通过软件 自动识别, 但 STC32官方库没有这方面的相关处理, 当输入无符号类型的数据,
当最高位为 1时, 转换结果 会出错,现已修正。
四.浮点数比较(comp), 由于单精度浮点数运算的原因, 尾数会有一定的误差, 如将分别计算出的 2个浮点数, 直接进行精确比较是否相等, 可能
永远都是不相等的, 无法得出正确的结果, 因此, 精确比较无实用价值.
Keil编译器在这方面设了一个窗口门阀, 修正尾数最后一字节后再测试比较, 当两数绝对值相差值, 小于一定值时, 认为是相等的,
否则不等, 输出 比较 大小结果。
LAOXU
发表于 2023-9-10 00:25:13
STC32 FPMU & MDU32 数学函数库来了!!!
使用须知:
1、本 STC32F_FPMDU.LIB 库, 包括了 FPMU & MDU32 库的所有功能,且进行了优化,
原来挂的 STC32F_FPMU , STC32G_MDU32 之类库,都要去掉, 以免冲突。
2、头文件用 STC32F_FPMDU.H ,如不需要使用 STC32 的一些特殊函数, 直接用 math.h 也行。
/*--------------------------------------------------------------------------
STC32F_FPMDU.H
Prototypes for mathematic functions for C251 Version 4.
Copyright (c) 1995-2004 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#include <math.h>
#pragma SAVE
#pragma PARM251
extern charfcheck (float val); // 浮点数检测(check),数据格式keil标准
extern charfxam (float val); // 浮点数检测(check),数据格式FPMU标准
extern charfinit(void); // 初始化协处理器
extern charfclex(void); // 清除异常
extern charfpcrr(void); // 读控制寄存器
extern voidfpcrw(char val); // 写控制寄存器
extern charfpsrr(void); // 读状态寄存器
extern voidfpsrw(char val); // 写状态寄存器
#pragma RESTORE