老莫

我电《微机原理》课程改革检讨之我见

1
阅读(7273) 评论(2)

《微机原理与接口技术》这门课程是工科非计算机专业一门非常重要的课程。课程担负着介绍整个计算机系统工作原理的任务,是整个工科非计算机类专业基础知识学习和技培养中非常重要的一环。但也是目前争议最大、改革呼声最高但又改革难度最大的一环。

传统的《微机原理与接口技术》课程是以8086CPU为基础,利用8255、8235等接口芯片来构建完整的计算机系统。这一方案的缺陷显而易见。首先是8086处理器已经非常落后,其中的很多技术目前已经不再使用。以此为基础开设课程与实际应用严重脱节,所需实验芯片、实验装置已经很难购买和更换。为了解决和实践脱节的问题,很多学校不得不在开设完这门课程之后再开设一门单片机或者嵌入式系统设计相关课程。这在就需要消耗更多的课时,这在目前缩短课时的大趋势下已经非常不现实。

为解决这一问题,我电从2009年(也就是我参加工作的第一年)起就开始实施相应的课程改革。本来,我是不上这门课的。我硕士阶段一直是研究集成电路尤其是信号处理类数字集成电路的,对计算机系统并不十分了解。原本我准备上的课程也是《数字集成电路与系统设计》(也就是以前的ASIC设计,到现在为止我还在上这门课的MooC,具体链接:http://www.icourse163.org/course/UESTC-234015)。但由于种种机缘巧合,安排我上了这门课。而这一决定,其实改变了我后面的研究方向,更改变了我的人生。

从那时起,我电的《微机原理与接口技术》课程就改名为《微处理器系统结构与嵌入式系统设计》,同名的教材也相应的出版了两个版本。但今天我回头再看这个改革,其中固然有很多有益的探索。但是留下的遗憾和失败的教训依然很多,值得我们今天加以反思。这里我就以自己的观点分析一下这门课程改革的缺憾。

《微机原理与接口技术》课程建设的主要矛盾是计算机技术飞速发展而造成的知识体系不断更新与不断缩减的课时之间的矛盾。计算机系统本来就是一个融合了多种软硬件技术的复杂系统,要讲解起来颇为不易。参考目前计算机专业教指委“计算机能力培养”的计划,计算机专业的学生需要通过学习多门课程并辅以大量的实验和课程设计才能到达这一效果(扩展阅读链接:http://blog.chinaaet.com/molf/p/5100051577)。而工科非计算机专业很显然是没有这么多课时来慢慢的讲解这些了,所以这一矛盾一直以来就处于几乎无解的状态。

传统的《微机原理与接口技术》的讲法是以80X86,甚至主要是以8086系列的CPU为核心来讲解的。这一方案的缺陷显而易见。首先是8086处理器已经非常落后,其中的很多技术目前已经不再使用。以此为基础开设课程与实际应用严重脱节,所需实验芯片、实验装置已经很难购买和更换。为了解决和实践脱节的问题,很多学校不得不在开设完这门课程之后再开设一门单片机或者嵌入式系统设计相关课程。这在就需要消耗更多的课时,这在目前缩短课时的大趋势下已经非常不现实。

为解决这一问题,各个学校都纷纷开始对传统《微机原理与接口技术》的改革。一种主要的改革思路是直接改讲单片机或者嵌入式处理器。这样的好处是学生学习了最新、最实用的知识,直接接触实际工作中可能要用到的器件。但这种替代并非简单意义上的将处理器更新为更新的器件。由于传统的单片机和嵌入式微处理器课程在设计上都偏重于 “讲应用”而非 “讲原理”,使得这类课程的教材在原理性的讲解上天然就存在不足。此外,单片机或嵌入式微处理器的形态都是“单片化”的计算机,总线、接口等通常都已经被集成在芯片内部而不可见。在使用时开发者直接通过对接口写入控制字或调用特定的读写程序/函数完成对存储器的访问和对接口的控制。从商业使用的角度上来说,这样固然是简化了开发难度并提升了开发效率,有利于商业推广和工程应用。但从教学的角度上来说,这种形态的器件已经将很多计算机系统的要素掩盖或隐藏了起来,对于讲解原理性的知识造成的很大的困扰。

因此,这一类的课程往往只能从所谓的“编程模型”上面去讲解,既把整个计算机的运行过程抽象成为对地址空间和特定存储器的编程操作。这对于没有清晰的计算机系统概念的工科非计算机专业同学来说是其实是不太容易理解的,很容易形成上课死记硬背、上完云里雾里的现象。最典型的一个例子就是在讲接口、端口以及控制字等概念。用单片机就只能说是去讲往某个特定的地址写入一个特定的数据,然后这个IO的功能就变了?但是,是为什么这样功能就能够变了?对于有一定开发经验的人来说很好理解,但是对于第一次接触这些知识的学生来说就太难理解了。其实这时候就要祭出下面这张图:

端口示意图.png

这张图来自于Altera的某个handbook,讲Avalone总线接口的。往某个地址写一个数据实际上是把一些特定寄存器里面的值改变了。而这些寄存器本质上又是一个特定逻辑的输入。改变了这些输入,就改变了这个逻辑的输出。

这些原理,一般的单片机的书都不会谈到。因为单片机的厂商不会给这些东西,这事要用FPGA实现SoC的时候才需要用到的。

当年,我们这些教材的编撰者和改革者也看到了直接用单片机或嵌入式替代《微机原理与接口技术》是不可行不科学的。所以想到了另外一种解决方案,希望在保留原来课程精华的基础上扩展计算机组成相关的理论知识,同时补充最新的嵌入式系统设计等与实践相联系的课程内容。为此专门出版了全新的教材《微处理器系统结构与嵌入式系统设计》一书。该书的前半部分以计算机组成原理相关知识为主干,依次介绍了微处理器、总线、存储系统、输入输出接口等概念性知识。后半部分以ARM嵌入式微处理器为例,依次介绍了编程模型、ARM汇编指令与程序设计、基于ARM嵌入式微处理器的硬件/软件设计等知识。该课程的改革希望是兼顾原理介绍和实践教育,但却因此而造成知识点过于庞杂、前后内容脱节等问题。不但增加了学生学习的难度,也对任课老师自身的水平提出了很高的要求。在实际的教学中,学生在前半学期基本处于“概念教学”的阶段,完全依赖于教师讲授来帮助学生建立起一整套计算机系统的抽象模型。而在后半学期的学习中,教师需要引导学生将实际的ARM处理器代入到之前建立的抽象模型中去。这种教学模式对任课教师提出了很高的要求,不但要求老师对计算机系统的概念清晰、理解深刻,还要求老师有能力完全依靠讲授就帮助学生建立起着一套概念。而在后半期的课程中,由于ARM嵌入式微处理器同样存在高度集成化,内部结构不可见等缺陷。学生只能有限度的将实际的处理器与理想中的模型对应。二者的差异性还往往造成学生学习中的困扰。从教学效果来看,学生普遍反映教材知识点庞杂而难以理解。如果任课老师本身计算机系统方面的知识水平有限,学生的学习难度将倍增。

如果继续展开来说,这次的课程改革有以下几个非常值得检讨的地方:

一、内容贪大求全

本来课程改革的目的是为了精炼知识点,把最核心最重要的知识点提取出来。但这种提炼的过程本身就意味着要放弃一些知识点,同时又要简化一些知识点。这一部分其实是非常考验教材编写者能力和智慧的。该保留哪些,该舍弃哪些,都是需要仔细思考和琢磨的。

但这本书在编写的时候,确实有太多的东西舍不得放下。使得原本在老的《微机原理与接口技术》中很多内容都被保留了下来,但是篇幅被大量缩减了。同时又加入了一部分《计算机组成原理》的内容。再加上后半部分需要将于ARM处理器相关的很多实际的内容。最后导致的结果就是知识点大大的增加,但是每一个知识点本身又被削弱了。这一方面使得很多内容出现了重复现象,另一方面又有很多关键知识点没有彻底讲清楚。

在本书的后半部分,为了全面介绍嵌入式微处理器软硬件相关技术,在半本书不到的内容中塞进了ARM汇编指令、汇编语言编程、嵌入式C语言编程、嵌入式系统硬件以及操作系统等大量的内容。结果导致这部分内容只能浅尝辄止,泛泛而谈。这还和后面讲到的另一个值得检讨的地方有关系。

二、核心知识点缺乏总结与提炼

这一点问题其实第一点有直接的联系,但是又有所区别,两者在一定程度上互为因果。但对核心知识点没有进行很好的总结与提炼,所以在编写教材和实际课堂讲授的时候造成重点突出不够。考虑到这本书和这门课的受众是此前很少接触到计算机原理的工科非计算机专业学生,直接把一些计算机专业课程的概念拿过来简单的讲一遍学生一定是听得云里雾里的。在授课时间有限的前提下,需要将要讲授的知识点进行必要的总结,从中提炼出学生必须要掌握的知识点。另一方面要考虑到学生的知识背景和课时安排,用学生在当下能够理解的语言和表达方式介绍相关知识。但这种总结和精炼确实很考验教材编写者和教改组织者的水平。因为这种总结和精炼既要考虑到受众的接受能力而必须简单易懂,又不能违反科学性而导致精炼后的语言描述出现较大偏差。因此,当时在编书的时候过分考虑了正确性、全面性照搬了很多概念,而对这些概念的内涵和外延又缺乏必要的解释。这导致了整本书的前半部分的重点不够突出,主线不够明确。过多概念的简单堆砌对于学生完整的理解计算机系统并无帮助,反而有可能把学生引向一些“歧途”。

三、教材结构存在较大缺陷

第一版教材的结构缺陷是巨大的,在通信学院试用了两年以后得到了非常多的负面反馈。于是第二版进行了比较大的改动,重新调整了结构。虽然经过多次讨论,确定下来了每一章的大致内容。但是在实际编写的过程中,有的老师依然按照自己的想法脱离了既定的编写目标。例如,在第二章中2.3节微处理器结构的改进、2.4计算机体系结构的分类、2.5计算机性能测评其实都已经属于计算机体系结构的范畴,而脱离了章标题“计算机系统的结构组成和工作原理”的编写初衷。这一章中真正讲组成的部分其实只有10页,讲得极其简略。计算机组成中几个非常核心的问题:程序存储式计算机的概念和实现方式、总线的作用、主从式的计算机内部通信方式、存储器和CPU之间的耦合关系都没有讲清楚。

在第四章总线技术与总线标准和第五章存储器系统的安排先后顺序上也存在较大的问题。我认为这两章的内容其实应该互换。先讲第三章CPU/微处理器的概念,指出CPU/微处理器是被指令驱动的。然后讲指令和数据都是被存储到存储系统中的,存储系统应该如何编址、组织、然后被访问到。接下来讲内部总线就是连接CPU和存储系统的通道。这样应该要合理很多。

四、过分追求“先进”和“高大上”

在教材编写时,我曾经提出不应该使用ARM9这种嵌入式微处理器,完全可以使用Cortex M3这类32位ARM单片机来讲解后半部分。但是被其他老师否定,理由是Cortex M3过于简单,不能完全体现“现代处理器”的特性。但是实际上,越是简单的东西越是接近“原始设计”,也就越接近基本原理。而复杂的、现代的、先进的,往往由于层次过于复杂而把基本原理隐藏在了一层层抽象中。同理,我也不是反对讲操作系统,但一上来就将嵌入式Linux还带图形界面的。在这么短的时间和有限的实验课时里面,现实吗?

我们学校很多老师都有一种思想,觉得我电作为“电子信息产业的排头兵”、“双一流”高校,一定要用能够显示“逼格”的实验设备才能体现出我们的不同之处。但实际上教学的目的是什么?不是为了“炫技”,而是为了把知识和方法顺利的传递给学生。那种方式更能够把计算机系统的基本观念顺利的传递给学生,能够让学生成功的建立起计算机系统的整体概念并理解计算机的运行过程,这种方式就是好的方式。

五、前后两部分内容有比较严重的脱节

这个缺陷其实是以上四个缺陷造成的后果。我最初提出前半部分内容要尽量向后半部分靠拢,就用后半部分的内容中涉及到的指令编码格式、寻址方式、异常处理过程举例。因为计算机系统发展了这么多年,其实在细节技术上确实是有差别的。ARM用到的技术只是一部分子集而已。有些东西ARM并没有用,有些名词在ARM的技术体系里面并不是这样叫的,有些实现过程也并不相同。因此前面就用ARM的体系举例,其它的技术最多简单提一下就好了。而这部分意见也没有被完全接受。某老师甚至还说,我们在前半部分以X86体系为例子讲,后半部分讲ARM,这样学生不是两个体系都会了嘛……这种方式在实际的教学活动中除了让学生更加迷惘,脑子更晕之外没有别的什么好处。


以上,就是我目前总结的这次改革和教材编写的不足之处。这个改革推出之初在全国范围内还是有一定影响力的,过来参观的、考察的学校也还是有不少。那几年也没少去实验室当迎宾男士,给别人介绍“先进经验”。但是后来的教材销售和推广实践表明,这个课程的改革是比较失败的。大家看热闹的多,真正实际使用的少。原来我还在通信学院的时候,觉得用这个教材教学的效果还可以。而我到了微固学院以后,却听到学生反应这个教材是他们学过“最烂的教材”……我当时也是大吃了一惊,觉得这个教材虽然有诸多不足,也不至于到“最烂”这个地步。后来经过和学生的谈话和自己的思考以后,觉得是多方面原因造成的。一方面微固学院的学生普遍学习的课程偏“微观”,本来就缺乏其它课程来培养学生的“系统观”。这使得同样水平的微固学生在理解一个比较庞大的复杂系统时比通信的学生要更加困难一些。另外一点是通信的老师,基本上是这本书的作者,因此对这本书的理解要比其他的老师更加深刻一些。在具体上课时有一些合理的取舍以及编排,在一定程度上抵消了这本教材的缺点。还有一些原因,因为有可能影响团结,就不在这里细说了。


《微机原理与接口技术》的课程改革不是一件容易的事情,希望我们能从之前的改革中汲取足够的教训。利用现在最新的教育技术手段和实验手段,真正让这门课变成老师容易教、学生愿意学的课程。


后续进展,将陆续放出。

  1. @Felix   

    我觉得微机原理早就不该讲什么8086了,换成讲ARM多好。学8086,有用的只是其中的设计和分析思想,但大部分人只是学习了一些指令,然而这些指令在现在啥用都没有!所以还不如讲一讲ARM原理呢,比如说现在MCU中常用的Cortex M之类的,再或者是RSIC V之类的开源处理器……又能学到思想,又实用,多好!

    不急,我这慢慢分析。

    刚刚补充完成了,你这看完了再继续评论。

  2. 我觉得微机原理早就不该讲什么8086了,换成讲ARM多好。学8086,有用的只是其中的设计和分析思想,但大部分人只是学习了一些指令,然而这些指令在现在啥用都没有!所以还不如讲一讲ARM原理呢,比如说现在MCU中常用的Cortex M之类的,再或者是RSIC V之类的开源处理器……又能学到思想,又实用,多好!