金水明“80151”和“80351”32位单片机指令集简介
STCx51虚拟单片机与编译器(1):金水明“80151”和“80351”32位单片机指令集简介
一、研制“80x51”指令集的必要性
(1)“虚拟计算机”是一种先进的计算机软件技术。“虚拟计算机”在硬件领域是用软件模拟的方法来从理论上预先研究和探讨新的计算机和CPU架构,在软件领域是用新的软件系统来整合现有的硬件系统,从应用层次来实际提高硬件系统的运行效率。
(2)“STCx51虚拟单片机”是指用STC现有的8位和32位的单片机作为“寄主单片机”,用一组抽象的“内核指令集”、“内核架构”和“片上设备”来构造一系列新的单片机模型。然后在硬件上从理论方面用来探讨研究“寄主单片机”目前存在的问题和未来发展方向。同时在软件方面也可以用来探讨研究“寄主单片机”的主流软件开发工具目前存在的问题和未来发展方向,利用新的单片机模型研发出供现有的单片机使用的新的软件工具,提高现有的单片机系统的运行效率和开发应用水平。
(3)“8051”指令集和“80251”指令集是Intel公司推出的8位单片机内核和准32位单片机的指令集:
“8051”指令集是完备的8位CPU指令集,其各种寄存器运算指令和内存存取指令都是8位。内核只使用“8051”指令集的单片机只是8位单片机。
“80251”指令集是不完备的32位CPU指令集,它没有32位的乘除法运算指令,没有完整的32位二进制运算指令和没有完整的32位内存存取指令,对应的只有16位的指令。因此“80251”也被称为“准32位指令集”或者“增强的16位指令集”,内核只使用“80251”指令集的单片机只是“准32位单片机”。
(4)基于“8051”和“80251”这两种指令集,STC公司推出了一系列的8位单片机(最新的包括STC8H系列单片机)和32位单片机(最新的包括STC32G/F系列单片机)。
目前的STC32位系列单片机已经增加了32位的整数乘除法和32位的浮点数运算单元,未来的STC8位系列单片机也将增加32位的整数乘除法和32位的浮点数运算单元,因此将来这两个系列的单片机都将具有32位的数据处理能力,大大超越了单纯“8051”和“80251”单片机的性能。
(5)对于STC8位的单片机系列,目前主流的开发软件是基于“8051指令集”的Keil公司的C51编译器(使用A51汇编语言)以及SDCC编译器(使用SDCC51汇编语言)。对于STC32位的单片机系列,目前主流的开发软件是基于“80251指令集”的Keil公司的C251编译器(使用A251汇编语言)。
对于即将来临的增加了新的数据处理单元的STC8位和32位系列单片机,C51和C251编译器中使用的基于“8051”和“80251”指令集的A51和A251汇编语言已经跟不上需要,必将成为STC单片机高效率软件开发的瓶颈。
比如对于即将推出的STC8051H系列单片机而言,如果要实现符合C51规范的32位的加法运算“R4R5R6R7 = R4R5R6R7 + R0R1R2R3”,如果用A51汇编语言来写:“MOV A,R7; ADD A,R3; MOV R7,A; MOV A,R6; ADDC A,R2; MOV R6,A; MOV A,R5; ADDC A,R1; MOV R5,A; MOV A,R4; ADDC A,R0; MOV R4,A; ”,仍然需要12条汇编指令语句来编写。
(6)为了解决基于“8051”和“80251”指令集的Keil的C51与C251编译器严重落后于STC32位新系列单片机发展的问题,笔者在“8051”和“80251”指令集的基础上提出了金水明“80151”和“80351”两个32位单片机的指令集模型,用来指导研制新的STC32位单片机开发软件工具和从理论上探讨基于80x51指令集的新的STC32位单片机内核架构。
其中“80351”指令集的某些32位指令采用了可扩展结构,与未来的金水明“80451”64位指令集兼容。
在“80151”和“80351”两个32位的指令集中,32位的操作均使用1条汇编语言指令完成。比如前面的符合C51/C251规范的32位加法运算“R4R5R6R7 = R4R5R6R7 + R0R1R2R3”,如果用A151或者A351汇编语言来写都是:“ ADD EAX,EBX; ”1条汇编指令语句。
二、“80151”与“80351”指令集简介
(7)“80151”与“80351”指令集是等级式的指令集。其中“80151”指令集是“8051”指令集(L0指令集)加“L1”32位运算存储扩展指令集组成的,“80351”指令集是“80251”指令集(L2指令集)加“L3”32位运算存储扩展指令集组成的。
(8)“80151”指令集包含“8051”指令集的全部寄存器,并将8个8位的通用寄存器(R0、R1...R7)组成4个16位的通用寄存器(AX、AX2、BX、BX2)和组成2个32位的通用寄存器(EAX和EBX)。为了满足高性能单片机RTOS的需要,“80151”指令集增加了2个16位的指针寄存器(BP和VP)。
“80151”指令集只使用8位的系统堆栈指针SP。中断和RTOS任务切换时只需使用128字节的系统堆栈(IDATA空间:080H~0FFH)。
“80151”指令集的存储空间与“8051”指令集的存储空间一致。
(9)“80351”指令集包含“80251”指令集的全部寄存器,并将8个32位的通用寄存器(DR0、DR4...DR28)组成4个32位的通用运算寄存器(EAX、EBX、ECX和EDX)以及4个32位的通用指针寄存器(EFP、EGP、EBP和EVP)。
“80351”指令集使用16位的系统堆栈指针SPX。中断和RTOS任务切换时只需使用384字节的系统堆栈(EDATA空间:080H~1FFH)。
“80351”指令集的存储空间与“80251”指令集的存储空间一致。
(10)“8051”指令集是“80251”指令集的一个完整子集。为了保持一致性,“80151”指令集也设计为“80351”指令集的一个完整子集。
三、“80151”与“80351”指令集的研究平台
(11)进行虚拟计算机的研究通常在硬件上需要一台“寄主计算机”,在软件上需要一个“虚拟机软件”。比如要想学习和研究Linux操作系统,可以使用1台PC机作为寄主计算机,然后在Windows操作系统上安装一个“虚拟机”软件。
(12)为了研究“80151”和“80351”指令集,在硬件研究平台上笔者选择了STC8H8K64U单片机和STC32F12K54单片机作为“寄主单片机”,前者是纯“8051”指令集的8位单片机,没有带32位的硬件处理单元,后者在“80251”指令集的基础上,增加了32位的乘除法运算单元和32位的浮点数运算单元。
(13)为了研究“80151”和“80351”指令集,笔者开发了“长缨151”C351语言编译器和“长缨351”C351语言编译器两个研究软件。
(14)由于C语言是高级计算机语言,其支持32位的变量和运算与具体计算机内核的指令集无关,因此“长缨151”和“长缨351”支持的C语言规范都是一样的,统一称为“C351”语言规范。
作为“80151”和“80351”指令集研究的软件工具,“C351”语言规范只是寄主单片机的主流编译器C51/C251语言规范的一个“子集”,子集的大小以满足使用“80151”和“80351”指令集建立一个STC实际单片机RTOS所需的语法为界。
(15)长缨151支持的“80151”指令集的汇编语言为A151汇编语言,长缨351支持的“80351”指令集的汇编语言为A351汇编语言。
同样A151汇编语言是A351汇编语言的一个完整子集。
四、结束语
本文简单地介绍了金水明“80151”和“80351”这两个32位指令集的来源、基本架构和软硬件研究平台。
后续的文章将逐步“80151”和“80351”这两个32位指令集的具体细节和笔者的研究成果。
MCU程序的编写方式,以及各型号单片机的区别和用途
MCU程序的编写方式,以及各型号单片机的区别和用途
单片机的程序编写
MCU的程序的编写与PC下的程序的编写存在很大的区别,虽然现在基于C的MCU开发工具越来越流行,但对于一个高效的程序代码和喜欢使用汇编的设计者来讲,汇编语言仍然是最简洁、最有效的编程语言。
对于MCU的程序编写,其基本的框架可以说是大体一致的,一般分为初始化部分(这是MCU程序设计与PC最大的不同),主程序循环体和中断处理程序三大部分,其分别说明如下:
初始化:对于所有的MCU程序的设计来讲,出世化是最基本也是最重要的一步,一般包括如下内容:
屏蔽所有中断并初始化堆栈指针:初始化部分一般不希望有任何中断发生。
清除系统的RAM区域和显示Memory:虽然有时可能没有完全的必要,但从可靠性及一致性的角度出发,特别是对于防止意外的错误,还是建议养成良好的编程习惯。
阅读累了可以先关注我,不迷路,打开头像关注查看个人主页以及简介,更多优秀内容,叫“林老师”分享给大家
IO口的初始化:根据项目的应用的要求,设定相关IO口的输入输出方式,对与输入口,需要设定其上拉或下拉电阻;对于输出口,则必须设定其出世的电平输出,以防出现不必要的错误。
中断的设置:对于所有项目需要用到的中断源,应该给予开启并设定中断的触发条件,而对于不使用的多余的中断,则必须给予关闭。
其他功能模块的初始化:对于所有需要用到的MCU的外围功能模块,必须按项目的应用的要求进行相应的设置,如UART的通讯,需要设定Baud Rate,数据长度,校验方式和Stop Bit的长度等,而对于Programmer Timer,则必须设置其时钟源,分频数及Reload Data等。
参数的出世化:完成了MCU的硬件和资源的出世化后,接下来就是对程序中使用到的一些变量和数据的初始化设置,这一部分的初始化需要根据具体的项目及程序的总体安排来设计。对于一些用EEPROM来保存项目预制数的应用来讲,建议在初始化时将相关的数据拷贝到MCU的RAM,以提高程序对数据的访问速度,同时降低系统的功耗(原则上,访问外部EEPROM都会增加电源的功耗)。
主程序循环体:大多数MCU是属于长时间不间断运行的,因此其主程序体基本上都是以循环的方式来设计,对于存在多种工作模式的应用来讲,则可能存在多个循环体,相互之间通过状态标志来进行转换。对于主程序体,一般情况下主要安排如下的模块:
计算程序:计算程序一般比较耗时,因此坚决反对放在任何中断中处理,特别是乘除法运算。
显示传输程序:主要针对存在外部LED、LCD Driver的应用。
中断处理程序:中断程序主要用于处理实时性要求较高的任务和事件,如,外部突发性信号的检测,按键的检测和处理,定时计数,LED显示扫描等。
一般情况下,中断程序应尽可能保证代码的简洁和短小,对于不需要实时去处理的功能,可以在中断中设置触发的标志,然后由主程序来执行具体的事务――这一点非常重要,特别是对于低功耗、低速的MCU来讲,必须保证所有中断的及时响应。
对于不同任务体的安排,不同的MCU其处理的方法也有所不同。
例如,对于低速、低功耗的MCU(Fosc=32768Hz)应用,考虑到此类项目均为手持式设备和采用普通的LCD显示,对按键的反应和显示的反应要求实时性较高,应此一般采用定时中断的方式来处理按键的动作和数据的显示;而对于高速的MCU,如Fosc》1MHz的应用,由于此时MCU有足够的时间来执行主程序循环体,因此可以只在相应的中断中设置各种触发标志,并将所有的任务放在主程序体中来执行。
在MCU的程序设计中,还需要特别注意的一点就是:要防止在中断和主程序体中同时访问或设置同一个变量或数据的情况。有效的预防方法是,将此类数据的处理安排在一个模块中,通过判断触发标志来决定是否执行该数据的相关操作;而在其他的程序体中(主要是中断),对需要进行该数据的处理的地方只设置触发的标志。――这可以保证数据的执行是可预知和唯一的。
在学校里学了这些知识,并没有时间思考这些之间概念之间的区别,一直注重渴望技术的提升,却忘了这些基础才是根本。蹭着在家的这一段时间,准备好好梳理一下之间的关系,这是一个宏大的框架,写下这些,也是因为在求职的时候对于这些涉及到了,加深一下自己的印象吧。不说了,直接入主题吧。
ARM
在嵌入式领域里,ARM本意是微处理器行业的一家知名企业,英国ARM公司是全球领先的半导体知识产权提供商。全球超过95%的智能手机采用ARM架构,ARM设计了大量的高性价比、耗能低的精简指令集计算(RISC)处理器。这里的ARM指的是处理器。处理器也是CPU的意思,所以ARM处理器就是CPU的意思。ARM公司不生产芯片、生产CPU.是一个32位精简指令集处理器架构,ARM处理器包含以下几个系列的处理器产品以及其它厂商实现的基于ARM体系结构的处理器。如ARM7 系列、ARM9系列、ARM9E系列、ARM10E系列等等。这些处理器广泛应用于实时嵌入式应用,如存储设备、汽车、工业和网络设备。
STM32
上面说了ARM处理器核当前ARM7、ARM9、ARM9E、ARM10E、SecurCore以及最新的ARM11系列。而STM32使用的其中的Cortex-M3内核。当时由于arm7能效低,arm9的硬件和编程过于复杂。为了满足消费电子的需求而改进arm7,代号为cortex -m,这样st或nxp等产家以这个新的核心来加自己的外设就得到了stm32或lpc系列的单片机了。可以清楚得到stm32是基于ARM Cortex-M3内核的,但不属于ARM。因为ARM公司只提供了处理器,st(意法半导体)还有nxp(恩智浦半导体)厂家以此内核为核心添加外设得到了stm32或lpc系列单片机。只能说stm32是基于ARM Cortex -M3内核的,但是不属于ARM。ARM Cortex-M3内核具有高性能、低成本、低功耗等特点,属于ARM7架构中的一员。
51单片机
谈谈51单片机与stm32单片机的区别,先介绍一下,什么是单片机。单片机全称单片微型计算机,简单来说就是集CPU(运算、控制)、RAM(数据存储-内存)、ROM(程序存储)、输入输出设备(串口、并口等)和中断系统处于同一芯片的器件。在我们个人电脑中CPU、RAM、ROM、I/O这些都是单独的芯片,然后这个芯片被安装一个主板上,这样就构成了我们的PC主板,进而组装成电脑,而单片机只是将这所有的集中在一个芯片上而已。
51单片机是对所有兼容Intel8031指令系统的单片机的统称,这一系列的单片机的始祖是Intel的8031单片机,后来随着flash ROM技术的发展,8031单片机取得了长足的进展成为了应用最广泛的8bit单片机之一,他的代表型号是ATMEL公司的AT89系列。STM32单片机则是ST(意法半导体)公司使用arm公司的cortex-M为核心生产的32bit系列的单片机,它的内部资源(寄存器和外设功能)较8051、AVR和PIC都要多的多,基本接近于计算机的CPU了,适用于手机、路由器等等。
开发板与单片机的区别
经过之前的总结,ARM处理器内核加上外设模块(如UART、IIC)组成了芯片(如STM32),也就是单片机,单片机芯片再加上
一些常用的电子器件构成的电路板便是开发板。方便初学者使用,上面常用的外设有led灯、数码管、独立按键、矩阵按键、液晶显示屏、红外线接收头等。而单片机只是上面的核心芯片。
相关问答
单片机 next是什么指令?在单片机中,"next"不是一个指令。单片机的指令集由特定的芯片制造商定义,每个芯片都有自己的指令集。常见的单片机指令包括数据传输、算术运算、逻辑运算、跳...
8位 单片机 系统运行时间?8位单片机的系统运行时间取决于多个因素,包括但不限于以下几点。首先,系统运行时间取决于单片机的时钟频率。时钟频率越高,单片机每秒钟执行的指令数量就越多...
单片机 的指令为什么能按照存储顺序一条一条地执行?单片机的指令能按照存储顺序一条一条地执行,是因为单片机采用了顺序执行的机制和取指/执行周期。在单片机内部,指令存储在存储器(比如闪存或EPROM)中,每条...
单片机 平方指令怎么实现?单片机平方指令的实现可以通过以下步骤来完成:1.首先,将待计算的数值存储在单片机的寄存器中。2.将该数值与自身进行乘法运算,即将该数值与自身相乘。3.将...
单片机 中一个循环步多长?在单片机中,一个循环步的长度是由程序中的指令数量决定的。每一个指令都需要一定的时间来执行,因此循环步的长度也会受到指令执行时间的影响。循环步的长度可...
开发 单片机 学什么语言好?单片机是一种可编程器件,单片机的出现使硬件设计变得更为简单,产品的功能也更强大,而程序就是单片机的灵魂。目前功能稍微复杂一点的电子产品,都是以单片机为...
请问有谁会用 单片机 的汇编语言编一个小型数字程控交换机的程...[回答]每一种系列不同的单片机产品都有自己不同的汇编指令集。8051的汇编是intel公司51系列单片机汇编集最基本的指令集,使用这个汇编指令集的常见的单片...
单片机 和处理器有什么区别?感谢邀请!前言回答这个问题之前,我猜想楼主想说的处理器应该就是专用处理器,如:CPU了。那么,我们就来看看单片机和CPU有什么区别呢?单片机是啥?广义来...感...
stc8h1k08是51 单片机 吗?是。因为stc8h1k08是STC公司生产的51单片机系列产品,具有51单片机的基本架构,也支持大量的51单片机指令集和工具链等。除了stc8h1k08,市面上还有许多其它厂商...
stm32和51 单片机 有什么区别?STM32和51单片机是两种常见的嵌入式系统开发平台,区别如下:1.架构:STM32系列采用了现代化的ARMCortex-M内核架构,具有强大的处理能力和丰富的资源,支持高...