LAOXU 发表于 2022-12-17 05:17:43

对STC8H硬件MDU16所用寄存器的建议

STC8H硬件中,有自带MDU16硬件16位乘除法器,不但支持整型、长整型类型的数据乘除法运算,

但更多也是最强劲的功能和用途,在于作为浮点数运算的基本组成单元!

相信这是MDU16硬件16位乘除法器,芯片设计者的心愿和目标。


最近对STC32感兴趣,研究重写了其数学函数库,STC32的硬件MDU32和FPMU很有特色,及其接地气,

直接把参数传递放在R0-R3,R4-R7,和Keil编译器参数传递溶为一体!

顺手把STC8H的数学函数库,也重写了一下(官方的数学库,也太可怜了,只有最简单的三个基本操作函数)。

发现STC8H将数据功能寄存器,映像在xRAM中,是最大的败笔,对模拟长整型及浮点数运算,需多次调用MDU16,

看着又臭又长的,片外片内来回折腾,反复重复着的传送代码,一个脑袋的头痛!!!

除了代码长度增加N多,执行时间和效率降低许多,而且程序的可读性及其差!

最后没办法,写了一些宏定义,把数行传送代码,转为一句宏代码,才使改写的程序,有了清晰的可读性,

看着顺眼多了。

因此,建议芯片设计者,在今后的设计中,优先考虑一下,STC8H将MDU16数据功能寄存器,是否可将其映像,

放在片内RAM或片内SFR中。

谢谢!




LAOXU 发表于 2022-12-17 05:38:16

STC8H系列单片机C51定点库、浮点库自动调用专用运算库函数,合适有效地插入了STC8H系列的特色----准16位乘除法指令。并且针对

STC8H系列集成了16位硬件乘除法器,作了特别优化。

增加了对所有关联到的无符号、有符号int型,无符号、有符号long型 和 float型变量的乘除运算,均作了运算速度大幅度提升,为方便使用,

以外挂库形式加入,实行对C51内库自动替换,无缝嵌入,其中最具有特色的是float型的除法运算,用STC8H系列的准16位乘除法指令,

代替原Keil C51的加减法模拟除法程序,大幅度地提升了原float型的除法的运算速度,解决了原51浮点除法特慢的通病。

内部函数库列表:


extern         int16   uishr(int16 value1, uint8value2);                      // 16位无符号数右移N位
extern         int32   slshr(int32 value1, uint8value2);                       // 32位有符号数右移N位
extern         int32   ulshr(int32 value1, uint8value2);                      // 32位无符号数右移N位
extern         int16    ishl(int16 value1, uint8value2);                      // 16位数左移N位
extern         int32    lshl(int32 value1, uint8value2);                      // 32位数左移N位

extern        uint16   imul(uint16 value1,uint16 value2);                 // 16位*16位-->16位(无符号二进制乘法)   
extern        uint16uidiv(uint32 value1,uint16 value2);              // 16位/16位-->16位(无符号二进制除法)   
extern        uint32   lmul(uint32 value1,uint32 value2);                 // 32位*32位-->32位(无符号二进制乘法)   
extern        uint32uldiv(uint32 value1,uint32 value2);              // 32位/32位-->32位(无符号二进制除法)   
extern        float   fpadd(float value1, float value2);                  // 二进制浮点数加法
extern        float   fpsub(float value1, float value2);                  // 二进制浮点数减法
extern        float   fpmul(float value1, float value2);                  // 二进制浮点数快速乘法
extern        float   fpdiv(float value1, float value2);                  // 二进制浮点数快速除法

extern        float   fcastl(int32 value1);                        // 32位有符号数-->二进制浮点数
......


目前在做程序最后优化及库功能测试,等测试通过了即上传公开,包括函数库及库程序所有原型!


静请关注!

谢谢!

神农鼎 发表于 2022-12-17 10:03:58

必须感谢,一起提高,STC 的 同仁们,家里有啥好东西,各种核心板,实验箱,都给楼上老兄弟配上,
有布洛芬的也送一盒,一箭双雕之USB转双串口也送上2个

清风予我 发表于 2022-12-17 10:05:55

感谢分享,加我QQ:2269694595,送您一箭双雕之USB转双串口,6M bps

梁工 发表于 2022-12-17 11:06:18

STC8H由于是51架构,限制了寄存器数量,更多的寄存器只能放在xdata中。STC32G的架构则容量大得多。

LAOXU 发表于 2022-12-17 11:25:20

那也要分轻重呀~~~

像这种提高运算速度及代码质量的重量级功能,由于数据传送量大,实时性强,应优先放入片内寄存器中,完全可将某些数据传送量小的功能移至XDATA空间,让出几个SFR 。

LAOXU 发表于 2022-12-17 11:44:08

一个程序的好坏,除了执行速度还有代码长短。

做复杂一点的功能程序(如浮点乘除运算),汇编程序长度比原来增加近一倍!

而且还是汇编源代码做了充分优化的情况下,多余反复的片外片内来回折腾传送代码,

严重影响着执行运算速度,数据量不集中且实时性极高,DMA不能用,DPTR自动指针效果不明显,

已实在想不出有什么办法能来弥补这一缺陷。

希望STC8在今后的版本中,能重点考虑一下这一问题。

神农鼎 发表于 2022-12-17 12:15:17







帮多提建议,继续提高,共同进步

神农鼎 发表于 2022-12-17 12:16:35

公司后续是 32位8051 为主,1T 8051为辅,
STC32G12K128, STC8H8K64U是代表作

神农鼎 发表于 2022-12-17 12:22:45

RMB2.7/2.6/2.5的 STC32G8K64-42MHz-LQFP48/LQFP32/TSSOP20
下周送样,同步大量接受订货

RMB2的 STC32F12K64-72MHz-LQFP48/LQFP32/TSSOP20 , 流片中
===有硬件单精度浮点运算器
页: [1] 2
查看完整版本: 对STC8H硬件MDU16所用寄存器的建议