集成电路发展史
指令集的发展
芯片的本质是二极管, 为了在芯片上跑程序, 出现了指令集(ISA)这个东西.
指令集分两大流派: 复杂指令集(CISC)精简指令集(RISC)
| 指令集ISA | 优点 | 缺点 |
|---|---|---|
| 复杂指令集CISC(Complex Instruction Set Computing) | 一条指令中完成更多的工作, 最大限度榨干硬件 | 日趋庞杂的指令芯片不但不易实现,而且还可能降低系统性能 |
| 精简指令集RISC(Reduced Instruction Set Computer) | 芯片容易实现 | 多条指令才能完成一个任务, 造成硬件的浪费 |
比较主流的指令集
- CISC 发展出了
- X86
- 8051
- RISC百花齐放,
- ARM(Acorn RISC Machine)
- MIPS(Microprocessor without interlocked pipelined stages 无内部互锁流水级的微处理器)
- RISC-V(开源BSD)
- AVR
- PIC
- PowerPC
- 还有一些专门针对某些运算出来的指令集, 这些并不能用上面两个标准区分如:
- DSP
- FPGA
- EPSXX
为什么有这么多ISA?
X86和ARM指令集的实现方式都是闭源的
x86架构由于授权问题只有几家可以生产,包括现在的Intel、AMD
- ARM公司本身并不靠自有的设计来制造或出售CPU,而是将处理器架构授权给有兴趣的厂家。
- 如苹果M1,M2.海思部分麒麟处理器就是采用这种方式生产出来的。
- x86是占了先手的, ARM1983年才开始设计,但是授权方式的原因ARM也抢了很多市场.
- 从2020年英伟达强势宣布将以400亿美元的价格收购英国ARM公司的事件,可以看出, ARM这种不生成CPU的方式并没有X86这种和intel牢牢绑定的方式赚钱.
- 一旦英伟达收购ARM,很难说新的授权方式,因此包括苹果,华为等都开始威胁要拥抱RISC-V
如今,复杂指令集和精简指令集界限日渐模糊, 都在吸取别人的优点.在性能和易实现之间做权衡
X86和ARM的优劣势
X86结构的电脑采用“桥”的方式与扩展设备(如:硬盘、内存等)进行连接,而且x86结构的电脑出现了近30年,其配套扩展的设备种类多、价格也比较便宜,所以x86结构的电脑能很容易进行性能扩展,如增加内存、硬盘等。
ARM结构的电脑是通过专用的数据接口使CPU与数据存储设备进行连接,所以ARM的存储、内存等性能扩展难以进行(一般在产品设计时已经定好其内存及数据存储的容量),所以采用ARM结构的系统,一般不考虑扩展。基本奉行“够用就好”的原则。这就是为什么现在苹果电脑不留出多个硬盘/内存接口的原因之一.
指令集之间是可以转换的
同时还可以软件兼容, M1跑intel芯片的程序, M1不能识别x86的指令苹果就开发了一个叫做Rosetta 2 的转译机制,把x86的复杂指令翻译成ARM的精简指令, 显然这中间必定有效率的问题.
指令集(ISA)与架构与芯片之间的关系
什么是架构
比如我们常说的计算机处理器有486、Ivy Bridge、Pentium M……这就是架构的不同(但其都从属于x86架构)
ARMv1~ARMv8到STM32这些名称都属于ARM架构
麒麟支持哪些CPU?
麒麟操作系统能全面支持飞腾、龙芯、兆芯、申威、海光、鲲鹏六款主流国产CPU
| CPU | 架构 | |
|---|---|---|
| 飞腾 | ARM | |
| 龙芯 | LoongArch/MIPS64 | |
| 兆芯 | X86 | |
| 用于超级计算机 | ||
| 海光 | 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++的主要区别:
- 对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(cpp的语法规则比c的更强一些);
- 对于 .c和.cpp文件,g++则统一当做cpp文件编译。
- 对于windwos平台, 有2个方案: vs 和 MinGW
- 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_buildqmake生成cmake的文件
qmake ../hello/hello.pro生成exe
使用mingw32-make
release:
mingw32-makedebug:
mingw32-make -f Makefile.DebugUbuntu
目前都是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 -j4CMake 跨平台编译
编译流程
用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" ../hellomake build exe
cmake --build . --target all -- -j 3or
mingw32-makelinux实例:
在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" ../hellomake build exe
cmake --build . --target all -- -j 3or
makeCMake和QMake对比
| CMAKE | QMAKE | |
|---|---|---|
| 支持 | qt6.0默认 | qt5.0默认 |
| 跨平台 | ok | ok |
| 导入VS | 麻烦,每次更新CMake都要重新导入 | 简单,每次更新CMake都要重新导入 |
| 导入Clion | 简单 | 不支持 |
| QTCreator | ok, 单要特定格式 | ok |
| 第三方控件 | ok | 没办法 |
IDE的选择
| ToolChain | QT Creator | vs | clion |
|---|---|---|---|
| CMake | cmake/qMake | cmake/vs_qmake | cmake |
| 编译器 | vs/MinGW | ninja | vs/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"
}