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

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

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

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

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

直接硬件先行前行了
回复 支持 反对

使用道具 举报 送花

2

主题

185

回帖

1048

积分

金牌会员

积分
1048
发表于 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
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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

主题

1327

回帖

5395

积分

荣誉版主

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

主题

1327

回帖

5395

积分

荣誉版主

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

主题

1327

回帖

5395

积分

荣誉版主

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

   keil 用不到,未测试。
回复 支持 反对

使用道具 举报 送花

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

54

主题

1327

回帖

5395

积分

荣誉版主

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

主题

1327

回帖

5395

积分

荣誉版主

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

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 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, 下载次数: 99)


点评

/*-------------------------------------------------------------------------- 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-5-2 01:57 , Processed in 0.137256 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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