- 打卡等级:以坛为家I
- 打卡总天数:312
- 最近打卡:2025-03-11 13:20:13
荣誉版主
- 积分
- 5395
|
发表于 2023-12-9 20:08:50
|
显示全部楼层
关于 MDU 的建议
MDU32 太占寄存器了, 51的 所有寄存器 R0-R7 被他全占了, 除了 long型 乘除运算, 对单精度的浮点运算提速, 帮助有限 (51内核 不是 251核, 可用寄存器太少了) ,
而基本运算库, 必须是可重入的函数, 浮点乘除运算远比定点 long型 乘除运算 复杂多了, 占用临时变量也多(因为是可重入的, 必须放在基本寄存器内), 如果寄存器
R0-R7 被 MDU32 全占用了, 那这个程序没法编写(硬编写出来的也是个鸡肋, 占用程序空间大,执行时间长,运行效率低).
注: 浮点乘除法, 用到 小数乘除法, 和普通的定点整数乘除法不同(定点的有效位数取后面, 小数的有效位数取前面).
因此, 我认为:
MDU16的 一些功能不能丢, 最省力的方法, 把 MDU16的相关数据寄存器, 从 XFR 中 移入到 SFR中 即可.
如想用 MDU32方式(通过 DMA 传输), 则应加入原 MDU16的 一些功能, 优先级别如下:
A类 (优先采用)
1. 16位x16位 无符号乘法 , R6R7 x R2R3(或者 R4R5) --> R4R5R6R7
注: 如能做到 32位x16位, 那更好, R4R5R6R7 x R2R3 --> R2R3R4R5R6R7
2. 32位/16位 无符号除法 , R4R5R6R7 / R2R3 --> R4R5R6R7,余数 R2R3
注: 如有困难,做到 16位/16位, 也可, R6R7 / R2R3(或者 R4R5) --> R6R7, 余数 R2R3(或者 R4R5)
3. 32位 数据规格化 , R5R6R7R4 --> R5R6R7R4,移位数 --> R0
4. 32位 逻辑右移 , 移位数放在 R0, R5R6R7R4 --> R5R6R7R4
注: 3,4项, R4放未位, 有助于 4舍 5入 , 优化浮点数运算速度, 如有困难,按依次存放做 R4R5R6R7 也可.
以上这些内容, 优先考虑 单精度的浮点运算提速, 兼顾 long型 和 int型 乘除运算.
B类 (厂方考虑)
1. 32位x32位 无符号乘法 , R4R5R6R7 x R0R1R2R3 --> R4R5R6R7
2. 32位/32位 无符号除法 , R4R5R6R7 / R0R1R2R3 --> R4R5R6R7,余数 R0R1R2R3
3. 32位 逻辑左移 , 移位数放在 R0, R5R6R7R4 --> R5R6R7R4
4. 32位 算术右移 , 移位数放在 R0, R5R6R7R4 --> R5R6R7R4
注: 关于有符号除法, 依厂方心愿, 是否加入
C类 (增强功能, 厂方考虑)
1. 16位 XRAM 间接寻址, 读取, @R2R1 --> A (以R2R1为地址, 读取 XRAM 内容送 ACC)
2. 16位 XRAM 间接寻址, 写入, A --> @R2R1 (以R2R1为地址, 将 ACC内容 写入 XRAM)
注: 以上内容相当于 增加一条 高速 @DPTR 读写 XRAM 指令, 如实现方使, 建议再多增加 1~2条(如增加 1条, 读优先)
1. 16位 XRAM 间接寻址, 读取, @R4R0 --> B (以R4R0为地址, 读取 XRAM 内容送 B)
2. 16位 XRAM 间接寻址, 写入, B --> @R4R0 (以R4R0为地址, 将 B内容 写入 XRAM)
注: ACC寄存器, 负担太重, 能存入 B寄存器最好, 如有困难,存入 ACC 也可
D类 (关于 DPTR )
最起码改成 和 STC32 一样( DPTR 地址 公用, C语言可用), 否则又是一个鸡肋.
当然, 能改成 C51/IAR 支持的 格式, 那最好了.
E类 (关于 16位 堆栈指针 )
51类的 天花板, 堆栈指针 增加到 16位, 堆栈放在 XRAM 中, 强力支持 OS , STC 是否考虑, 何时加入 ?
|
|