对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中。
谢谢!
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位有符号数-->二进制浮点数
......
目前在做程序最后优化及库功能测试,等测试通过了即上传公开,包括函数库及库程序所有原型!
静请关注!
谢谢!
必须感谢,一起提高,STC 的 同仁们,家里有啥好东西,各种核心板,实验箱,都给楼上老兄弟配上,
有布洛芬的也送一盒,一箭双雕之USB转双串口也送上2个 感谢分享,加我QQ:2269694595,送您一箭双雕之USB转双串口,6M bps STC8H由于是51架构,限制了寄存器数量,更多的寄存器只能放在xdata中。STC32G的架构则容量大得多。 那也要分轻重呀~~~
像这种提高运算速度及代码质量的重量级功能,由于数据传送量大,实时性强,应优先放入片内寄存器中,完全可将某些数据传送量小的功能移至XDATA空间,让出几个SFR 。 一个程序的好坏,除了执行速度还有代码长短。
做复杂一点的功能程序(如浮点乘除运算),汇编程序长度比原来增加近一倍!
而且还是汇编源代码做了充分优化的情况下,多余反复的片外片内来回折腾传送代码,
严重影响着执行运算速度,数据量不集中且实时性极高,DMA不能用,DPTR自动指针效果不明显,
已实在想不出有什么办法能来弥补这一缺陷。
希望STC8在今后的版本中,能重点考虑一下这一问题。
帮多提建议,继续提高,共同进步
公司后续是 32位8051 为主,1T 8051为辅,
STC32G12K128, STC8H8K64U是代表作 RMB2.7/2.6/2.5的 STC32G8K64-42MHz-LQFP48/LQFP32/TSSOP20
下周送样,同步大量接受订货
RMB2的 STC32F12K64-72MHz-LQFP48/LQFP32/TSSOP20 , 流片中
===有硬件单精度浮点运算器
页:
[1]
2