本专栏是给v子老师带来的树莓派实操上手和学习教程, 正文开始:
本节主要介绍一下树莓派和一些计算机基础知识,让我们能够明白计算机是如何运行的,而不是局限于表面。
树莓派介绍
官网 https://www.raspberrypi.org/
树莓派(Raspberry Pi),是Raspberry Pi基金会开发的一款微型电脑。是为学习计算机编程教育而设计,只有信用卡大小的微型电脑,其系统基于Linux,它是基于Arm架构的芯片为核心的,也就是中间方形的那块芯片,是我们的soc的核心。然后有很多外设(外部设备:比如USB接口,Pin引脚,网线接口等)被集成在这个小板子上,有些板子很庞大就是因为焊接了非常多外部设备。实际上我们说的soc芯片仅仅指的是最中间的那个,也就是下图那个黑色的正方形芯片
自从树莓派问世以来,经历了A型、A+型、B型、B+型、2B型、3B型、3B+型、4B型等型号的演进。2019年6月25日,树莓派基金会宣布树莓派4B版本发布,本篇我们使用的型号是树莓派4B。
简单对比下他们的cpu性能,我们使用的树莓派4B cpu类型是 ARM Cortex-A72,这是arm公司推出的一款四核cpu产品,是基于ARMv8架构设计的。那什么是cpu架构呢:
cpu架构简介
CPU架构(中央处理器架构)指的是中央处理单元(CPU)设计的总体结构和工作原理,包括处理器的指令集、数据通路、控制单元、运算单元、缓存系统等多个方面的设计规范。简而言之,CPU架构定义了一个处理器如何执行程序、如何与内存和其他硬件组件交互,以及它如何管理数据和指令的流动。
简而言之,CPU内部也是一堆复杂的电路元器件组成的,cpu架构就是对它的一种电路设计,合理的设计能让它性能更好,功耗更低。目前最主流的三种架构分别是来自于ARM公司推出的arm架构:v1到v9等等,我们树莓派用的就是arm v8架构的处理器(cpu),arm架构被广泛的应用在嵌入式芯片上。还有就是英特尔和AMD等公司推出的x86架构,最常见的就是x86 64架构的处理器,也就是我们PC电脑上最常用的CPU架构。以及RISC V架构,这是一款开源设计的架构。
处理器制造商会根据这些架构来制作cpu,比如刚才我们说的ARM Cortex-A72,这是arm公司推出的一款四核cpu产品(就是四块cpu核心。种类分为A核、M核和R核 一般都是A核 即通用处理器核心 了解区别即可)。还有你电脑上用的Intel i5,i7等等就是英特尔公司的产品。它们又分为了64位和32位的区别,比如你电脑上用的x86 64 架构的i5处理器,就是一款64位的处理器。比较老的处理器,可能是32位的,比如常说的西门子的某些老款PLC,就是ARM Cortex-M架构的,是M核类型的32位芯片。
处理器位数
那么这个64位和32位是啥意思呢:指的是处理器一次能处理的数据宽度的位数,1字节(Byte)=8位(bits),1MB = 1024 Byte, 1GB = 1024MB
32位:指处理器一次可以处理32位(即4字节)的数据。32位系统的寻址空间是4GB,这意味着操作系统和应用程序最大可以访问4GB的内存。
64位:指处理器一次可以处理64位(即8字节)的数据。64位系统的寻址空间远远大于32位,理论上可以寻址高达16 exabytes(1 exabyte = 10⁶ terabytes)的内存,但实际应用中通常限制在几TB
那什么是数据宽度呢,这就要提到cpu里面的结构了,cpu里面要传输数据,是有一些总线的(通过高低电位差,用0和1 来表示二进制数据,一个时钟周期内如果这个总线是1【高电平】,cpu拿到了这个信息,也就是传了1位【bits】的数据),cpu分为了数据总线(传数据的)、地址总线(传地址的),控制总线(控制功能的)等等很多总线,我们说的64位和32位的区别就是指的数据总线在一个时钟周期内能传多少数据。比如1ns之内,cpu能处理64位数据和32位数据,那当然是64位的性能更好,因为同样时间内处理了两倍的数据。所以这些设计cpu的公司,基于数据宽度推出了64位指令集和32位指令集,指令也就是cpu执行的命令。cpu不断进行取指、译码、执行也就是我们代码的运行底层过程。
编译原理
我们的代码会被编译器(编译的四个过程:预处理、编译、汇编、链接)最后编译出来一个二进制可执行文件,被加载到内存里,然后被cpu执行。
预处理:就是把头文件(.h)和宏定义展开,去除注释。我们在C/C++编程中,所有include的头文件其实都会被展开到C文件里。
编译:就是把预处理后的C代码先编译成汇编语言。
汇编:再把汇编语言变成一段一段的机器语言。通常一个.c文件就会变成一个对应的.o文件。
链接:把上一步的.o文件给串起来,比如我们可以把多个.c文件编译成一个可执行文件,每个.c文件可以对应不同的功能(但是只能有一个main函数)。我们还能编译出一些库文件,分为静态库和动态库,链接也会把库给一起串起来组成最后的可执行文件(.exe 或者 .bin)
最后既然是编译出来机器码,那么不同的机器(cpu)就应该对应不同的编译器。我们常见的编译器就有gcc(用于x86架构的),arm-gcc(用于arm架构的),arm-clang(也是arm架构的另一款编译器)。编译器其实也是一款软件,但是对于很多开发板来说,我们都是在电脑上写代码然后编译、烧录进开发板再执行的。所以我们常说的交叉编译就是指 在一款架构上编译另一个架构的代码。比如我们在我们的虚拟机ubuntu,这是x86 64架构的PC电脑,我们安装一款arm-gcc来编译一段代码,我们把生成的.exe可执行文件 通过各种方式(ssh传输,甚至u盘传输)到开发板上(比如树莓派),然后在开发板上执行。我们就完成了一次交叉编译和烧录的过程。当然我们也可以在开发板上编译,但是不如我们在电脑上写完就编译方便,并且很多开发板的存储空间有限,可视化条件也不好,最常用的就是我们去搭建交叉编译环境来完成开发。
知识总结
看到这里,你已经基本掌握了《计算机组成原理》《编译原理》《计算机体系结构》等课程的一部分最核心的基础知识,能够了解计算机底层的运行原理和机制,我们的代码是如何运行的。在未来的秋招中,这也是重要的基础知识考察部分,包括这里没介绍到的(缓存机制、IO机制、存储原理)以及《操作系统》、《计算机网络》等课程知识。很多理论知识在学习的过程中可能会晦涩难懂,最重要的是能在实践中得到理解,即便是最简单的理解。