本帖最后由 杨为民 于 2024-12-3 17:24 编辑
引 言
上乘的兵器都具备两个特点,一是要强大,二是要称手。8051单片机作为小型控制领域的开山斧,强大的问题随STC单片机最新推出的Ai8051U型号已经解决了,其8BIT的8051工作模式,不仅运算速度比早期的STC单片机提高了几十倍,而且众多的片上设备还有了DMA的支持。 笔者认为最具有划时代意义的是Ai8051U的内核集成了硬件32位运算加速单元MDU32和TFPU,这两个加速单元在32位寄存器对“EAX-EBX” (及8051寄存器“R4R5R6R7-R0R1R2R3”)上实现了整数的32位乘除法和32位浮点数的加减乘除等运算以及三角函数等运算,成百倍地提高了这些运算的速度。 由于直接在Keil的C51中使用这些硬件加速单元有难度,要充分发挥这些硬件的性能必须使用汇编语言。但是8051指令集是8位指令集,除DPTR寄存器是16位的,其余寄存器都是8位操作数的,指令的操作也只是8位运算的,这对于直接用A51汇编语言编写32位数据的处理程序十分复杂。因此对于STC8051单片机在解决了强大的问题后,还需要解决称手的问题。 为了提高STC8051单片机的32位数据处理汇编语言编程的实效,并将其与基于80251指令集的STC32位单片机在汇编语言的水平上统一起来,在参考80251指令集的基础上,笔者抽象出了“WD80151单片机”和对应的“金水明80151指令集”,将8051现有的2个32位通用寄存器(8个8位寄存器R0~R7)扩充到4个独立的32位通用寄存器(16个8位寄存器RB0~BR15),并将其中的2对32位寄存器组成2个64位的通用寄存器“QAX”和“QCX”。 “金水明80151指令集”的核心是围绕32位的整数与浮点数运算设计的,特别是围绕STC单片机的各种MDU32和TFPU设计的。引入“金水明80151指令集”后,采用单个指令就可以实现对这些64/32/16/8位的寄存器进行操作,实现各种64/32/16/8位的运算了,也为STC下一款新技术单片机AI8052U的程序设计搭建了一座桥梁。 一、WD80151单片机结构(1)WD80151单片机(读作“我的80151单片机”)是笔者根据多年的经验提出的一种“虚拟单片机”,WD80151单片机由最基础的8051单片机加“DPU32”数字处理单元构成。 (2)从本质上说WD80151单片机是一种“寄生单片机”,它可以寄生在所有具有8051CPU内核的单片机中。 STC所有的基于8051CPU内核的单片机,从STC89C到STC8H系列单片机都可以作为WD80151单片机的“寄主单片机”。目前最有代表性的是AI8051U单片机的8BIT模式。 (3)由于Intel80251架构也包含了一个完整的8051子集,因此WD80151单片机也可以寄生在所有具有80251CPU内核的单片机中。 STC基于80251CPU内核的单片机,包括STC16F、STC32G和STC32F系列单片机都可以作为WD80151单片机的“寄主单片机”。目前最有代表性的是AI8051U单片机的32BIT模式。 (4)WD80151单片机的最小硬件结构。STC89C51RC/RD系列单片机是非常典型的Intel的8051单片机,其内部结构图如下:
上图再加一个DPU32(32位数字处理单元)就可以看做是WD80151单片机的最小硬件结构。 (5)WD80151单片机的片上设备。从上图可以看到除了8051内核部分外,WD80151单片机的片上设备至少具有最初MCS-51单片机的4个8位的端口P0~P3,3个定时器和一个串口。作为寄生单片机,WD80151单片机的这些端口、定时器和串口的数量随寄主单片机而定。 目前STC单片机的8位端口已达到8个,定时器达6个,串口达4个,即将推出的AI新系列单片机还会更多。下图是Ai8051U-8Bit模式的内部结构图: 其中“8-Bit CPU”仍然是Intel 8051的架构。 (6)WD80151单片机的的存储空间。WD80151单片机的基本内存空间与8051寄主单片机的相同,Flash程序存储器的CODE空间地址范围为64KB,可扩展的XRAM数据存储器的XDATA空间地址范围也为64KB,具体的大小取决于寄主单片机的型号以及外接RAM的大小。
(7)WD80151单片机的内部RAM空间结构是固定的,见下图: 其中:工作组0~3是4个寄存器组,由PSW中RS1和RS0两位决定8051指令集中的8个8位通用寄存器R0~R7具体读取的是哪一个工作组。 通常的C语音编译器如Keil的C51/C251都只使用工作组0,其余的3个留个用户使用。 二、WD80151单片机DPU32的寄存器结构(8)WD80151单片机的DPU32(32位数字处理单元)是“虚拟的DPU”,寄生在内部RAM的00H到0FH的空间内,DPU32由4个独立的32位寄存器组成。 (9)DPU32的32/64位寄存器。DPU32的4个32位寄存器中由“EAX-EBX”组成的32位通用寄存器对主要承担32位的各种运算功能,组合成一个64位的源寄存器“QAX”。
另外2个32位寄存器“ECX-EDX”组成的寄存器对组合成一个64位的目的寄存器“QCX”,主要承担累加求和等实现AI数学中最常见的“点积”运算功能。下图是金水明80151指令集的 8/16/32/64位扩展寄存器的地址映射表: 其中上面各种寄存器的数据存储采用大端模式,其内存保存模式与80251指令集以及Keil的C51/C251一致. 采用大端模式最主要的优点是方便对串行通讯协议的处理。 (10)DPU32的8/16位寄存器。在单片机应用中,对于像ADC这样的16位的数据处理是十分常见的,而对于各种工业控制、工业总线和工业通讯协议,8位数据的处理更是最常见的应用。因此在金水明80151指令集中像80x86架构一样将其中每个32位寄存器都拆分为两个16位的寄存器,每个16位的寄存器也被拆分为两个8位寄存器。 这样32位的数据处理在32位的寄存器之间进行,16位的数据处理在16位的寄存器之间进行,8位的数据处理在8位的寄存器之间进行,用户编写汇编语言程序就简单了。 (11)当然这些16位和8位的寄存器不是独立的,依附所属的32位寄存器,其中的一个发生变化,对应的32位寄存器也就发生变化,反之亦然。 三、金水明80151指令集的运算简介(12)WD80151单片机使用Intel8051指令集作为基本运行指令集,使用“金水明80151指令集”作为DPU32的扩展指令集。基本指令集保证WD80151单片机像其他8051单片机一样的正常运行,而扩展指令集提供WD80151单片机可以以指令的方式来实现32位整数和浮点数甚至三角函数的处理,方便用户编写像统计运算和信号滤波这样的数据处理程序。 (13)金水明80151指令集的运算以EAX-EBX这个32位寄存器对为基本运算寄存器,以ECX-ECX这个32位寄存器对为辅助运算寄存器,对于其只规划了简单的寄存器操作。 这起因于STC最新的AI8051U单片机已经通过MDU32和TFPU单元将32位的整数乘除法和32位浮点数四则运算和三角函数计算用硬件实现了,大大提高了32位数据的处理速度。而这些硬件单元使用的正是组成EAX-EBX寄存器对的R0~R7这8个8位寄存器。 对于以EAX-EBX这个32位寄存器对为核心的各种运算和操作,笔者将在后面专门介绍。 (14)在金水明80151指令集中,对于64/32/16/8位的辅助运算寄存器都支持下面4种操作: 1)寄存器初值操作(64位寄存器不支持),例如: MVR EDX, # 立即数; // EDX=立即数 MVR CX,# 立即数; //CX=立即数 MVR BR10,# 立即数; //BR10=立即数 其中立即数支持3种表达方式:-1234(十进制整数),0x12345678或者012345678H(十六进制整数)和-123.456E3(浮点数)。 2)寄存器赋值操作,例如: MVR QAX, QCX; // QAX=QCX MVR ECX,EDX; // ECX=EDX MVR CX,DX; // CX=DX MVR BR13,BR14; // BR13=BR14 3)整数加法操作,例如: ADDS QCX,QAX; // QCX= QCX+QAX ADDS EDX,ECX; // EDX= EDX+ECX ADDS CX2,DX; // CX2= CX2+DX ADDS BR14,BR13; // BR14= BR14+BR13 4)整数减法操作,例如: SUBS QCX,QAX; // QCX= QCX-QAX SUBS EDX,ECX; // EDX= EDX-ECX SUBS CX2,DX; // CX2= CX2-DX SUBS BR12,BR13; // BR12= BR12-BR13 (15)在金水明80151指令集中,寄存器累加运算是在两个特定的不同等级的寄存器之间实行扩展加法,避免同等级寄存器相加出现的结果数据溢出问题,这个运算适用于多个数据求平均值等统计运算场合。 1)32位的寄存器累加操作:64位+32位=64位: ADDA QCX, EAX; // QCX= QCX + EAX 2)16位的寄存器累加操作:32位+16位=32位: ADDA ECX,AX; // ECX= ECX + AX ADDA EDX,BX; // EDX= EDX + BX 3)8位的寄存器累加操作:16位+8位=16位: ADDA CX,BR7; // CX= CX + BR7 ADDA DX,BR3; // DX= DX + BR3 四、金水151编译器(16)为了在使用8051/80251指令集的寄主单片机上实现金水明80151指令集,笔者研制了“金水151编译器”,用软件的方法对于金水明80151指令集的每条指令,用8051或者80251指令来实现。这样通过使用金水151编译器,就可以将WD8051单片机寄生在各种STC单片机上了。 (17)毕竟用8位8051指令实现32位的整数和浮点数运算是要占用很多CPU时间的,为此STC在其新一代的AI8051U等单片机上增加了32位的整数和浮点数运算的硬件加速单元MDU32和TFPU。在使用金水151编译器时,只要指定单片机的类型和模式为“STC8U_8BIT”和“STC8U_32BIT”,金水151编译器就会自动使用这些硬件加速单元来实现金水明80151指令集,大大提高32位指令的运算速度。 (18)金水151编译器的DATA空间分配。WD80151单片机将寄主单片机地址范围为00H~7FH的DATA空间分为4段: 00H~1FH的DATA空间为金水明80151指令集寄存器空间,20H~2FH的DATA空间为BIT变量空间,30H~3FH的DATA空间为金水151编译器系统空间,40H~7FH的DATA空间为用户DATA变量的存储空间(64字节)。 金水151编译器将寄主单片机80H~FFH范围的IDATA空间分配为系统堆栈空间(128字节)。 (19)金水151编译器同时支持C351语言和A351汇编语言,在将C语言编译为汇编语言的时候,编译器只使用了EAX-EBX一个32位寄存器对(8051的8个8位寄存器R0~R7)。 (20)由于划给寄主的系统堆栈只有128字节,因此金水151编译器的C语言中断现场保护只保存了EAX和EBX这两个32位寄存器,没有保护金水明80151指令集中的其他2个32位寄存器“ECX”和“EDX”。 由于这些中断没有保存的“ECX”和“EDX”寄存器只是用户自己在使用,因此用户应该按照自己用了多少这些寄存器,就在中断服务程序ISR中添加多少寄存器进行保存和恢复。
(21)从语法意义上说,这些中断没有保存的寄存器只是用户程序中自己定义的公共/全局变量,因此如果在由多个任务调用的需要重入的函数中使用了这些寄存器,用户需要在函数的开始时保存本函数要使用的这些寄存器,在程序退出函数前恢复这些寄存器的内容。
|