找回密码
 立即注册
楼主: LAOXU

STC32F FPMU 数学函数库 的功能验证(第三方,力求全面完整)

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-08-23 08:11:44

775

主题

1万

回帖

1万

积分

管理员

积分
18735
发表于 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




回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:27
  • 最近打卡:2025-07-10 11:53:42

116

主题

1237

回帖

1万

积分

荣誉版主

积分
13149
发表于 2023-9-9 20:32:16 | 显示全部楼层
楼主大言不惭:
“哪怕 KEIL 的方法是非标非主流的,也应该向她靠拢。”
“但无论 KEIL的编译器,是正标还是非标,哪怕存在一些非主流的,你必须适应她,向她靠拢,按照她的非标准来,”

楼主的标准、眼界、格局令人刮目相看,看来楼主是以KEIL的代言人自居了。

不过硬件设计的先行者是不会去等待KEIL软件的发展的。满园蛙声啼不住,STC已上具有FPU的32位单片机新台阶了。

直接硬件先行前行了
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-08-22 18:38:26

2

主题

195

回帖

1128

积分

金牌会员

积分
1128
发表于 2023-9-9 21:49:18 | 显示全部楼层
杨*** 发表于 2023-9-9 20:32
楼主大言不惭:
“哪怕 KEIL 的方法是非标非主流的,也应该向她靠拢。”
“但无论 KEIL的编译器,是正标还 ...

关键是C251的编译器只有KEIL一家,还只能去适应他,STC要能搞出自己的C251编译器最好了,还能不断增加新指令,现在加32位乘除MDU单元都是为了去适应KEIL,不然的话直接做成32位乘除指令多好

点评

(1)Keil的C251编译器在设计时早就考虑到对第三方扩展指令集的支持了,具体的方法是L251在做连接时,对于某个函数名,如果项目中用户的模块中(包括用户自己的库)有这个定义,就使用用户函数进行连接,不会再去用C  详情 回复 发表于 2023-9-10 00:38
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-08-23 08:11:44

775

主题

1万

回帖

1万

积分

管理员

积分
18735
发表于 2023-9-9 22:34:15 | 显示全部楼层
现在加32位乘除MDU单元都是为了去适应KEIL,不然的话直接做成32位乘除指令多好
===这讲法有误,现在这个 MDU32, 在 KEIL C251的C程序设计相当于指令集 MDU32, 没耽误时间

MDU16是原指令集包含的部分,无MDU32,成本可以低些
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1323

回帖

5505

积分

荣誉版主

积分
5505
发表于 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分。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1323

回帖

5505

积分

荣誉版主

积分
5505
发表于 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分。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1323

回帖

5505

积分

荣誉版主

积分
5505
发表于 2023-9-9 22:40:34 | 显示全部楼层
18、浮点数协处理器控制操作:
   DMAIR = 0x31 及以上

   keil 用不到,未测试。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1323

回帖

5505

积分

荣誉版主

积分
5505
发表于 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处理。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1323

回帖

5505

积分

荣誉版主

积分
5505
发表于 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编译器在这方面设了一个窗口门阀, 修正尾数最后一字节后再测试比较, 当两数绝对值相差值, 小于一定值时, 认为是相等的,

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


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1323

回帖

5505

积分

荣誉版主

积分
5505
发表于 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 char  fcheck (float val);        // 浮点数检测(check),数据格式keil标准
extern char  fxam   (float val);        // 浮点数检测(check),数据格式FPMU标准
extern char  finit  (void);                                // 初始化协处理器
extern char  fclex  (void);                                // 清除异常
extern char  fpcrr  (void);                                // 读控制寄存器
extern void  fpcrw  (char val);                // 写控制寄存器
extern char  fpsrr  (void);                                // 读状态寄存器
extern void  fpsrw  (char val);                // 写状态寄存器       


#pragma RESTORE


STC32F_LIB.rar (202.24 KB, 下载次数: 127)


点评

/*-------------------------------------------------------------------------- STC32F_FPMDU.H Prototypes for mathematic functions for C251 Version 4. Copyright (c) 1995-2004 Keil Elektronik GmbH and Ke  详情 回复 发表于 2023-9-10 00:45
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-24 03:59 , Processed in 0.127096 second(s), 99 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表