分享

STC计算机诞生记上(将小型的OS和编译器烧录到单片机中这样单片机就直接使用高级语言编程了)

 山峰云绕 2023-04-09 发布于贵州

   (将小型的OS和编译器烧录到单片机中这样单片机就直接使用高级语言编程了)


https://m.toutiao.com/is/AsXGXPC/?= 



今年是STC计算机诞生十周年,笔者作为主创人员特此撰文纪念,揭示一些不为人知的细节。

一、第一代STC计算机的由来

曾经飞思卡尔的朋友问笔者可不可以将小型的OS和编译器烧录到单片机中,这样单片机就直接使用高级语言编程了,笔者当时回答是找到合适的单片机就行。

曾经参观完技改线后与朋友座谈,技改线每次调整做控制的单片机的程序时,哪怕是一个小小的修改,都要停机、烧录代码、然后再从头启动机电设备,相关的生产线再依次启动,花费的代价很大。朋友问有没有一种方法可以不停机就远程调试正在工作的单片机,可以不停机就将修改后的程序烧录进单片机,然后在毫秒量级就切换到新程序工作,并且所有的机电控制都保持当前的运动状态不重新初始化。笔者当时回答是:方法就是把控制单片机做成一台计算机,用操作系统来实现控制。

曾经学习单片机课程的学生问笔者,上机时能不能让每个学生都有一台实验箱,笔者当时回答是:难,当时的8051单片机实验箱要好几千。

2013年在以笔者为核心的团队的努力攻关下,最终满足这些需求的第一代STC计算机面世了,并以“一种基于FORTH的交互式51单片机教学实验与开发主板”的名称申请了专利。下图是该计算机主板的实物照片:

二、STC单片机系统与STC计算机系统的差别

通常“单片机系统”与“计算机系统”的差别不在于使用什么样的计算机语言,运算的速度的有多高,内存的规模有多大以及外存的容量有多少,差别在于它们的工作模式。

(1)编程模式。单片机系统的运行代码是在是在上位机上产生的,在上位机上使用编译器将文本语言的计算机语言编译为供CPU运行的二进制机器码,然后再烧录到单片机上供单片机上运行。

计算机系统的运行代码是在是在计算机自身上产生的,在计算机上使用运行在本机上的编译器将文本语言的计算机语言编译为供本机CPU运行的二进制机器码,然后再调入内存中运行。

(2)新程序的启动模式。单片机系统要运行的新程序通常包含了对整个系统的加电初始化,不能保持运行前后整个系统的机电状态。

计算机的软件系统必定是多任务系统,新程序的编译、生成、加载和启动,都不用停止整个计算机的运行,启动时也不必对使用的设备初始化,可以直接继承设备当时的状态。比如多个程序可以共用计算机的屏幕,任意切换计算机屏幕。

三、STC计算机的设计目标

要研制成一台实际的计算机,必须首先制定符合实际的设计目标。以下是第一代STC计算机的设计目标:

(1)低成本,面向教学。因为学生未来会面临计算机微型化与单片机普及化的时代,未来是属于他们的。因此第一代的STC计算机的主机是一块低成本的实验板和控制板,可以让高校和有兴趣爱好者大量使用。

(2)主板上要有作为数字电平控制用的通用输入输出端口GPIO,并且用LED灯来显示这些端口的状态。主板上要有ADC输入端口,要有实验用的测试电位器。主板上要有标准的RS232接口,要有连接外存存储卡的SPI接口。主板上要有供教学和现场烧录程序的USB烧录接口。

(3)主板只是核心板和实验板,通过串口与上位机通讯,使用上位机的作为键盘、显示屏和程序文本编辑器,外存SD卡设备通过SPI接口与主板连接。

(4)单片机上要有操作系统,能够接受来自串口的命令和程序,能够控制程序的编译、加载和启动,能够进行任务调度和切换,实现对外设的控制。对任务的调度和切换时间为毫秒量级。

(5)单片机上要内置编译器,对来自串口和外存文本源程序进行编译,生成供单片机运行的二进制机器码。

(6)计算机要使用高级程序语言,该语言要有完整的语法结构,包括使用变量、指针、数组等数据结构,使用条件、循环、子程序等语句结构。

四、STC计算机的关键技术

(7)系统软件。根据设计目标和当时可选单片机的指标,软件只能选择集操作系统、编译器为一体的FORTH计算机高级语言系统。

“FORTH是六十年代末期,由Charles H. Moore发展出来在天文台使用的电脑自动控制系统及程序设计语言,允许使用者很容易组合系统已有的简单指令,定义成为功能较复杂的高阶指令。由于其结构精简、执行快速、操作方便,广为当代天文学界使用。八十年代以后,有爱用者成立FORTH Interest Group在世界各地推广,并陆续在各类计算机上建立FORTH系统及标准的语言。”(摘自百度百科)

“FORTH以可延伸的词典为核心,采用两个堆栈为基础的高度模块化结构,是一种将解译程序和编译程序合并运用的双态系统。使用FORTH,可在编译过程中检测差错,并且逐步扩充编译程序代码。利用标准FORTH所写的程序几乎不必大修改,就能在各类计算机运作;甚至在特别设计的电脑上可以完全放弃组合语言,直接由FORTH转化成机器语言,就好像现代的Java machine。同时,使用者也可以自由使用自己定义的运算功能,加入编译器中,使FORTH语言更有弹性。”(摘自百度百科)

(8)硬件则选择当时STC新推出的IAP15F2K61S单片机。

IAP15F2K61S是当时最新系列的STC单片机:

选它作为STC计算机CPU最重要的理由是其61KB的CODE空间都可以按扇区写。因此STC计算机的系统软件采用了类似PC机DOS磁盘那样的结构,依次包括引导扇区,系统扇区、数据扇区和程序扇区的结构。

(9)与通常的STC单片机硬件系统相比,STC计算机硬件系统最大的不同是扩展了64KB的外部SRAM,这是在STC计算机上使用操作系统和编译器必须的关键技术,这么做的原因如下:

FORTH语言操作系统在对内存的分配是一种特殊的、将机器代码与变量数据混合在一起的链状结构,通常只适合能在RAM中执行机器指令的计算机。

但是STC15系列单片机只能在片内的FLASH存储区域执行机器指令,如果要在该FLASH存储区域随机写入数据,不论多少字节,都要将数据所在的整个扇区的数据全部清除,这使得对变量的赋值要花费长到不可接受的时间。因此外扩64KB的XRAM,与内部的61KB的CODE互为“镜像内存”,对变量数据只使用MOVX指令读写XRAM的数据,然后采用特殊的软件机制对需要的存储区域在合适的时间进行镜像数据同步,就可以运行FORTH语言。

五、STC计算机的总体架构

下图为STC计算机的总体架构图:

STC计算机分为以下8个部分:

(10)CPU部分。采用DIP-40封装的IAP15F2K61S单片机,使用插座固定在主板上,方便更换最新的芯片。

(11)64KB的扩展RAM存储器,使用两片62256静态RAM芯片。下图为MCU+SRAM部分的电路图:

(12)两路RS-232串口。其中一路与USB接口共用(通过跳线选择),另外一路与SPI接口共用(通过跳线选择)。

(13)USB接口,用于以上位机通讯,实现下载烧录代码、命令窗口人机交互和下载储存在上位机上的FORTH语言源程序。

(14)外接SD储存卡。SD卡通过SPI接口与STC计算机相连,作为本地的磁盘存储器。

(15)8路通用输入输出接口GPIO。由于单片机的P0和P2端口被64KB的扩展RAM完整地占用了,P1和P3各有两个端口用于串口通讯,因此这8路GPIO没法独立使用一个完整地8位端口了。

(16)6路ADC输入端口。如果不使用某几路ADC,可以用跳线选择为GPIO端口。

(17)LED灯与蜂鸣器板上显示设备。值得一提的是所有的LED都经过74HC04的驱动才连接到GPIO端口上,这样无论该GPIO端口是作为输入或者作为输出,只有一个TTL的负载水平,可以连接到各种输出很弱的外部器件上。

六、STC计算机软件系统的研制

(18)STC计算机的研究大约是从2009年初就开始了,内部的名称为“金陵一号”。金陵一号使用操作系统名称为“JL51”,金陵一号使用的高级计算机语言名称为“V#”(意思是虚拟计算机语言)。金陵一号开始时使用的单片机是“C8051F020”,铭朗公司的开发板和仿真器。

开始阶段的研究目标是了解在8051架构的单片机上是否能实现操作系统和采用哪种高级语言(除了FORTH语言,笔者当时已带团队开发了名为“B#”的Windows环境下的BASIC语言编译器和集成开发环境,并实际用于本科一年级的程序设计课程教学,这是题外话)。下图是当时的一个开发文档页:

(19)通过在C8051F020单片机上的研究得到了一些宝贵的经验和重要的结论。首先8051架构的单片机上的操作系统和计算机语言只能是FORTH,其次将FORTH语言移植到RAM只有几KB的单片机上难度很高,最后如果单片机没有IAP功能,程序运行时不能改写CODE空间的代码,则动态编译和加载新程序是不可能的。因此在C8051F020单片机上的研究就停止了。

(20)直到宏晶公司推出了划时代的IAP15系列单片机,解决了动态改写CODE代码的问题,STC计算机的研究就正式转移到IAP15F2K61S单片机上了。更由于该单片机的代码烧录方式和采用DIP-40,使得按自己的要求制作开发板成为了可能。

(21)虽然在硬件上用“镜像内存”的技术解决了FORTH系统代码需要运行在RAM存储器中与STC单片机代码只能运行在FLASH存储器中的矛盾,但在实际中是不是可行谁也不知道。

为此,笔者先在PC机DOS环境下开发了一个模拟系统“JL_DOS.COM”,它是一个56KB的DOS程序,可以在PC机上实现前面的所有要求。

(22)JL_DOS模拟系统证明了可以在大约40KB的RAM空间实现FORTH系统,还证明了如果有4x64KB=256KB的RAM空间,就FORTH系统上自己生成自己。

自己生成自己的一个例子是在PC机MS-DOS操作系统上,使用MASM宏汇编编译器,就可以根据源程序,重新编译出一个一模一样的MS-DOS和MASM来。

自己生成自己的另一个例子是在PC机的Linux操作系统下,使用GCC编译器,就可以根据源程序,重新编译出一个一模一样的Linux和GCC来。

当然用当时的IAP15xxxx等8位的8051单片机做成的计算机是不可能了,但是用未来的STC32G/F系列的RAM规模超过256KB的STC单片机做的STC计算机就可以了。

(23)运行在DOS环境下的这个模拟系统,后来升级为“倚天剑 Forth 8051单片机 交叉编译器软件”,在笔者前面的文章中介绍过了。下图为其运行的一个界面:

图中“TF_LOAD YTJ_DEMO.J”行命令是从磁盘上加载一个名称为“YTJ_DEMO.J”的FORTH源程序,然后是“1 2 3 3 AV”是求1、2和3这三个数的平均值并将结果显示出来的命令,后一行显示平均值是2。

(24)上面这个界面是在PC机上模拟程序的,也是未来在STC计算机在PC机上超级终端上显示的界面,其中“JL>”是命令行提示符。

本文未完,待续。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多