计算机基础
文章目录
1. 前言
当今计算机技术的快速发展和广泛应用已经深刻地改变了我们的生活方式和工作方式。作为一名计算机基础知识的学习者,了解计算机基础知识是非常重要的。本博客将为您介绍计算机基础的一些核心概念和重要原理,帮助您建立起对计算机领域的基础了解。不论您是计算机专业的学生,还是对计算机技术感兴趣的非专业人士,本博客都将为您提供有价值的信息和知识。希望通过阅读本博客,您能够建立起对计算机基础知识的扎实理解,从而为以后的深入学习和实践打下坚实的基础
2. 计算机的物理组成
我们知道,计算机的任务就是帮我们解决需求,解决需求的思路就是:输入需求——解决需求。比如我们玩游戏,按下一个按键,人物就会执行一个动作。计算机的组成是由电路逻辑门组成,逻辑门电路有三个基本的门电路:与门、或门、非门。总所周知,世界上的一切事物都是有逻辑的,那么有逻辑的东西必然可以用有逻辑的电路(逻辑门)去表示。如下图所示:
在此图中,我们有输入X0、X1,有输出Y0,他们的对应关系如左下角所示。这就是与门,那么他有什么用呢?
- 用来表示事情:播放音乐,现在X0和X1相当于声音和播放,如果我门只给声音不播放,或者只给播放不给声音,这件事情无法完成
- 用来表示物体:一个瓶子,现在X0和X1相当于瓶盖和瓶身,如果我们只给瓶盖或者只给瓶身,都不能构成完整的瓶子
- 用来表示数学:二进制,现在我们X0和X1表示二进制的第一位和第二位,那么这个电路,会帮我们识别出数字二进制为00的数字,只有输出00才会给我们5V
综上来看,我们知道,逻辑门可以表示我们身边的一切事物,更复杂的事情,可以由更复杂的逻辑门组成。那么我们看到,我们输入了X0和X1,这个电路(或者你可以叫做计算机了)会帮我们计算出结果。但是我们输入的这个X0和X1用了开关来表示确实很不优雅,我们可以用1代表关,0代表开。所以现在我们可以说:计算机就是由电路构成,这个电路会根据我们的输入计算出结果返回
3. 计算机系统结构
3.1 冯诺依曼结构
什么是计算机系统结构呢?在上述计算机(电路)中,我们只生成了一个可以帮我们计算出结果的电路,那么我们还需要设计输入的电路、存储电路、输出的电路(比如用一个小灯表示输出)等。那么就引出了计算机系统结构了,如下图所示:
3.2 MCU结构
MCU架构就是计算机系统结构,在MCU种,我们可以看到有两个主流的结构,冯·诺依曼结构和哈弗结构,对于MCU,通常用的是哈弗结构。他们的区别如下:
- 冯诺依曼结构数据和程序合并存储
- 哈佛结构是一种将程序指令存储和数据存储分开的存储器结构
3.2.1 MCU的冯诺依曼结构
3.2.2 MCU的哈弗结构
哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,如下图所示。中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度,如Microchip公司的PIC16芯片的程序指令是14位宽度,而数据是8位宽度
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
3.2.3 以M3为内核的STM32结构
-
前要知识1:每个芯片的启动都有一个启动文件,也叫bootloader。以STM32为例,bootloader是处在芯片启动的0x 0000 0000处,也就是启动的第一个程序,.s文件。STM32的启动位置由BOOT引脚决定。
-
前要知识2:我们知道电脑分为内存和外存两种存储地方,而和CPU进行数据交换的是内存。所以启动文件要做的事情就是把外存(FLASH、ROM)的文件放入内存(RAM、DDR)中。但是哈弗结构和冯诺依曼结构不同,哈弗结构把数据和程序分开存放。
-
STM32-M3系统框架
-
由STM32-M3系统框架我们可以看出,他只有一个SRAM,而哈弗结构是把程序和数据放入不同的RAM里,SRAM肯定是我们的数据了,那FLASH肯定是我们程序了,我们把它放到SRAM不就把程序和数据都放在RAM里面了吗?这显然是不符合的。这是因为在STM32-M3中,频率不是特别快,追求速度也不是很快,放在FLASH里读取程序完全没问题,把他看成SRAM就行(它还可以进行编址)。
- 由上面两个图,我们可以看到满足哈弗结构,但是为什么数据总线可以复用呢?主要是因为CPU读指令从FLASH读出,得到一个SRAM的地址,可以直接通过数据总线Dcode传入总线矩阵,再传入SRAM,得到数据,相当于FLASH即是外存也是内存。
3.3 存储器:RAM、SRAM、DRAM、SDRAM、SSRAM、ROM、EEPROM、FLASH
请看知识点 4
4. 计算机语言
什么是计算机语言呢?通过计算机的物理组成,我们知道,输入1或者0就是一个简单的计算机语言,那么如果我们输入有8位,或者更多的时候,1010111100011000111……看起来实在头疼,现在的计算机已经发展到64位了,如果我们想用64位来表示一件事情,一共有上亿种可能,我们需要某种操作的时候还要自己操作64次显然不合道理,那么这时候计算机语言就来了。我们用"add"、“sum”这些词去表示显然更符合逻辑。
- 汇编:初代语言,用add之类的简单语法去表示
- 高级语言:用+之类的更直白的方式去表达
4.1 C语言
4.1.1 编译器
刚才我们说了高级语言和汇编语言,那么这些语言如何转化为机器能识别的机器语言呢?这就需要编译器(也可以理解翻译器)。以C语言为例子,目前C语言主流的编译器有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C
5.1 编译过程
- 预处理阶段。预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。比如hello.c中第一行的#include<stdio.h>命令告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中,结果就得到了另一个C程序,通常是以.i作为文件扩展名。
- 编译阶段。编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式确切的描述了一条低级机器语言指令。
- 汇编阶段。汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种可重定位目标程序的格式,并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,它的字节编码是机器语言指令而不是字符,如果我们在文本文件中打开hello.o文件,看到的将是一堆乱码。
- 链接阶段。链接器(ld)负责处理合并目标代码(包括源文件、库文件合启动代码(IDE的启动代码就是给你配好一些线程给你使用一些资源,但是在嵌入式或者单片机需要自己配置启动文件)),生成一个可执行目标文件,可以被加载到内存中,由系统执行(不同系统连接出的可执行文件不同,.exe .sun等)
4.1 Python
Python不需要编译器,他是解释型的代码,他需要运行一个Python解释器,这个解释器是运行在操作系统之上的,所以Python的代码执行效率很低
5. 计算机操作系统
6. 计算机一些相关概念
指令
操作码和地址码组成
指令集
一堆指令的集合,如:x86指令集、arm指令集……架构是硬件结构,X86指令集是为X86架构只能在X86架构破译的指令
机器语言
机器语言指的是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合;比如一串二进制代码:01010001101,电脑识别为把存储器上的数据a放到运算器的这样的指令:010(把下面的地址上的数放到运算器)+10001101(地址码)
汇编语言
因为机器语言很难去记忆,面对0101的代码,人们也头晕眼花,所以用助记符来帮助记忆。MOV AL,[2000H];将2000H地址上传送到AL运算器(寄存器)
C语言
对于1+2这样的操作,汇编要先把1放到运算器,再把2放到运算器,再计算……过程繁杂。所以又有了C语言,不用我们用汇编写出那么多的步鄹,就直接写1+2,就自动帮我们完成很多功能
内核、架构、指令集
- 内核、架构、指令集这三个概念可以这样理解:ARM公司生产了一个Cortex-M3内核,他是基于ARM架构的内核,它需要ARM指令集才能正常使用。
- 架构:ARM架构、X86架构、MPIS架构、AVR架构
- 指令集:ARM指令集、X86指令集、MPIS指令集、8051指令集、AVR指令集等
CPU、MCU、MPU、DSP、FPGA和SOC
- CPU,CPU是一个专门用于运算的芯片,也可以叫内核,或者IP。常见的有Cortex-M3,AMD 3600等
- MCU,微控制单元,又叫微型计算机,他内部集成了各种RAM、ROM和IIC等外设,它的内核本质上就是CPU。
- MPU,微处理单元,是把很多CPU集成一起并行处理数据的芯片。MCU 集成了 RAM,ROM 等设备;MPU 则不集成这些设备,是高度集成的通用结构的中央处理器矩阵,也可以认为是去除了集成外设的 MCU。
- DSP,数字信号处理,DSP是用数值计算的方式对信号进行加工的理论和技术。另外DSP也是数字信号处理器的简称,它是集成专用计算机的一种芯片(专有名词)。
- FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
- SOC(System on Chip),指的是片上系统,MCU只是芯片级的芯片,而SOC是系统级的芯片,它既像MCU(51,avr)那样有内置RAM、ROM同时又像MPU那样强大。比MCU功能复杂,且集成了许多专用的复杂的功能IP(比如麒麟980不止有ARM的内核还有图像处理单元内核等),使得SOC不仅具备了通用MCU的功能,还能用于某些专用的领域。
地址
地址都是提前编号的,在STM32中,由ST编号的,然后发送0x80,译码器就会指向那个空间。外扩的存储器怎么寻址呢?主要是通过FSMC管理的,比如他管理0x90-0xff,那么它接收MCU地址后,他会有一个存储器和FSMC的协议去通信。比如FSMC收到0X90的MCU地址,会转为包头+地址+页地址的方式去寻址
STM32 bootloader和启动文件
- STM32的启动文件是.s文件
1)分配栈的大小 (编译器)
2)分配堆的大小 (编译器)
3)初始化中断向量表
DCD:分配一个或者多个以字为单位的内存,以四字节对齐,并
要求初始化这些内存。在向量表中,DCD 分配了一堆内存,并且
以ESR 的入口地址初始化它们。(编译器)
4)执行复位中断 (CPU)
系统初始化(在这里初始化系统时钟)
跳转至main()函数
-
bootloader引导程序
当我们引脚选择串口下载时,bootloader引导程序就会启动引导串口下载。但我们选择SW下载时,引导程序就会检测引脚选择SW模式下载和开始 -
由boot引脚选择下载程序后,下到FLASH的空间如下
-
我们可以看到STM32上电后
第一步:PC寄存器=0x00000000,得到栈顶指针存到SP寄存器里面(每次使用到栈,SP值就发生改变,比如函数运行到定一个变量i那么就会改变)。
第二步:PC=0x00000004,这时指向代码区的RES函数,然后开始执行RES函数。
第三步:编译器帮我们编译好函数、变量存放在代码区里,当R0=SystemInit,其实SystemInit是一个值,R0=0x00580041(如),然后就会跳到SystemInit函数执行 -
误知:编译器编译的代码按顺序排放
。
第三步:编译器帮我们编译好函数、变量存放在代码区里,当R0=SystemInit,其实SystemInit是一个值,R0=0x00580041(如),然后就会跳到SystemInit函数执行 -
误知:编译器编译的代码按顺序排放