单片机常见面试题
- 1.请说明总线接口UART、I2C、SPI、USB的异同点(串/并、速度、全/半双工、总线拓扑等)⭐⭐⭐⭐⭐
- 2.I2C时序图
- 3.CPU内部结构⭐⭐⭐⭐
- 4.波特率是什么,为什么双方波特率要相同,高低波特率有什么区别
- 5.IO口工作方式:上拉输入 下拉输入 推挽输出 开漏输出
- 6.扇区 块 页 簇的概念
- 7.CPU 内存 虚拟内存 磁盘/硬盘 的关系⭐⭐⭐
- 8.ROM RAM的概念浅析
- 9.ARM结构处理器简析 ⭐⭐
- 10.arm和dsp有什么区别
- 11. 简述处理器在读内存的过程中,CPU核、cache、MMU如何协同工作?画出CPU核、cache、MMU、内存之间的关系示意图加以说明
- 交叉编译
- 生产消费者模型
- 实时系统和非实时系统
1.请说明总线接口UART、I2C、SPI、USB的异同点(串/并、速度、全/半双工、总线拓扑等)⭐⭐⭐⭐⭐
总线比较
UART:通用异步串行口,速率不快,可全双工,结构上一般由波特率产生器、UART发送器、UART接收器组成,硬件上两线,一收一发;
I2C:双向、两线、串行、多主控接口标准。速率不快,半双工,同步接口,具有总线仲裁机制,非常适合器件间近距离经常性数据通信,可实现设备组网;
SPI:高速同步串行口,高速,可全双工,收发独立,同步接口,可实现多个SPI设备互联,硬件3~4线;
USB:通用串行总线,高速,半双工,由主机、hub、设备组成。设备可以与下级hub相连构成星型结构。
2.I2C时序图
3.CPU内部结构⭐⭐⭐⭐
诺依曼结构中计算机硬件系统由运算器、控制器、存储器、输入设备、输出设备5个硬件系统构成。
转载
4.波特率是什么,为什么双方波特率要相同,高低波特率有什么区别
转载
波特率是每秒钟可以传送的二进制位数,其单位为bps(bits per second)也写作bits/s。它是衡量串行数据速度快慢的重要指标。
波特率相当于通讯的采样率 这样的比方可能你会理解的容易一些就是2个玩杂耍的人面对面丢瓶子那样 2个人必须保持一样的速度
对于通信系统来说,
(1)可靠性跟有效性是一对矛盾。有效性指信息的速率快慢问题,可靠性是指信息的质量好坏问题。
(2)提高可靠性的同时是以 牺牲有效性为代价的.
(3)提高有效性的同时也会牺牲可靠性的。
这里波特率就是有效性的一个指标,提高波特率就是提高信息的传输速率,也就是说信息的传输更快(波特率定义为单位时间内传输的码元个数)。误码率为可靠性指标。
在实际中,常常采取折中办法,即在满足一定可靠性指标下,尽量提高消息的传输速率,即有效性;或者在维持一定有效性的条件下,尽可能提高系统的可靠性。
综上所述,波特率的高低都未必是件坏事也未必是好事!
5.IO口工作方式:上拉输入 下拉输入 推挽输出 开漏输出
转载
1、上拉输入:上拉就是把电位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!弱强只是上拉电阻的阻值不同,没有什么严格区分。
2、下拉输入:就是把电压拉低,拉到GND。与上拉原理相似。
3、推挽输出:可以输出高,低电平,连接数字器件; 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源决定。
4、开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。
6.扇区 块 页 簇的概念
转载
物理层面:一个磁盘按层次分为 :
磁盘组合 -> 单个磁盘 -> 某一盘面 (platter)-> 某一磁道 (track)-> 某一扇区(sector)。
逻辑层面:磁盘块(虚拟出来的)。操作系统与磁盘之间交流的最小单位就是磁盘块,它是一个虚拟的概念。是对于操作系统(软件)来说有意义的概念。如:文件的物理存储都是以磁盘块为单位的。
通俗的来讲,在Windows下如NTFS等文件系统中叫做簇;在Linux下如Ext4等文件系统中叫做块(block)。每个簇或者块可以包括2、4、8、16、32、64…2的n次方个扇区。
操作系统经常与内存和硬盘这两种存储设备进行通信,类似于“块”的概念,都需要一种虚拟的基本单位。所以,与内存操作,是虚拟一个页的概念来作为最小单位。与硬盘打交道,就是以块为最小单位。
7.CPU 内存 虚拟内存 磁盘/硬盘 的关系⭐⭐⭐
转载
1、CPU
CPU即中央处理器,是英语“Central Processing Unit”的缩写。CPU从内存或缓存中取出指令,放入指令寄存器,并对指令译码分解成一系列的微操作,然后发出各种控制命令,执行微操作系列,从而完成一条指令的执行。
2、内存
CPU并不能直接调用存储在硬盘上的系统、程序和数据,必须首先将硬盘的有关内容存储在内存中,这样才能被CPU读取运行。因而,内存(即物理内存,是相对于硬盘这个“外存”而言)作为硬盘和CPU的“中转站”,对电脑运行速度有较大影响。
3、虚拟内存
当运行数据超出物理内存容纳限度的时候,部分数据就会自行“溢出”,这时系统就会将硬盘上的部分空间模拟成内存——虚拟内存,并将暂时不运行的程序或不使用的数据存放到这部分空间之中,等待需要的时候方便及时调用。
4、硬盘(外存储器)
由于内存是带电存储的(一旦断电数据就会消失),而且容量有限,所以要长时间储存程序或数据就需要使用硬盘(外存储器)。硬盘也会影响系统速度,因为系统从硬盘中读取数据并通过总线存入内存的速度也会影响系统运行的快慢。
至于有的网络文章形象比喻:“CPU是工厂,硬盘是大仓库,内存是正规中转中心,虚拟内存是临时中转中心”,大致接近实际,但不完全准确。
8.ROM RAM的概念浅析
转载
随机存取存储器(Random Access Memory,RAM)又称作“随机存储器”,是与CPU直接交换数据的内部存储器,也叫主存(内存)。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。当电源关闭时RAM不能保留数据。如果需要保存数据,就必须把它们写入一个长期的存储设备中(例如硬盘)。RAM和ROM相比,两者的最大区别是RAM在断电以后保存在上面的数据会自动消失,而ROM不会自动消失,可以长时间断电保存。
只读存储器(Read Only Memory,ROM)。ROM所存数据,一般是装入整机前事先写好的,整机工作过程中只能读出,而不像随机存储器那样能快速地、方便地加以改写。ROM所存数据稳定,断电后所存数据也不会改变;
一般来说会比较难以理解RAM与ROM和平时所说的运行内存和硬盘容量有什么关系,其实从一般意义上来说是一样的,但从计算机和手机的角度来说又有一些区别。
从电脑来说一般比较好理解,RAM就是我们平时所说的运行内存,它的确是随时可读写的。因为CPU处理的数据都是以运行内存为中介的。断电后信息是不保存的。那么对于ROM来说,是不是就是硬盘呢?不是说ROM只可以读吗?硬盘却是可以修改的。的确,必须明确一点,RAM与ROM都是内存,而硬盘是外存,所以ROM不等于硬盘。计算机中的ROM主要是用来存储一些系统信息,或者启动程序BIOS程序,这些都是非常重要的,只可以读一般不能修改,断电也不会消失。
那么对于手机来说呢?其实很多困惑都来自于手机厂商的宣传信息的误导。因为一般手机厂商都会说有多少G的RAM,多少G的ROM;在手机里面,RAM就是跟电脑一样的运行内存一样;而ROM就不一样了,你想想看,如果只用来存储一些系统信息和开机引导程序,需要几个G的容量?其实手机的ROM就跟硬盘挂上钩了,手机中的ROM有一部分用来存储系统信息,还有一些装机软件,剩余的大部分容量都是就是拿来作为硬盘用的,可读可写。
9.ARM结构处理器简析 ⭐⭐
10.arm和dsp有什么区别
转载
ARM具有比较强的事务管理功能,可以用来跑界面以及应用程序等,其优势主要体现在控制方面,它的速度和数据处理能力一般,但是外围接口比较丰富,标准化和通用性做的很好,而且在功耗等方面做得也比较好,所以适合用在一些消费电子品方面;
而DSP主要是用来计算的,比如进行加密解密、调制解调等,优势是强大的数据处理能力和较高的运行速度。由于其在控制算法等方面很擅长,所以适合用在对控制要求比较高的场合,比如军用导航、电机伺服驱动等方面。
如果只是着眼于嵌入式应用的话,嵌入式CPU和DSP的区别应该只在于一个偏重控制一个偏重运算了。
11. 简述处理器在读内存的过程中,CPU核、cache、MMU如何协同工作?画出CPU核、cache、MMU、内存之间的关系示意图加以说明
现代操作系统普遍采用虚拟内存管理机制,这需要MMU(Memory Management Unit,内存管理单元)的支持。有些嵌入式处理器没有MMU,则不能运行依赖于虚拟内存管理的操作系统。
操作系统可以分成两类,用MMU的、不用MMU的。用MMU的是:Windows、MacOS、Linux、Android;不用MMU的是:FreeRTOS、VxWorks、UCOS……与此相对应的:CPU也可以分成两类,带MMU的、不带MMU的。带MMU的是:Cortex-A系列、ARM9、ARM11系列;不带MMU的是:Cortex-M系列……(STM32是M系列,没有MMU,不能运行Linux,只能运行一些UCOS、FreeRTOS等等)。
MMU的作用就是负责虚拟地址(virtual address)转化成物理地址(physical address)。
ARM CPU上的地址转换过程涉及三个概念:虚拟地址(VA)(CPU内核对外发出VA),变换后的虚拟地址(MVA)(VA被转换为MVA供cache和MMU使用,在此将MVA转换为PA),物理地址(PA)(最后使用PA读写实际设备)。
1.CPU看到的用到的只是VA,CPU不管VA最终是怎样到PA的;
2.而cache、MMU也是看不到VA的,它们使用的是MVA(VA到MVA的转换是由硬件自动完成的);
3.实际设备看不到VA、MVA,读写设备使用的是PA物理地址。
CPU通过地址来访问内存中的单元,如果CPU没有MMU,或者有MMU但没有启动,那么CPU内核在取指令或者访问内存时发出的地址(此时必须是物理地址,假如是虚拟地址,那么当前的动作无效)将直接传到CPU芯片的外部地址引脚上,直接被内存芯片(物理内存)接收,这时候的地址就是物理地址;
如果CPU启用了MMU(一般是在bootloader中的eboot阶段的进入main()函数的时候启用),CPU内核发出的地址将被MMU截获,这时候从CPU到MMU的地址称为虚拟地址,而MMU将这个VA翻译成为PA发到CPU芯片的外部地址引脚上,也就是将VA映射到PA中。
MMU将VA映射到PA是以页(page)为单位的,对于32位的CPU,通常一页为4k,物理内存中的一个物理页面称页为一个页框(page frame)。虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页框(frame)。页和页框的大小必须相同。
CPU访问内存时的硬件操作顺序,各步骤在图中有对应的标号:
1.CPU内核(图1中的ARM)发出VA请求读数据,TLB(translation lookaside buffer)接收到该地址,那为什么是TLB先接收到该地址呢?因为TLB是MMU中的一块高速缓存(也是一种cache,是CPU内核和物理内存之间的cache),它缓存最近查找过的VA对应的页表项,如果TLB里缓存了当前VA的页表项就不必做translation table walk了,否则就去物理内存中读出页表项保存在TLB中,TLB缓存可以减少访问物理内存的次数;
2.页表项中不仅保存着物理页面的基地址,还保存着权限和是否允许cache的标志。MMU首先检查权限位,如果没有访问权限,就引发一个异常给CPU内核。然后检查是否允许cache,如果允许cache就启动cache和CPU内核互操作;
3.如果不允许cache,那直接发出PA从物理内存中读取数据到CPU内核;
4.如果允许cache,则以VA为索引到cache中查找是否缓存了要读取的数据,如果cache中已经缓存了该数据(称为cache hit)则直接返回给CPU内核,如果cache中没有缓存该数据(称为cache miss),则发出PA从物理内存中读取数据并缓存到cache中,同时返回给CPU内核。但是cache并不是只去CPU内核所需要的数据,而是把相邻的数据都取上来缓存,这称为一个cache line。ARM920T的cache line是32个字节,例如CPU内核要读取地址0x30000134 ~ 0x3000137的4个字节数据,cache会把地址0x30000120 ~ 0x3000137(对齐到32字节地址边界)的32字节都取上来缓存。
交叉编译
在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说, 就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统 (Operating System)。
转载
生产消费者模型
转载
1、解耦
假设生产者和消费者是两个类,如果让生产者直接调用消费者的某个函数,那么生产者和消费者之间就会产生依赖(耦合)。如果消费者的代码发生变化可能会影响到生产者。而如果两者都依赖于某个缓冲区,两者之间不直接依赖,耦合性也就降低了。
2、支持并发
生产者直接调用消费者的某个方法,还有一个弊端。由于函数调用是同步的(或者称作阻塞的),在消费者的方法没有返回之前,生产者只好一值阻塞,如果消费者处理数据很慢,则生产者就会白白浪费时间。使用生产者和消费者模式之后,生产者和消费者可以是两个独立的并发主体。生产者把制造出来的数据放到缓冲区,就可以继续生产下一个数据,而不必依赖消费者的处理速度了。
3、支持忙闲不均
缓冲区还有一个好处就是,如果制造数据的速度时快时慢,缓冲区的好处就体现出来了,当数据制造快的时候,消费者来不及处理,未处理的数据就可存放到缓冲区中。等待生产者的速度慢下来之后,消费者再慢慢处理。
生产者和消费者之间的关系
1.生产者和生产者之间是互斥关系:
2.消费者和消费者之间是互斥关系
3.生产者和消费者之间是同步、互斥关系
也就是:
生产者生产的时候消费者不能消费
消费者消费的时候生产者不能生产
缓冲区空时消费者不能消费
缓冲区满时生产者不能生产
实时系统和非实时系统
转载
嵌入式操作系统分为实时系统和非实时系统两类,常见的实时系统有:ThreadX、FreeRTOS、ucOS;常见的非实时系统有:windows、linux、Android。两类操作系统的主要区别在于任务调度处理方式不同,常用的任务调度方式有两种:基于任务优先级的任务调度方式和基于时间片的任务调度方式:
基于任务优先级的调度方式:一旦内核把资源分配给某进程后,便让该进程一直执行,直到该进程完成或发生某事件而被阻塞(常见的方式主动调用delay),才再把处理机分配给其他进程,否则高优先级的任务会一直运行。所以这种情况下,如果某个高优先级的任务运行时间过长最好有阻塞机制,来让出CPU使其他低优先级的任务也有机会运行。
基于时间片的调度方式:这种方式下,所有任务的优先级相同,当内核给该进程分配的时间片结束后,内核会停止正在执行的这个进程,下一个时间片分配给其他进程执行,即便这个任务没有执行完也没有主动delay自己。