找回密码
 立即注册
查看: 5576|回复: 45

32位加减乘除,STC8位机上的MDU32C 实测!库函数,STC8H2K32U-45MHz

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-5-15 04:52:57 | 显示全部楼层 |阅读模式
STC8新增32位MDU32C 硬件运算单元

STC 寄来的
STC8H2K32U-45MHz-LQFP32 芯片收到,谢谢!
找了一块板,焊上 STC8H2K32U , 引出串囗, 上机仿真,
经简单实测,STC8新增32位加减乘除,MDU32C模块 功能基本正常,很好。

重要说明:

STC8H2K32U 系列 A 版芯片,开始量产中,
MDU32C 模块的逻辑左移运算有问题,暂时不要使用。
后续版本会修改正确   

逻辑左移:
有点好玩,左移偶次正确,左移奇次不正确(最高 10Bit 清0),
我打了一个补丁,能用了,速度比 Keil C51自带的软件算法要快 N倍。

深圳国芯人工智能有限公司-产品_STC8H系列 (stcai.com)
STC8H2K32U-45MHz-LQFP32, TSSOP28, TSSOP20
截图202405150737292275.jpg
截图202405150755587850.jpg

截图202405150756331702.jpg

截图202405150757115113.jpg

截图202405150758091441.jpg

回复

使用道具 举报 送花

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

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-5-15 08:36:42 | 显示全部楼层
关于 MDU32C 逻辑左移,有点小问题,打个补丁,照样能用,速度比 Keil C51自带的软件算法要快 N倍。
MDU32C 不改也没问题。
如修改,下列建议,供参考。
1、32位乘法,乘积能否升级到 64位?
   如不能,建议 增加一个 32位小数乘法,或者 16位x16位 = 32位乘法。
   2选1 的话,优先选 16位 乘法。
2、MDU32SR 寄存器能否取消? 其数据改放到 ACC寄存器中, 可省去每次操作的中断保护。
3、如果以上第 2条不改, 并且运算进位溢出标志不并入 PSW中, 建设去掉 32位加/减法的 带进位/借位操作, 否则请保留。
4、增加 32位 循环右移 指令。
5、增加 32位 比较指令。
6、增加 32位 加1/减1 指令。
7、增加 32位 交换指令(R0R1R2R3<-->R4R5R6R7)。
8、增加 32位 取补指令。
9、增加 32位 取反指令。
10、增加 32位 清0 指令。
综上所说:
C51 上使用优选考虑:
1、增加一个 16位x16位 = 32位乘法,或者 32位小数乘法
2、取消 MDU32SR 寄存器, 其数据改放到 ACC寄存器中(省去中断保护)。
3、增加 32位 循环右移 指令。
4、增加 32位 比较指令。
5、增加 32位 加1/减1 指令。
6、增加 32位 交换指令(R0R1R2R3<-->R4R5R6R7)。
7、增加 32位 取补指令。
8、增加 32位 取反指令
9、增加 32位 清0 指令。
C251 上使用优选考虑:
1、增加一个 32位x32位 = 64位乘法(双数度浮点数乘除法要用)。
2、取消 MDU32SR 寄存器, 其数据改放到 ACC寄存器中(省去中断保护)。
至于 运算进位溢出标志是否并入 PSW, 在这里并不重要, 因为放在 ACC中, 和放在 PSW中, 实际使用差别并不是很大(仅指令长度增大 1字节)。



回复 支持 反对

使用道具 举报 送花

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

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-5-15 16:59:50 | 显示全部楼层
最新 STC8_MDU32C_V1.lib 来了~~~~~

STC8H_MDU32C_V1 LIB 库使用说明:
STC8H系列单片机 C51定点库 自动调用专用运算库函数,

插入使用了 STC8H系列的特色----MDU32C硬件乘除移位指令。
并且针对 STC8H系列集成了 32位x32位硬件乘法器32位/32位硬件除法器32位硬件移位单元作了特别优化。
增加了对所有关联到的无符号、有符号int型,无符号、有符号long型float型变量的算术运算,移位操作,
均作了运算速度大幅度提升,为方便使用,以外挂库形式加入,实行对C51内库自动替换,无缝嵌入,

其中最具有特色的是
单精度浮点数加/减/乘/除四则运算,用 STC8H系列的 MDU32C硬件 乘除移位指令,
代替原Keil C51的加减法模拟除法程序,
大幅度地提升了原 51单精度浮点数加/减/乘/除 四则运算特慢的通病。


单独 LIB 文件:
STC8_MDU32C.LIB (12.44 KB, 下载次数: 286)

LIB源代码:
STC8_MDU32C_LIB_V1.rar (74.33 KB, 下载次数: 307)

1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复 支持 反对

使用道具 举报 送花

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

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-5-30 06:00:47 | 显示全部楼层
本帖最后由 LAOXU 于 2024-11-29 08:17 编辑

2024/5/30
更新版 STC8_MDU32C_V2.lib 来了~~~~~
STC8H_MDU32C_V2 LIB 库使用说明:
        STC8H系列单片机 C51定点库 自动调用专用运算库函数,插入使用了 STC8H2K32U系列的特色

    ----MDU32C硬件乘除移位指令。
    并且针对 STC8H系列集成了32位x32位硬件乘法器32位/32位硬件除法器32位硬件移位单元作了特别优化。
        增加了对所有关联到的无符号、有符号int型,无符号、有符号long型float型变量的算术运算,移位操作,
    均作了运算速度大幅度提升,为方便使用,以外挂库形式加入,实行对C51内库自动替换,无缝嵌入。
    其中最具有特色的是使用了 STC8H系列的 MDU32C硬件 乘除移位指令,代替原Keil C51的浮点加减乘除法程序,

    大幅度地提升了浮点数运算速度,解决了原51 浮点数运算特慢的通病。
   
    STC8H_MDU32C_V2版 和 STC8H_MDU32C_V1版 区别:
    1. 全面改写单精度浮点数内部数据存储格式, 使之完全无缝匹配 STC MDU32C标准,

        为核心内核 移植到 SDCC, IAR 开绿灯。
    2. 全面优化内部变量, 进一步减少指令提升运算速度。

特别提醒:  仿真时一定要连接硬件实时仿真, 否则死机!!!
单独 LIB 文件:
STC8_MDU32C_V2.LIB (12.45 KB, 下载次数: 299)

LIB源代码:
STC8_MDU32C_LIB_V2.rar (77.06 KB, 下载次数: 319)





点评

帮看下 MDU32D MDU32D 技术细节, 32位加减乘除 STC8 位机上的32位数学协处理器, STC8 新设计即将全面采用 MDU32D 【新提醒】MDU32D技术细节, 32位加减乘除,STC8位机上的新利器,STC8 新设计即将升级 - 软件库函数  详情 回复 发表于 2024-5-30 12:48
1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复 支持 反对

使用道具 举报 送花

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

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-5-31 08:42:10 | 显示全部楼层
本帖最后由 LAOXU 于 2024-6-1 07:45 编辑

2024/6/1:
对 MDU32/DPU32 类运算模块之构架, 从发展的眼光, 提点建议。

首先,51和 251相比,可用资源缺乏,专用寄存器非常紧张,整个可重入函数(程序),只有 R0-R7、ACC、B、PSW、DPTR 可使用。

因此,MDU32/DPU32 类运算模块之构架, 从实用的角度来看,这两者的侧重点不同。
在 51上应用,侧重点:
1、尽可能的帮助减轻对专用寄存器的占用。
2、加快各种运算速度的辅助类简单指令。
3、不同编译器(Keil,SDCC,IAR)之间的数据格式转换。

在 251上应用,侧重点:
1、扩展(级连)类指令,能轻松将 32位指令,扩展到 64位或更多位。

=======================================================================
具体实施方案:

一、结构(构架)类:
1、MDU32内增加 2级 32位堆栈寄存器(通用方案,今后 DPU32 上也能用上)。
2、增加 R0_R3,R4_R7 压栈、出栈 指令(对 MDU32 模块内堆栈操作)。

或 临时方案(51 MDU32专用):
1、MDU32内增加一个 32位寄存器 DD。
2、增加 R0_R3,R4_R7 到 寄存器 DD 的读、写 指令。

用途:可快速对 R0_R3,R4_R7 寄存器保存和恢复。

=======================================================================
二、指令类:
1、交换指令 SWAP    R4_R7,R0_R3             用途:快速交换 R0_R3,R4_R7 寄存器值。
2、比较指令 CMP    R4_R7,R0_R3               用途:快速比较 R0_R3,R4_R7 寄存器值。
3、循环指令 RR     R4_R7(右移 或 左移均可)  用途:浮点数格式转换,循环指令扩展级联。
4、加1 指令 INC    R4_R7                    用途:浮点数四舍五入。
5、减1 指令 INC    R4_R7
6、取补指令 NEG    R4_R7                  用途:求负数。  
7、取反指令 CPL    R4_R7
8、清0 指令 CLR    R4_R7                  用途:快速清除 R4_R7寄存器。  
            CLR    R0_R3                  用途:快速清除 R0_R3寄存器。  
9、移位指令 最后一位移出 放 Cy(最好),如做不到放 MDU32SR 寄存器内也可。
10、加/减/比较类指令 结果为 0,置位 MDU32SR 寄存器内 Z标志(新增)。
建议增加 四字节 和 单字节 非标运算指令
11、加法指令 ADD   R4_R7,A               用途:非标格式浮点数 四舍五入。
12、减法指令 SUB   R4_R7,A  

13、乘法指令 MUL   R4_R7,A               用途:数制转换,BCD-->HEX。

14、除法指令 DIV   R4_R7,A               用途:数制转换,HEX-->BCD


以上均是 32位指令。

=======================================================================
三、其他类:
作为 51,我认为最理想的升级模式,是使用 251(BINARY模式)指令集,这样,在 51下能使用 所有 251硬件资源,包括移值 251库函数,
让 MDU32/DPU32 类运算模块 做到 51/251下真正通用。

注:记得我曾经说错,51运行 251(SOURCE模式)指令集,现更正,以本次为准。
51模式下,只能使用(运行) 251(BINARY模式)指令集。

我学的太杂,样样都了解一点,优点,每样都能短时间内拿起,综合能力强。
缺点,慢热,进入状态时间太长,一般要 10天半个月,才能真正进入有效思考。
比如讨论这 MDU32/DPU32 类运算模块之构架指令,没有前导预热,进入不了顶峰状态。
这和整天在这行混的吃这口饭的不同(他们很短时间能进入有效思考)。

上次争论 MDU32/DPU32 类运算模块,运行时是否应该关系统时钟,我后来总结了一下,
结论:我是把 MDU32/DPU32指令,当成 真正 51指令使用,充分考虑如何搭配,才能更有效执行速度更快。
而其他人,仅仅把 MDU32/DPU32指令,当成一个功能指令使用,只考虑完成单一的功能,而并没有考虑更深层次的扩展(级连)等情况下使用。


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15609
发表于 2024-5-15 07:42:39 | 显示全部楼层
截图202405150739274258.jpg

截图202405150739559950.jpg

截图202405150740374404.jpg

截图202405150741057720.jpg

截图202405150742049555.jpg

截图202405150742345269.jpg


截图202405150743255381.jpg

截图202405150743567458.jpg


截图202405150744451188.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15609
发表于 2024-5-15 07:46:45 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15609
发表于 2024-5-15 07:48:25 | 显示全部楼层
截图202405150748214033.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15609
发表于 2024-5-15 07:49:07 | 显示全部楼层

串口接收超时中断;
串口硬件奇偶校验;

截图202405150749045718.jpg

截图202405150750004912.jpg
截图202405150750431956.jpg
截图202405150751302890.jpg
截图202405150752218719.jpg


回复 支持 反对

使用道具 举报 送花

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

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-5-15 08:46:28 | 显示全部楼层
对 C51来说, 如果增加上述指令, 能大幅度提升 浮点运算库的 运算速度。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-5-15 09:40:06 | 显示全部楼层
是不是直接赋值给MDU32C寄存器,就可以直接从MDU32C寄存器中读取结果?

点评

不用, 只要在项目中加入 STC8_MDU32C_LIB_V1.LIB 库, 其他什么都不用管, 该干哈就干啥, 全自动傻瓜式提速。  详情 回复 发表于 2024-5-15 16:53
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-5-15 09:51:53 | 显示全部楼层
LAOXU 弄这个还是手拿把掐啊
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-05-01 06:58:22

5

主题

184

回帖

1331

积分

金牌会员

积分
1331
发表于 2024-5-15 10:34:21 | 显示全部楼层
本帖最后由 jmg 于 2024-5-15 10:37 编辑
LAO*** published on 2024-5-15 08:36
Regarding the left shift of MDU32C logic, there is a small problem. With a patch, it can still be used. The speed is N times faster than the software algorithm that comes with Keil C51.

> "6. Add 32-bit exchange instructions (R0R1R2R3<-->R4R5R6R7). "


Yes, the present MDU32C opcodes seem backwards.

I tried a simple DDS using this, where you add a increment to a 32b value, to give an table index pointer. That shows a problem :


R4..R7 = R4..R7 + R0..R3 is not much use.

Better would have been swapped operands, so

R0..R3 = R4..R7 + R0..R3 is better.  

With this swap, you can set R4..R7 as fixed adder, and
  1.    Add32b
  2.    MOX A,@R0
  3.    MOV DAC_SFR,A
复制代码

for upper 8 bits index, already in R0, into XDATA page, or

  1.   Add32b
  2.   MOX A,@R0
  3.   MOV XDATA_Page,A
  4.   MOX A,@R1
  5.   MOV DAC_SFR,A
复制代码


for using all XRAM as table, upper 13b index is R0,R1 for a 29b adder

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 19:22 , Processed in 0.138527 second(s), 128 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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