我觉得,“微机原理”当然还应该学,它仍然是电专业本科最核心的几门计算机基础课之一,8086也有必要了解,但现在很多学校教的那一套“8086考古版微机原理”,确实应该退出历史舞台了。
自动化、电气、电子信息的学生今天依然非常需要理解这样一条链:
C代码 → 编译器 → 指令 → CPU → 寄存器 → 总线 → 内存 → 外设
否则学生用STM32时会出现一种很典型的状态:
GPIO_SetBits(GPIOA, GPIO_Pin_5);代码会写,但不知道这一句到底发生了什么,怎么发生的。
实际上它背后就是:
CPU执行store指令 → 产生地址 → 总线译码 → 访问外设寄存器 → GPIO硬件改变
这恰恰就是微机原理应该讲的东西。
真正应该淘汰的,是大量“8086细枝末节”。
很多传统微机原理课程还在围绕:
- 8086内部结构
- AX、BX、CX、DX
- CS、DS、SS、ES
- 段地址 × 16 + 偏移地址
- 8255
- 8253
- 8259
- 汇编程序设计
- 手算物理地址
这些东西有没有历史价值?当然有。
但如果一个电专业本科生一学期只有四五十个课时,却花大量时间背:
8255控制字的D7~D0分别是什么意思?
我认为性价比已经很低。
因为学生毕业以后更可能面对的是:
Cortex-M、STM32、RISC-V、ARM、DMA、NVIC、SPI、I²C、UART、ADC、定时器、Cache、MMIO……
因此,重要的是与现代衔接,而不是花大量时间在这些已经过时的器件的定义上。
于是,有一批东西反而比以前更应该讲,比如:
*(volatileuint32_t *)0x4001080C这么短短一句,其实可以把整个“现代微机的原理”串起来。
为什么0x4001080C能控制硬件?
因为现代MCU大量使用:
Memory-Mapped I/O
CPU并不知道:
“我要操作GPIO了。”
CPU只知道:
我要向地址 0x4001080C 写一个32位数据。
然后地址进入总线,总线发现
0x40000000 ~ ···
这个范围属于外设区域,于是把这个访问送给某个外设,最后落到GPIO寄存器。
这一套:
地址空间 地址译码 总线 寄存器 内存映射I/O CPU load/store
就是现代版微机原理的核心,而且这套思想可以从STM32一路通到PC。
所以我觉得,这门课应该改造成“计算机硬件原理 + 嵌入式系统基础”,学生先理解现代计算机如何执行程序,再根据专业方向深入学习单片机、嵌入式系统或处理器架构。我们有个「重新理解编程」专栏,就是为此原理和基础而来。
热门跟贴