【嵌入式八股精华版】二、硬件篇
完整版见以下专栏:
【嵌入式八股】一、语言篇https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM
【嵌入式八股】二、计算机基础篇https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym
【嵌入式八股】三、硬件篇https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM
【嵌入式八股】四、嵌入式Linux篇https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0
二、硬件相关
ARM体系与架构
72.Arm有多少个寄存器?
Arm架构有多个不同的版本和变体,每个版本和变体都有不同的寄存器数量和类型。以下是一些常见寄存器数量:
ARM处理器共有37个寄存器。
(1) 1个状态寄存器cpsr (2) 5个异常模式下的cpsr状态寄存器的影子寄存器spsr (3)16个通用寄存器r0 ~ r15 (4)10个异常模式下的r13和r14的影子寄存器 (5) 5个FIQ模式下的r8 ~ r12的影子寄存器
程序计数器PC为R15、程序链接寄存器LR为R14、堆栈指针寄存器SP为R13。
- SP 堆栈指针。
- LR ARM处理器相应异常时,或者函数调用时,会自动完成将当前的PC的值-4保存到LR寄存器,便于返回时回到原来的运行地址
- PC 指向下一条要执行的指令。
- CPSR 程序状态寄存器,记录当前程序的状态。
- SPSR 状态切换时保存CPSR的值,便于返回时回到原来的状态。
- 带三角的是独有的影子寄存器,状态转换的时候原来的不用保存一直在,不带的都是各模式共用的寄存器。
- FIQ多个影子寄存器是用空间换时间,处理更快。
73.什么是CPSR,SPSR?什么时候用到?
CPSR是当前程序状态寄存器,存储的是当前程序的状态,比如上下文的⼀些寄存器内容,程序运行的话就要用到CPSR。SPSR为备份的程序状态寄存器,主要是中断发生时用来存储CPSR的值的。
74.ARMv8架构的三大创新
【移知公开课】ARMv8架构解析主题讲座_哔哩哔哩_bilibili
三大创新
执行状态,异常级别,安全模式
执行状态
AArch64 和 AArch32 两种可切换
AArch64: 新增A64(ARM 64bit)指令集 -> 大内存(突破4G限制)
AArch32: 可用以前A32(ARM 32bit)指令集和 T32(Thumb 32bit)指令集 -> 向前兼容
异常级别
EL0(应用) < EL1(OS) < EL2(虚拟化) < EL3(安全固件) -> 替代啰嗦的工作模式
安全模式
分为正常世界 和 安全世界 -> 真正的安全(物理隔离,如支付场景)
执异安
75.简述处理器中断产生和处理的过程。
处理器在中断处理的过程中,一般分为以下几个步骤:中断请求 -> 中断响应 -> 保护现场 -> 中断服务 -> 恢复现场 -> 中断返回。
arm对异常(中断)处理过程
① 初始化:
a. 设置中断源,让它可以产生中断
b. 设置中断控制器(可以屏蔽某个中断,优先级)
c. 设置CPU总开关(使能中断)
② 执行其他程序:正常程序
③ 产生中断:比如按下按键--->中断控制器--->CPU
④ CPU 每执行完一条指令都会检查有无中断/异常产生
⑤ CPU发现有中断/异常产生,开始处理。
对于不同的异常,跳去不同的地址执行程序。
这地址上,只是一条跳转指令,跳去执行某个函数(地址),这个就是异常向量。
③④⑤都是硬件做的。
⑥ 这些函数做什么事情?
软件做的:
a. 保存现场(各种寄存器)
b. 处理异常(中断):
分辨中断源,再调用不同的处理函数
c. 恢复现场
各种中断源发出的中断信号,汇聚到中断控制器,CPU可以读取中断控制器的寄存器,判断当前处理的是哪个中断,中断控制器有多种实现,比如NVIC,GIC。CPU每执行完一条指令,都会判断一下是否有中断发生了,有中断就会根据中断种类在中断向量表中找到中断处理函数,保存现场后跳到中断处理函数执行。执行完恢复现场。
GIC有三种中断类型软件触发中断、私有外设中断、共享外设中断。
76.什么是中断向量?什么是中断嵌套?
中断向量:中断服务子程序的入口地址。
中断嵌套:中断系统正在执行一个中断服务程序时,有另一个优先级更高的中断源提出请求,这时会暂停当前正在执行的级别较低的中断源的服务程序,处理级别更高的中断源。处理完毕后再返回到被中断了的中断服务程序。
77.中断的优缺点是什么?
优点:
- 响应性:中断使得系统能够及时响应外部设备的事件,如输入/输出请求、硬件故障等。它允许系统在接收到中断信号时立即中断当前正在执行的任务,并转而处理中断请求。
- 高效性:中断机制允许系统在不占用过多的处理器时间的情况下处理异步事件。它使得系统能够在等待外部事件时进行其他任务的处理,提高了系统的效率。
- 灵活性:中断机制可以处理多个异步事件,每个事件都有自己的中断处理程序。这使得系统可以同时处理多个外部设备的事件,并根据需要进行优先级排序和分配资源。
缺点:
- 复杂性:中断处理引入了额外的复杂性和开销。系统必须能够正确处理中断请求,并在中断处理程序之间进行上下文切换。这需要额外的硬件支持和操作系统的管理。
- 不确定性:由于中断是异步发生的,因此中断处理程序的执行时间和顺序可能会受到干扰。这可能导致系统的行为变得不确定,特别是在高并发或高优先级的中断请求情况下。
- 可靠性:中断处理程序的编写和管理需要特别注意,以确保其正确性和可靠性。不当的中断处理可能导致系统崩溃、死锁或数据损坏等问题。
78.软中断的概念?写代码什么时候用软中断?
软中断是一种软件实现的中断机制,用于在操作系统内核中触发和处理特定的软件事件或系统调用。
在操作系统中,软中断是通过软中断指令(软中断调用)来触发的。当执行软中断指令时,CPU会转到事先定义好的中断处理程序(软中断处理程序)中执行相应的操作。软中断的处理程序通常位于操作系统内核中,用于处理一些需要特权级别权限或需要内核支持的任务,如系统调用、定时器处理、网络中断等。
使用软中断的情况包括但不限于以下几个方面:
- 系统调用:当应用程序需要执行一些需要内核特权的操作时,可以通过软中断来触发相应的系统调用。例如,应用程序需要读写文件、创建进程、进行网络通信等操作,就可以通过软中断来请求内核提供相应的服务。
- 设备驱动程序:当外部设备(如硬件设备、网卡等)发生某些事件时,可以使用软中断来通知内核进行相应的处理。这样可以实现设备的异步事件处理和驱动程序的调度。
- 定时器和调度器:操作系统中的定时器和调度器通常使用软中断来实现。定时器中断用于定时触发特定的任务或事件,而调度器使用软中断来进行进程切换和任务调度。
- 异常处理:当发生某些异常情况时,如除零错误、非法指令等,可以使用软中断来触发异常处理程序,进行相应的错误处理和恢复操作。
- 系统监控和调试:软中断可以用于实现系统监控和调试功能,如追踪程序执行、收集性能统计数据、打印调试信息等。
- 信号处理:在某些操作系统中,信号是一种异步事件通知机制。当接收到特定信号时,操作系统会通过软中断来触发相应的信号处理程序,执行特定的操作,如终止进程、捕获异常等。
- 中断处理优化:一些操作系统使用软中断来优化中断处理过程。当发生硬件中断时,可以使用软中断代替硬中断,将中断处理程序从硬件中断上下文切换到软件中断上下文,以减少硬件中断的开销和提高系统的响应性。
以下是一个简单的伪代码示例,展示了在C语言中使用软中断的情况:
// 软中断触发函数
void triggerSoftInterrupt(int interruptNumber) {
// 使用软中断指令触发软中断
software_interrupt(interruptNumber);
}
// 软中断处理程序
void softInterruptHandler(int interruptNumber) {
// 根据中断号执行相应的操作
switch (interruptNumber) {
case 0:
// 执行系统调用操作
// ...
break;
case 1:
// 处理设备事件
// ...
break;
case 2:
// 执行定时器操作
// ...
break;
// ...
}
}
// 主程序
int main() {
// 触发软中断,执行系统调用
triggerSoftInterrupt(0);
// ...
return 0;
}
在上述示例中,通过调用triggerSoftInterrupt
函数,可以触发相应的软中断,并在softInterruptHandler
函数中处理相应的中断事件。
79.软中断和函数调用的区别
软中断和函数调用是两种不同的机制,它们在实现和使用上有一些区别:
- 触发方式:函数调用是由程序中的代码显式调用函数来触发的,而软中断是通过软中断指令(软中断调用)来触发的。软中断指令的执行会导致CPU从当前执行的代码转到软中断处理程序中执行,从而实现异步事件的处理。
- 上下文切换:函数调用是在当前执行上下文内进行的,函数执行完毕后会返回到调用点继续执行。而软中断的触发会引发一次上下文切换,CPU会从当前执行上下文切换到软中断处理程序的执行上下文中,处理完软中断后再返回到之前的执行上下文。
- 特权级别:函数调用通常在相同的特权级别下执行,而软中断通常涉及到特权级别的切换。软中断处理程序通常运行在内核态(特权模式)中,可以访问和操作受限资源,而函数调用则在用户态(非特权模式)中执行。
- 用途和场景:函数调用主要用于程序内部的模块化和流程控制,将代码分割为可复用的函数,提高代码的可读性和可维护性。而软中断通常用于操作系统内核中,用于处理异步事件、系统调用、设备驱动程序等特定的任务和事件。
- 异步性质:软中断是异步触发的,可以由外部事件(如硬件中断、信号等)或特定的软件请求来触发。而函数调用是同步的,由程序中的代码主动调用并顺序执行。
- 响应性能力:由于软中断是异步触发的,因此它可以更及时地响应外部事件。相比之下,函数调用需要在代码中显式调用,因此它的触发和执行是由程序的流程决定的。
- 特权级别转换:软中断通常用于在用户态和内核态之间进行切换。通过触发软中断,程序可以进入内核态执行受限操作。而函数调用则不涉及特权级别的转换,仅在当前的特权级别中执行。
- 中断处理机制:软中断通常与中断控制器(如硬件中断控制器)紧密相关,操作系统使用中断控制器来管理和分发中断请求。而函数调用则没有与中断控制器相关的机制。
- 效率:由于软中断涉及上下文切换和特权级别的转换,因此它的开销相对较高。而函数调用的开销相对较低,因为它不需要进行上下文切换和特权级别转换。
80.中断有形参和返回值吗?
中断服务函数能不能带形参和返回值?_中断处理函数参数传递和返回值_狂奔的乌龟的博客-CSDN博客
中断函数通常不具有返回值。中断函数是由中断处理程序调用的特殊函数,用于响应硬件中断或异常事件。它们的主要目的是执行特定的操作以处理中断,而不是返回值给调用者。
当发生中断时,处理器会暂停正在执行的程序,保存当前的上下文,并跳转到中断向量表中指定的中断处理程序。中断处理程序是在中断上下文中执行的,它会处理中断事件,执行必要的操作,并在完成后返回到被中断的程序或操作系统。
由于中断函数的执行是由中断事件触发的,而不是由程序显式调用的,因此它们通常不返回值。它们会直接对中断事件进行处理,并通过修改寄存器、标志位或其他机制来影响程序的状态或操作系统的行为。
81.一个全局变量a,在main和中断中要传递数据,这个变量要注意什么问题?
如果在中断服务函数中改变了供其他函数检测的全局变量的值,要使用volatile关键字定义该全局变量。因为主程序可能将该变量读取到寄存器中,以后每次只使用寄存器中的变量副本,这时候吐过不使用volatile关键字,会导致中断服务函数中修改该变量的操作被短路。
82.一个函数,在main和中断中都要同时调用,这个函数要做什么设计?
如果你希望在main
函数和中断处理函数中都调用同一个函数,你需要设计一个可重入函数。可重入函数是一种可以安全地在多个并发上下文中调用的函数。
可重入函数是指在多个任务(线程)同时调用时,不会产生竞态条件或数据污染的函数。
在C语言中,可重入函数具备以下特点:
-
不使用或修改全局变量:可重入函数不依赖于全局变量或共享状态,而是通过函数参数和局部变量来存储和处理数据。这样可以确保多个任务同时调用函数时不会相互干扰或出现数据冲突。
-
不依赖于静态数据结构:可重入函数避免使用静态数据结构(如静态数组、静态指针),因为这些结构在多个任务之间共享时可能会引发竞态条件。
-
本地数据的保存和恢复:可重入函数需要在函数内部临时保存和恢复局部变量的状态,以防止多个任务之间的互相影响。可以通过栈帧或函数调用时的参数传递来实现。
-
使用可重入的库函数:可重入函数还应该使用其他可重入函数或线程安全的库函数,以确保整个调用链路中不会出现竞态条件或数据冲突。
常见的可重入函数包括标准C库中的大多数函数,例如strlen
、memcpy
、sprintf
等。这些函数之所以可重入,是因为它们只操作传入的参数和本地变量,而不使用全局变量或静态数据结构。
需要注意的是,可重入函数并不一定是线程安全的。虽然可重入函数可以在多个任务之间共享,但在多线程环境下,需要采取额外的措施来保护共享资源,例如使用互斥锁或其他同步机制。
83.中断处理函数中使用printf函数
这个原理跟上面的在中断服务函数中使用浮点数类似,因为printf函数使用硬件资源,而这些资源本身就应该互斥访问(在多线程和多进程中),而这些导致printf函数不可重入,不能在中断中使用。
另外像malloc,free这些函数会使用全局的内存分配表,因此也是不可重入的,不能在中断中使用。
要注意,标准库函数中中很多都是不可重入的,在中断服务函数中要慎重使用它们。
中断服务函数应该是短而有效的。
84.异常的种类
当涉及中断和异常时,可以将它们分为以下两个类别:
中断的种类:
- 外部中断(External Interrupt):由外部设备触发的中断,例如键盘输入、鼠标点击或定时器到达等。
- 内部中断(Internal Interrupt):由处理器内部产生的中断,例如硬件故障、电源异常或时钟中断等。
异常的种类:
1)中断
中断是异步发生的,是由I/O设备的信号引起的。I/O设备(例如网卡,硬盘等)通过向处理器芯片上的一个引脚发送信号,并将异常号放到系统总线上以触发中断,其中异常号用来标识引起中断的设备。处理器执行完当前指令Icur后,发现中断引脚电压变高,就从系统总线读取异常号,然后调用对应的*中断处理程序(interrupt handler)*进行处理。处理程序返回时将控制交给下一条指令Inext。
2)陷阱
陷阱是有意为之的异常,它是指令执行的结果。和中断一样,陷阱处理程序返回时将控制移交给下一条指令Inext。最常见的陷阱是系统调用(system call)。用户程序经常需要向内核请求服务,为了使内核的服务安全可控,处理器提供一条特殊指令“syscall n”,用户可以通过执行该指令请求内核服务n。执行syscall指令会陷入到异常处理程序中,该程序对参数解码并调用适当的内核程序。系统调用和过程调用不同,普通函数运行在**用户模式(user mode)下,在这个模式下函数可以执行的指令类型是有限的,并且只能访问和调用函数相同的栈,而系统调用运行在内核模式(kernel mode)**下,该模式下系统调用执行任何指令并可以访问内核栈。
3)故障
故障是由错误情况引起的。当故障发生时,处理器将控制转移给故障处理程序,如果程序能修正这个错误,它返回时就将控制转交给引起故障的指令,否则程序返回到内核中的abort例程,abort例程会终止引起故障的应用程序。比较常见的故障有缺页异常。
4)终止
终止是不可恢复的致命错误导致的结果,通常是硬件错误,比如内存损坏时发生奇偶错误。终止处理程序将控制返回给一个abort例程,它会终止应用程序。
MCU&RTOS
85.STM32F1和F4有什么区别
-
更先进的内核。STM32F4采用Cortex M4内核,带FPU和DSP指令集,而STM32F1采用的是Cortex M3内核,不带FPU和DSP指令集。
-
更多的资源。STM32F4拥有多达192KB的片内SRAM,带摄像头接口(DCMI)、加密处理器(CRYP)、USB高速OTG、真随机数发生器、OTP存储器等。
-
增强的外设功能。对于相同的外设部分,STM32F4具有更快的模数转换速度、更低的ADC/DAC工作电压、32位定时器、带日历功能的实时时钟(RTC)、IO复用功能大大增强、4K字节的电池备份SRAM以及更快的USART和SPI通信速度。
-
更高的性能。STM32F4最高运行频率可达168Mhz,而STM32F1只能到72Mhz;STM32F4拥有ART自适应实时加速器,可以达到相当于FLASH零等待周期的性能,STM32F1则需要等待周期;STM32F4的FSMC采用32位多重AHB总线矩阵,相比STM32F1总线访问速度明显提高。
-
更低的功耗。STM32F40x的功耗为:238uA/Mhz,其中低功耗版本的STM32F401更是低到:140uA/Mhz,而STM32F1则高达421uA/Mhz。
86.实时系统和linux系统有什么区别
实时操作系统设计以实时性为前提进行设计,高优先级任务一定会优先执行。实时操作系统的主要目标是创造一个可预见的、确定的环境。所有的任务从它被创建开始它就是可预见的,比如它必须在截止时间内返回结果。一个实时操作系统可以保证完成计算的最坏情况下的时间是预先已知的,并且完成计算的时间不会超过限制。所以可预见性和确定性是实时操作系统最突出的特点。
实时操作系统中
- 多个任务按优先级执行,高优先级一定会优先运行
- 多种中断优先级,中断嵌套
而非实时操作系统以保证系统性能为前提进行设计。如Linux系统中
-
任务过多,会有不同的调度机制,比如防止饿死
-
中断分上下文,中断上文按顺序执行,不能抢占
87.FreeRTOS都需要配置哪些,中断是怎么配置的,需要注意什么?
需要配置:
内存管理:需要为FreeRTOS分配一定的内存空间。
任务管理:需要配置任务的堆栈大小、优先级等。
时钟和定时器:需要配置FreeRTOS使用哪个时钟源和定时器。
信号量和队列:需要配置信号量和队列的大小和类型。
调度器配置:需要选择FreeRTOS的调度器类型和优化设置。
在配置中断时,需要首先了解目标处理器的中断控制器的工作原理和寄存器的使用。
一般,可以按照以下步骤进行中断配置。
-
开启中断:需要将处理器中断控制器相应的中断开关打开。
-
设置中断优先级:需要设置中断请求的优先级,以保证高优先级中断的及时响应。
-
写入中断向量表:需要在处理器的中断向量表中写入中断处理程序的地址。
配置中断时需要注意以下几点:
-
中断控制器的操作必须是原子的,需要使用响应的临界区代码区。
-
不同处理器的中断控制器操作方式可能不同,需要根据具体的处理器来中断控制器的驱动程序。
-
中断处理程序应该简短,有效率,最好不要在中断中调用太多的函数,以免影响处理器系统的响应性能。
88.优先级翻转背后逻辑以及解决方法
优先级翻转问题是指在一个多任务系统中,当一个低优先级任务占用了一个高优先级任务所需的共享资源时,导致高优先级任务无法及时执行的情况。从现象上来看,好像是中优先级的任务比高优先级任务具有更高的优先权。这种情况下,优先级翻转问题可能会导致系统性能下降、延迟增加或任务错失截止时间等严重后果。
一个具体的例子:
假定一个进程中有三个线程Thread1(高)、Thread2(中)和Thread3(低),考虑下图的执行情况。
- T0时刻,Thread3运行,并获得同步资源SYNCH1;
- T1时刻,Thread2开始运行,由于优先级高于Thread3,Thread3被抢占(未释放同步资源SYNCH1),Thread2被调度执行;
- T2时刻,Thread1抢占Thread2;
- T3时刻,Thread1需要同步资源SYNCH1,但SYNCH1被更低优先级的Thread3所拥有,Thread1被挂起等待该资源
- 而此时线程Thread2和Thread3都处于可运行状态,Thread2的优先级大于Thread3的优先级,Thread2被调度执行。最终的结果是高优先级的Thread1迟迟无法得到调度,而中优先级的Thread2却能抢到CPU资源。
上述现象中,优先级最高的Thread1要得到调度,不仅需要等Thread3释放同步资源(这个很正常),而且还需要等待另外一个毫不相关的中优先级线程Thread2执行完成(这个就不合理了),会导致调度的实时性就很差了。
解决方法1:优先级继承
优先级继承就是为了解决优先级反转问题而提出的一种优化机制。其大致原理是让低优先级线程在获得同步资源的时候(如果有高优先级的线程也需要使用该同步资源时),临时提升其优先级。以前其能更快的执行并释放同步资源。释放同步资源后再恢复其原来的优先级。
带有优先级继承调度过程
与上图相比,到了T3时刻,Thread1需要Thread3占用的同步资源SYNCH1,操作系统检测到这种情况后,就把 Thread3的优先级提高到Thread1的优先级。此时处于可运行状态的线程Thread2和Thread3中,Thread3的优先级大于Thread2的优先级,Thread3被调度执行。
Thread3执行到T4时刻,释放了同步资源SYNCH1,操作系统恢复了Thread3的优先级,Thread1获得了同步资源SYNCH1,重新进入可执行队列。处于可运行状态的线程Thread1和Thread2中,Thread1的优先级大于Thread2的优先级,所以Thread1被调度执行。
通过优先级继承机制,可以有效解决优先级反转问题,使优先级最高的Thread1获得执行的时机提前。
解决方法2:优先级天花板
优先级天花板是当线程申请某共享资源时,把该线程的优先级提升到可访问这个资源的所有线程中的最高优先级,这个优先级称为该资源的优先级天花板。
这种方法简单易行,不必进行复杂的判断,不管线程是否阻塞了高优先级线程的运行,只要线程访问共享资源都会提升线程的优先级。
两者的区别
优先级继承:只有一个任务访问资源时一切照旧,没有区别,只有当高优先级任务因为资源被低优先级占有而被阻塞时,才会提高占有资源任务的优先级;而优先级天花板,不论是否发生阻塞,都提升,即谁先拿到资源,就将这个任务提升到该资源的天花板优先级。
89.简述FreeRTOS中的任务调度?
RTOS的实时性是如何实现的
一个处理器核心在某一时刻只能运行一个任务,操作系统中任务调度器的责任就是决定在某一时刻究竟运行哪个任务。 实时操作系统中都要包含一个实时任务调度器,这个任务调度器与其它操作系统的最大不同是强调:严格按照优先级来分配CPU时间,并且时间片轮转不是实时调度器的一个必选项。
FreeRTOS 操作系统支持三种调度方式:抢占式调度,时间片调度和合作式调度。实际应用主要是抢占式调度和时间片调度,合作式调度用到的很少。
合作式调度 亦称为FreeRTOS的协程,实际上是线程并发出来的,每个线程并发出来的协程共用一个栈空间。合作式调度主要用在资源有限的设备上面,现在已经很少使用了。出于这个原因,后面的 FreeRTOS 版本中不会将合作式调度删除掉,但也不会再进行升级了。
抢占式调度 每个任务都有不同的优先级,任务会一直运行直到被高优先级任务抢占或者遇到阻塞式的 API 函数,比如 vTaskDelay。
时间片调度 每个任务都有相同的优先级,任务会运行固定的时间片个数或者遇到阻塞式的 API 函数,比如vTaskDelay,才会执行同优先级任务之间的任务切换。如果用户在 FreeRTOS.h 中禁止使用时间片调度,那么每个任务必须配置不同的优先级。
路径:FreeRTOS.h
#ifndef
configUSE_TIME_SLICING
#define
configUSE_TIME_SLICING 1
#endif
90.FreeRTOS中的IPC通信都用过哪些?
-
信号量:信号量是一种计数机制,用于控制同步,它可以被视为一个资源,需要使用者获取它获取它执行相应的操作,之后再释放信号量,使得其他任务也能够获取这个资源。通过配置信号量,任务就能能够控制共享资源。
-
队列:队列可能于任务之间传递数据。它提供了发送一个消息的任务和接收一个消息的任务之间的缓冲区。队列中的消息都是一定格式的,FreeRTOS常用的队列有有限队列(设定最大可存放的数据个数)和无限队列(不设定队列大小)。
-
事件:事件用于任务之间交换消息,但是在事件中在处理消息可以根据消息的种类进行不同的处理。事件可以包含一个或多个消息,并且可以事件标志位。
接口协议
91.常见接口/协议特点总结
单总线 | 异步 | 半双工 | 1线 | 一主多从 | 300m左右 | 100kb/s以下 | TTL | |
UART | 异步 | 全双工 | 3线:RX、TX、GND | 一对一 | 2M | 3kbps到4Mbps | 小端 | TTL |
IIC | 同步 | 半双工 | 2线:SCL、SDA | 多主多从 | 不超过30cm | 100 kbps到5M | 大端 | TTL |
SPI | 同步 | 全双工 | 3线或4线:SCLK、MISO、MOSI、SS | 一主多从 | 10m左右 | 1-70Mbps | 大端 | TTL |
232 | 异步 | 全双工 | 一般3线:RX、TX、GND | 一对一 | 15m | 20kbps | 逻辑 1 :-15V — -3V 逻辑 0 :+ 3V — 15V |
|
485 | 异步 | 半双工 | 2线:A、B | 一主多从 | RS-485可达1200m | 最大传输速率为10Mbps | 差分 逻辑 1 :-6V — -2V 逻辑 0 :+2V — 6V |
|
CAN | 异步 | 半双工 | 2线:high、low | 多主多从 | 最远可达10KM(速率<5Kbps) | 最高1Mbps(距离<40M) | 大端 | 差分 |
USB | 异步 | 半/全 | 4线:Vbus、GND、D+、D- | 一对多 | 不超过5m | 小端 | 差分 | |
PCIe | 同步 | 全 | 1-32lane | 一主多从 | 每条Lane最多可以达到32Gbps(Gen5)的速率 | 差分 |
【嵌入式八股】精华版