Skip to content

集成电路发展史

指令集的发展

  1. 芯片的本质是二极管, 为了在芯片上跑程序, 出现了指令集(ISA)这个东西.

  2. 指令集分两大流派: 复杂指令集(CISC)精简指令集(RISC)

指令集ISA优点缺点
复杂指令集CISC(Complex Instruction Set Computing)一条指令中完成更多的工作, 最大限度榨干硬件日趋庞杂的指令芯片不但不易实现,而且还可能降低系统性能
精简指令集RISC(Reduced Instruction Set Computer)芯片容易实现多条指令才能完成一个任务, 造成硬件的浪费

比较主流的指令集

  1. CISC 发展出了
    • X86
    • 8051
  2. RISC百花齐放,
    • ARM(Acorn RISC Machine)
    • MIPS(Microprocessor without interlocked pipelined stages 无内部互锁流水级的微处理器)
    • RISC-V(开源BSD)
    • AVR
    • PIC
    • PowerPC
  3. 还有一些专门针对某些运算出来的指令集, 这些并不能用上面两个标准区分如:
    • DSP
    • FPGA
    • EPSXX

为什么有这么多ISA?

  • X86和ARM指令集的实现方式都是闭源的

  • x86架构由于授权问题只有几家可以生产,包括现在的Intel、AMD

  • 但是ARM有多种授权方式

    • ARM公司本身并不靠自有的设计来制造或出售CPU,而是将处理器架构授权给有兴趣的厂家。
    • 如苹果M1,M2.海思部分麒麟处理器就是采用这种方式生产出来的。
    • x86是占了先手的, ARM1983年才开始设计,但是授权方式的原因ARM也抢了很多市场.
    • 从2020年英伟达强势宣布将以400亿美元的价格收购英国ARM公司的事件,可以看出, ARM这种不生成CPU的方式并没有X86这种和intel牢牢绑定的方式赚钱.
    • 一旦英伟达收购ARM,很难说新的授权方式,因此包括苹果,华为等都开始威胁要拥抱RISC-V
  • RISC-V 是开源的(BSD)

如今,复杂指令集和精简指令集界限日渐模糊, 都在吸取别人的优点.在性能和易实现之间做权衡

X86和ARM的优劣势

X86结构的电脑采用“桥”的方式与扩展设备(如:硬盘、内存等)进行连接,而且x86结构的电脑出现了近30年,其配套扩展的设备种类多、价格也比较便宜,所以x86结构的电脑能很容易进行性能扩展,如增加内存、硬盘等。

ARM结构的电脑是通过专用的数据接口使CPU与数据存储设备进行连接,所以ARM的存储、内存等性能扩展难以进行(一般在产品设计时已经定好其内存及数据存储的容量),所以采用ARM结构的系统,一般不考虑扩展。基本奉行“够用就好”的原则。这就是为什么现在苹果电脑不留出多个硬盘/内存接口的原因之一.

指令集之间是可以转换的

同时还可以软件兼容, M1跑intel芯片的程序, M1不能识别x86的指令苹果就开发了一个叫做Rosetta 2 的转译机制,把x86的复杂指令翻译成ARM的精简指令, 显然这中间必定有效率的问题.

指令集(ISA)与架构与芯片之间的关系

什么是架构

架构 architecture:是一个抽象的概念

比如我们常说的计算机处理器有486、Ivy Bridge、Pentium M……这就是架构的不同(但其都从属于x86架构)

ARMv1~ARMv8到STM32这些名称都属于ARM架构

麒麟支持哪些CPU?

麒麟操作系统能全面支持飞腾、龙芯、兆芯、申威、海光、鲲鹏六款主流国产CPU

CPU架构
飞腾ARM
龙芯LoongArch/MIPS64
兆芯X86
申威~Alpha用于超级计算机
海光X86
鲲鹏ARM

六个经典单片机种类介绍

51单片机

51单片机是对所有兼容Intel8051指令系统的单片机的统称, 如

  • Intel(英特尔):80C31、80C51、87C51,80C32、80C52、87C52等;
  • Atmel(艾特梅尔):89C51、89C52、89C2051,89S51(RC),89S52(RC)等;
  • Philips(飞利浦)、华邦、Dallas(达拉斯)、Siemens(西门子)等公司的许多产品;
  • STC(宏晶):STC89C51、STC90C51、STC11系列、STC15系列、STC8, STC16系列等。

他们并不都是8位的: 如STC16是个32位的8051, 阉割为了16位

51单片机泛滥的原因:

  • intel看不上看不上这块肉了, 同时要和其他人竞争, 就开放了授权
  • 入场早,前面学习的人都是用的这个

AVR/PIC/PowerPC/MIPS

  • PIC芯片示例:

    • PIC16C5X,PIC12C6XX, PIC17CXX
  • AVR芯片示例: 比较典型的就是Altera、Lattice、Xilinx世界三大权威公司

    • AlteraEPM7128S(PLCC84)、LatticeLC4128V(TQFP100)、XilinxXC95108(PLCC84)
  • MIPS是卖得最好的RISCCPU

    • MIPS324Kc, MIPS645Kc
    • 如Sony,Nintendo的游戏机,Cisco的路由器和SGI超级计算机
  • PowerPC

    • 任天堂Gamecube

都是跟8051单片机的机构不同的位单片机,因为结构不同,所以他的汇编指令也不同,并且他们都是使用的RISC指令集,只有几十条指令,大部分的还都是单周期的指令,所以在相同的晶振频率下,比8051速度要快.但是他们不属于ARM架构, 算是和ARM同时期发展出来的RISC指令集.

ARM

  • 手机芯片,任天堂游戏机, iPod:

    GameBoyAdvance,NintendoDS,iPodARM9TDMIArmadillo,GP32,GP2X(第一颗内核),TapwaveZodiac(Motorolai.MX1);GP2X(第二颗内核)ARM9ENintendoDS,NokiaN-GageConexant802.11chips;STM32, STMicroSTR91xF,ARM11NokiaN93,Zune,NokiaN800,NOKIAE72CortexTexasInstrumentsOMAP3;Broadcomisauser;LuminaryMicro

他的内部资源(寄存器和外设功能)较8051、AVR和PIC都要多的多,基本上接近于计算机的CPU了

DSP/FPGA

DSP其实也是一种特殊的单片机,他从8bit到32bit的都有,他专门是用来计算数字信号的,在某些计算公式上,他甚至比现在的家用计算机的最快CPU还要快,比如说一个32bit的DSP能在一个指令周期内完成一个32bit数乘以32bit数再加上一个32bit数的计算。不好定义属于CISC还是RISC

单片机的各种编程语言

汇编语言

汇编不是编程语言,他只是机器指令和一些宏的组合。

为了用人类看得懂的语言来描述指令集, 就有了汇编语言, 不同架构的汇编语言是不一样的,ARM的汇编语言与Intel X86的就不同。

汇编语言编译器

  • AVR Studio

高级语言

虽然汇编语言读起来方便了,但也有缺陷。首先汇编语言操作起来还是挺麻烦的。其次汇编语言对应一条条指令集,所以当指令集改变时,就得修改相应汇编语言,导致其可移植性很差,不能跨平台使用,这时人们就想开发一种更方便操作,超越指令集的语言,于是有了C,C++等高级语言.

C/C++语言

  • 大部分单片机支持C语言编译出来的二进制文件, 但是像FPGA就不支持C语言verilog和VHDL语言或者C语言无法编译出FPGA需要的二进制文件,因为C语言是先出现的.

  • 至于C++, 要看编译器支不支持, 把C++编译为对应指令集2进制的东西, 理论上来说C++是可以用C的代码复写的,但是这个事情太庞大了, C++是一直更新的现在都C++20了.如Keil支持STL库

    • 但是C++对运行效率有很大的影响, CPU速率大于100MHz不用考虑C++语言本身对程序运行效率的影响

    • C++编译出来的东西比C大很多, 各种库使用都会增大体积, Flash一般要大于100K

    • C++的编译器要针对 在针对8位MCU, 32位MCU做不一样的处理(地址长度都不一样)

    • C++的各种库不一定对单片机支持: 如STL标准库

    • C++11、C++14和C++17还是有不小区别的。不能有换编译器的需求

    • C++ 并没有比C写起来快很多

      But mind you, writing complex code in C can give you nightmares.

      But then debugging C++ code can give you nightmares as well.

    • C++写的时候有时候要 提前分配存储空间,而不是自动分配.否则会有小概率情况会出问题

C++/C编译器:

Keil

Keil公司2005年由ARM公司收购。现在已经迭代到 Keil μVision5,

支持ARM, 51单片机

IAR/STVD/ICCAVR

ST系列芯片用STVD

IAR,ICCAVR用于AVR

ArduinoIDE

Arduino2005 才开始出现, 有人嫌弃学一个单片机开发太麻烦了, 要先写代码, 然后读手册,烧录.

学几天都学不会.然后出了一套电路板,给学生学习,同时出了ArduinoIDE用于敲代码和烧录.

然后大家发现都很好用, 由于是开源的, 有人做了wokwi-Arduino在线模拟

有人做了对各种开发板的支持.发展到现在云平台也做.

其他编译器

基本一个芯片就有一个编译器, 毕竟不太复杂, 要么编译器支持你,要么你自己写一个编译器, 编译器在工作量和兼容更多的芯片之间做出选择, 厂家在学习成本/对客户吸引力和对编译器支持的力度做出选择, 开发者也会对学习成本和芯片价格做出选择.三方是互相影响的

其他语言

micropython

  • 支持部分芯片的部分功能

tinygo

  • 支持部分芯片的部分功能

nodemcu(lua)

  • 好像是专门为了esp系列出的一套系统

C/C++编译过程发展史

c/c++ 与 gcc/g++

gcc是GCC中的GUN C Compiler(C 编译器)

g++是GCC中的GUN C++ Compiler(C++编译器)

gcc和g++的主要区别:

  1. 对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(cpp的语法规则比c的更强一些);
  2. 对于 .c和.cpp文件,g++则统一当做cpp文件编译。
  3. 对于windwos平台, 有2个方案: vs 和 MinGW
  4. CodeBlocks, CodeLite,Kate,Eclipse CDT4 是一个IDE, 对标是vsIDE

makefile的出现

  • 但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大
  • 所以出现了make工具make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。
  • 于此同时于make一起出现的还有

cmake的出现

  • makefile在一些简单的工程完全可以人工手下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。

  • 这时候就出现了Cmake这个工具,cmake就可以更加简单的生成makefile文件给上面那个make用。

  • 当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。

  • 可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。

与make-cmake 同时出现的解决方案有

  • ninja, NMake

cmake 几乎支持所有的其他编译脚本:

  • Visual Studio 16 2019 = Generates Visual Studio 2019 project files. Use -A option to specify architecture. Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files. Optional [arch] can be "Win64" or "ARM". Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files. Optional [arch] can be "Win64" or "ARM". Visual Studio 12 2013 [arch] = Generates Visual Studio 2013 project files. Optional [arch] can be "Win64" or "ARM". Visual Studio 11 2012 [arch] = Generates Visual Studio 2012 project files. Optional [arch] can be "Win64" or "ARM". Visual Studio 10 2010 [arch] = Generates Visual Studio 2010 project files. Optional [arch] can be "Win64" or "IA64". Visual Studio 9 2008 [arch] = Generates Visual Studio 2008 project files. Optional [arch] can be "Win64" or "IA64". Borland Makefiles = Generates Borland makefiles. NMake Makefiles = Generates NMake makefiles. NMake Makefiles JOM = Generates JOM makefiles. MSYS Makefiles = Generates MSYS makefiles. MinGW Makefiles = Generates a make file for use with mingw32-make. Unix Makefiles = Generates standard UNIX makefiles. Green Hills MULTI = Generates Green Hills MULTI files (experimental, work-in-progress). Ninja = Generates build.ninja files. Watcom WMake = Generates Watcom WMake makefiles. CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files. CodeBlocks - NMake Makefiles = Generates CodeBlocks project files. CodeBlocks - NMake Makefiles JOM = Generates CodeBlocks project files. CodeBlocks - Ninja = Generates CodeBlocks project files. CodeBlocks - Unix Makefiles = Generates CodeBlocks project files. CodeLite - MinGW Makefiles = Generates CodeLite project files. CodeLite - NMake Makefiles = Generates CodeLite project files. CodeLite - Ninja = Generates CodeLite project files. CodeLite - Unix Makefiles = Generates CodeLite project files. Sublime Text 2 - MinGW Makefiles = Generates Sublime Text 2 project files. Sublime Text 2 - NMake Makefiles = Generates Sublime Text 2 project files. Sublime Text 2 - Ninja = Generates Sublime Text 2 project files. Sublime Text 2 - Unix Makefiles = Generates Sublime Text 2 project files. Kate - MinGW Makefiles = Generates Kate project files. Kate - NMake Makefiles = Generates Kate project files. Kate - Ninja = Generates Kate project files. Kate - Unix Makefiles = Generates Kate project files. Eclipse CDT4 - NMake Makefiles = Generates Eclipse CDT 4.0 project files. Eclipse CDT4 - MinGW Makefiles = Generates Eclipse CDT 4.0 project files. Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files. Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.

qmake 是模仿cmake 的一个东西, 但是仅支持make

一般情况下我们在源码的同级目录下创建build文件夹

QMake 跨平台编译

Windows

在 mingw730_64/mingw730_32/msvc2017/msvc2017_64 选一个

以 mingw730_64 为例:

将以下exe的目录加入环境变量(如果多个 加成临时的环境变量)

C:\Qt\Qt5.12.9\Tools\mingw730_64\bin\mingw32-make.exe

C:\Qt\Qt5.12.9\5.12.9\mingw73_64\bin\qmake.exe

切换到源码目录

cd E:\PMSoft\NewSrc\trunk\Tools\qt_cross\qmake_demo\hello_build

qmake生成cmake的文件

qmake ../hello/hello.pro

生成exe

使用mingw32-make

release:

mingw32-make

debug:

mingw32-make -f Makefile.Debug

Ubuntu

目前都是64位的系统 以gcc_64为例

/qt安装目录/gcc_64/lib

永久添加环境变量

打开文件 ~ 表示当前用户

vi ~/.bashrc

添加环境变量

export PATH=$PATH:~/Qt/5.15.2/gcc_64/bin:~/Qt/Tools/CMake/bin

生效文件

source ~/.bashrc

确认成功

qmake -v

跳转到build目录

cd ~/qt_src/qt_cross/qmake_demo/hello_build

生成cmake文件

qmake ../hello/hello.pro

编译 -j4 启动几个cpu进行编译

make clean;
make -j4

CMake 跨平台编译

编译流程

用CMake 生成 Makefile

cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_DEPENDS_USE_COMPILER=FALSE -G "CodeBlocks - MinGW Makefiles"  ../

或者简化为

cmake "-GCodeBlocks - MinGW Makefiles"  ../

解释pwd为当前目录

  • cmake会在pwd 生成makefile文件供make使用

  • 会根据 ../ 为CMakeLists.txt所在的目录

    • CMakeLists.txt 中有包含哪些文件, 怎么编译的信息

    • 各种配置 如MinGW目录 QT_Creator 放在了 CMakeLists.txt.user 中, 里面是各种环境变量

    • Clion全部放在了CMakeLists.txt

  • -D

    • 里面有很多编译设置 , 编译出来放在CMakeCache.txt
  • -G

    • -GCodeBlocks - MinGW Makefiles 指MinGW的文件
      • 因为有空格的原因 可以写为: -G "CodeBlocks - MinGW Makefiles"
    • CodeBlocks 是一个IDE, 同理有 CodeLite, Sublime Text 2,Kate, Eclipse CDT4, Ninja,Borland,Visual Studio 等等

使用make编译

make(linux)  or mingw32-make(windows)

windows实例:

在hello源码目录同级建立hello_build文件夹

cd hello_build

用CMake 生成 Makefile

cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_DEPENDS_USE_COMPILER=FALSE -G "CodeBlocks - MinGW Makefiles"  ../hello

make build exe

cmake --build . --target all -- -j 3

or

mingw32-make

linux实例:

在hello源码目录同级建立hello_build文件夹

mkdir hello_build
cd hello_build

用CMake 生成 Makefile

cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_DEPENDS_USE_COMPILER=FALSE -G "CodeBlocks - Unix Makefiles"  ../hello

make build exe

cmake --build . --target all -- -j 3

or

make

CMake和QMake对比

CMAKEQMAKE
支持qt6.0默认qt5.0默认
跨平台okok
导入VS麻烦,每次更新CMake都要重新导入简单,每次更新CMake都要重新导入
导入Clion简单不支持
QTCreatorok, 单要特定格式ok
第三方控件ok没办法

IDE的选择

ToolChainQT Creatorvsclion
CMakecmake/qMakecmake/vs_qmakecmake
编译器vs/MinGWninjavs/MinGW

推荐直接只用QTCreator 新建CMake工程

qt6放弃qmake转向cmake

使用Clion进行开发

打开setting

  • 修改ToolChains 为QT
  • 修改build dicrectory: cmake

使用Visual Studio

vs2019及以上才支持默认采用Ninja

cmake -G "Ninja"  -DCMAKE_BUILD_TYPE:STRING="Debug" -DCMAKE_MAKE_PROGRAM="ninja.exe" ../

cmakelist.txt中添加

修改CMakeSettings.json

      "variables": [
        {
          "name": "Qt5_DIR",
          "value": "C:/Qt/Qt5.12.9/5.12.9/msvc2017_64/lib/cmake/Qt5",
          "type": "PATH"
        },
        {
          "name": "Qt5Core_DIR",
          "value": "C:/Qt/Qt5.12.9/5.12.9/msvc2017_64/lib/cmake/Qt5Core",
          "type": "PATH"
        },
        {
          "name": "Qt5Gui_DIR",
          "value": "C:/Qt/Qt5.12.9/5.12.9/msvc2017_64/lib/cmake/Qt5Gui",
          "type": "PATH"
        },
        {
          "name": "Qt5Widgets_DIR",
          "value": "C:/Qt/Qt5.12.9/5.12.9/msvc2017_64/lib/cmake/Qt5Widgets",
          "type": "PATH"
        },
        {
          "name": "QT_DIR",
          "value": "C:/Qt/Qt5.12.9/5.12.9/msvc2017_64/lib/cmake",
          "type": "PATH"
        }