嵌入式—单片机基础专栏
1.单片机基础组成?什么是单片机?
单片机(Microcontroller Unit, MCU)是一种集成电路芯片,它包含了中央处理器(CPU)、存储器(ROM和RAM)、输入/输出接口(I/O)等基本功能单元,并集成在同一块硅片上。单片机的基本组成包括:
1.中央处理器(CPU)负责执行程序指令,进行数据运算和逻辑控制。常见的CPU架构有8位、16位和32位。
2.存储器包括:
- 只读存储器(ROM)用于存储固定的程序和数据。
- 随机存取存储器(RAM)用于存储运行时的临时数据。
- 有些单片机还集成了可擦除可编程只读存储器(EEPROM)或闪存(Flash)用于存储可更新的程序和数据。
3.输入/输出接口(I/O)用于与外部设备进行信号交互,如开关、传感器、执行机构等。
4.定时器/计数器用于产生定时脉冲或计数外部事件,实现时间控制功能。
5.中断控制器用于管理各种中断源,提高系统的实时响应能力。
6.通信接口如串行接口(UART)、SPI、I2C等,用于与外部设备进行数据通信。
2.MCU、SOC、FPGA、DSP,都是什么?
1.MCU (Microcontroller Unit) - 单片机
- MCU就是单片机不多做解释。
2.SOC (System-on-Chip) - 系统级芯片SOC
- 是一种高度集成的芯片,将多种功能模块集成在一个芯片上,形成一个完整的系统。
- 典型的 SOC 包括 CPU、GPU、内存、通信模块、传感器接口等,可以集成数十到上百个功能模块
- SOC 可以为复杂的电子产品提供全面的解决方案,大大简化了系统设计和制造。
我再来总结下,低端的SOC本质是MCU内核,只是在51/ARM内核基础上增加了特定功能外设模块重新封了一款芯片。如果用MCU去完成一些特定功能,比如说蓝牙协议,Zigbee协议,电量计量等等会比较麻烦,研发周期长,稳定性差,成本也更高。
3.FPGA (Field Programmable Gate Array) - 现场可编程门阵列
FPGA 的全称为 Field-Programmable Gate Array,即现场可编程门阵列。 FPGA 是在 PAL、 GAL、 CPLD 等可编程器件的基础上进一步发展的产物, 是作为专用集成电路( ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。 简而言之, FPGA 就是一个可以通过编程来改变内部结构的芯片。
1.FPGA 功能实现:
需要通过编程即设计硬件描述语言,经过 EDA 工具编译、综合、布局布线成后转换为可烧录的文件,最终加载到 FPGA 器件中去,改变 FPGA 内部的连线,最终完成所实现的功能。
2.FPGA 性能对比:
FPGA 相比于单片机、 CPU 等集成电路芯片拥有效率更高、功耗更低的特点,但是易于开发程度远远不如单片机、 CPU; 在数字芯片设计领域, FPGA 虽然相比 ASIC 具有更短的开发周期与开发难度, 但是其存在着成本过高、性能较差并且在资源的利用率上远不及 ASIC 等问题,不能真正的替代 ASIC。
4.DSP (Digital Signal Processor) - 数字信号处理器DSP
DSP(digital signal processor)是一种独特的微处理器,是以数字信号来处理大量信息的器件。其工作原理是接收模拟信号,转换为0或1的数字信号。再对数字信号进行修改、删除、强化,并在其他系统芯片中把数字数据解译回模拟数据或实际环境格式。它不仅具有可编程性,而且其实时运行速度可达每秒数以千万条复杂指令程序,远远超过通用微处理器,是数字化电子世界中日益重要的电脑芯片。它的强大数据处理能力和高运行速度,是最值得称道的两大特色。
优点:
- 高性能计算能力DSP 采用专门的硬件架构,如乘法累加器、寄存器文件等,能够高效地执行数学运算密集型的信号处理算法。相比通用 CPU,DSP 在执行滤波、变换、编解码等信号处理任务时具有显著的性能优势。
- 低功耗DSP 的硬件架构针对信号处理进行了优化,在执行相同任务时,功耗通常低于通用 CPU。这使得 DSP 非常适用于电池供电的便携式设备,如手机、MP3 播放器等。
- 实时性强DSP 擅长处理连续的实时数据流,能够满足音频、视频等实时信号处理的要求。相比通用 CPU,DSP 具有更好的实时性和确定性。
- 广泛应用DSP 广泛应用于音频、视频、通信、雷达等领域,是信号处理领域不可或缺的核心组件。
缺点:
- 编程复杂度高DSP 的硬件架构和指令集与通用 CPU 有较大差异,编程和调试较为复杂,需要专业的知识和经验。
- 功能专一DSP 主要针对信号处理任务进行优化,在执行通用计算任务时,性能可能不如通用 CPU。
- 成本相对较高由于 DSP 的专用硬件架构和定制化设计,其成本通常高于通用 CPU。
DSP与MCU的区别
芯片 |
结构 |
成本 |
运算能力 |
DSP |
哈佛结构 |
价格昂贵 |
高 |
MCU |
冯诺依曼结构 |
价格低廉 |
低 |
DSP采用的是哈佛结构,数据空间和存储空间是分开的,通过独立的数据总线在程序空间和数据空间同时访问。而MCU采用的是冯诺依曼结构,数据空间和存储空间共用一个存储器空间,通过一组总线连接到CPU。在对性能要求不是很高的情况下,MCU还是很具有优势的。
DSP与ARM的区别
ARM是Advanced RISC(精简指令集) Machines 的缩写,是面向低预算市场的RICS微处理器。ARM有比较强的事务管理能力,适合于用来跑跑界面、操作系统,优势体现在控制方面。
DSP与FPGA的区别
FPGA是Field Programmable Gate Array(现场可编程门阵列)的缩写,是在PAL、GAL、PLD等可编程器件的基础上进一步发展的产物,是专用集成电路中集成度最高的一种。具有静态可重复编程和动态在系统在系统中重构的特性,使得硬件的功能可以像软件一样通过编程修改。
3.单片机的程序在哪里存储?
在描述单片机程序时,需要区分"运行时"和"非运行时"
非运行时的单片机程序在ROM内的分布
下图就是通过单片机下载工具烧录到单片机Flash里面去之后的Flash空间区域分布图:
其中:
Code:为程序代码部分
Ro-data: 表示程序定义的常量(const修饰的常量、#define 宏定义等);
Rw-data: 表示已初始化的全局变量
Zi-data: 表示未初始化的全局变量(Zi-data可以表示RAM未上电时整个区域的状态,或者上电初始化之后未被使用的区域,上表仅仅描述的是ROM区域的空间分布)
而栈区(stack)、堆区(heap)、全局区(静态区)(static)、文字常量区和程序代码区和上面所介绍的Code、Ro-data等的关系。
1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 这些值是可读写的,那么stack应该被包含在RW-data(读写数据存储区),也就是单片机的sram中。
2、堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。可以理解,这些也是被包含在单片机的sram中的。
3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。这些数据也是可读可写的,和stack、heap一样,被包含在RAM中。
4、文字常量区:常量字符串就是放在这里的。这些数据是只读的,分配在Ro-data(只读数据存储区),则被包含在flash中。
5、程序代码区:存放函数体的二进制代码,可以想象也是被包含在flash,因为对于MCU来说,当其重新上电,代码还会继续运行,并不会消失,所以存储在flash中。
下图是初始化之前的ROM和RAM中的数据分布:
1、未初始化之前的RAM里面所有区域都是随机的值即:Zi-data
运行时的单片机程序在RAM内的分布
下图是初始化之后的ROM和RAM中的数据分布:
1、初始化的时候会由Boot程序(进入main函数之前)拷贝Flash里面的Rw-data区域到RAM
下图是初始化之后正常运行时,单片机内ROM和RAM区域分布图:
- 上电初始化之后Flash的Rw-data就不会再使用了,除非重新上电、复位了boot才会重新从ROM(Flash)中拷贝Rw-data区域到RAM中去。
- 运行时,根据上一节对哈佛模型的描述(51内核、Cortex-M3、Cortex-M4是哈佛模型),程序存储区对应ROM(Flash)数据存储区对应RAM,如此这般两个区域就是物理上的分开的–经典的哈佛模型。
4.单片机程序的BIN文件和HEX文件的区别?
单片机程序的BIN文件和HEX文件的区别
- Bin文件是存放在Flash上的文件
- HEX文件,需要将Bin文件转为Hex文件是一种文件中有地址的文件,其目的是便于单片机烧录工具按照文件中地址进行烧录
运行时:单片机程序运行起来以后,代码是在ROM(Nor Flash)上面跑的,数据是在RAM上面的,描述的就是ROM和RAM两个层面。
非运行时:单片机程序没有运行时(没有上电),针对的描述是单片机程序(bin)文件在ROM(Flash)上的分布
注意,如果使用Flash读取工具从单片机的Flash上完整读出来的文件可能是bin文件但绝对不是hex文件!
5.ROM和RAM都有哪些常见的?
ROM 类型:
ROM |
Read-Only Memory |
只读存储器,内容出厂时固化,不可修改 |
PROM |
Programmable ROM |
可编程只读存储器,一次性可编程,内容不可擦除 |
EPROM |
Erasable Programmable ROM |
可擦除可编程只读存储器,可通过紫外线擦除内容后重新编程 |
EEPROM |
Electrically Erasable Programmable ROM |
电可擦除可编程只读存储器,可电子擦除内容后重新编程 |
Flash |
- |
闪存,一种可电子擦除和编程的非易失性存储器,既可作为 ROM 使用,也可作为 RAM 使用 |
RAM 类型:
RAM |
Random Access Memory |
随机存取存储器,可读写,断电后内容丢失(易失性) |
SRAM |
Static RAM |
静态随机存取存储器,通过锁存电路保持数据,速度快但功耗高 |
DRAM |
Dynamic RAM |
动态随机存取存储器,通过电容存储数据,速度较慢但功耗低 |
6.操作系统和单片机的内存分布对比?
由于单片机应用领域是极端成本为导向的,单片机和操作系统的所处环境不同 RAM和ROM的使用方式也不同。
类型 |
操作系统应用程序 |
单片机程序 |
代码 |
RAM |
ROM(支持XIP的Nor Flash) |
数据 |
RAM |
RAM(SRAM) |
总结来说就是,单片机的代码是在ROM即支持XIP的Nor Flash上面跑,数据是在RAM上面的,而操作系统应用程序的代码、数据是完全加载到RAM里面运行的(这里不考虑分页、虚拟内存)
操作系统应用程序 |
描述 |
对应单片机程序 |
BSS段–.bss |
未初始化的全局变量、静态变量,一旦初始化就回收,并转存到数据段之中 |
Zi-data |
代码段–.code |
代码,程序结束的时候系统会自动回收存储在代码段中的数据,内存区域较小 |
Code |
数据段–.data |
已经初始化的全局变量、静态变量,直到程序结束的时候才会被回收 |
Rw-data (global/static) |
堆–.heap |
动态分配内存,alloc出来的对象,需要程序员进行内存管理 |
Rw-data (heap) |
栈–.stack |
局部变量,自动分配内存,当局部变量的作用域执行完毕之后就会被系统立即回收 |
Rw-data (stack) |
书写不易留个小花吧!!
#牛客在线求职答疑中心##面经##面试#本人2022年毕业于山东大学,目前就职intel。打算把之前校招时做的笔记通过专栏发出来,本专栏适合于C/C++、嵌入式方向就业的同学,本篇面经总结数千篇面经的知识集合,实时更新全网最新的嵌入式/C++最新内容,囊括了C语言、C++、操作系统、计算机网络、嵌入式、算法与数据结构、数据库等一系列知识点,在我看来这些是求职者在面试中必须掌握的知识点。最后呢祝各位能找到自己合适的工作。