应试笔记与八股

2 通用嵌入式基础

2.1 基础硬件协议或结构

2.1.1 综述类

2.1.1.1 串口、I2C、SPI之间的相同点和不同点

考察企业:

  • 海康威视
  • 小米
  1. 这三个都是嵌入式系统中常用且基础的设备间的硬件通信协议,其相同点主要有:
    1. 这三个通信协议都用于设备之间的数据传输
    2. 这三个通信协议所需要的例如电气性能、引脚数量等硬件要求相比于以太网、USB等协议低
    3. 这三个协议都是非差分走线的串行协议
    4. 应用极为广泛,基本上所有的单片机及SoC都会硬件原生支持这些协议
  2. 这三个协议的不同点主要有以下几个方面:
    1. 硬件引脚定义、连接方式、接线数量不同:
      1. 串口可以分为异步串口(UART)和同步串口(USART)两种,这两种的根本区别在于是否有一个独立的时钟线(CLK)同步两个设备之间的时钟信号。而异步串口最少需要2根引脚才能完成双向通信,同步串口则至少需要三根。此外这两种串口都有可选的两个流控引脚(CTS/RTS)。
      2. I2C使用一个数据引脚(SDA)和一个时钟引脚(SCL)进行数据传输
      3. SPI至少需要MISO、MOSI、SCK三个引脚才能完成单主从之间的双向通信,若需要单主多从的通信则需要额外的片选引脚(CS)。此外,若只需要单向的主向从通信,则可以省略MISO。
      4. 当然这些通信协议均需要相同的GND作为电平参考
    2. 通信模式不同:
      1. 串口最多支持全双工模式
      2. SPI最多支持全双工模式
      3. I2C最多支持半双工模式
    3. 通信拓扑结构不同:
      1. 串口往往用于一主一从的全双工通信模式,当且仅当在处理好波特率、数据包解析与异常处理时才能考虑一发多收的单向通信模式。后者往往不建议使用。
      2. I2C支持一主多从模式,在8位地址的模式下,通常读地址和写地址分别占用同一个高七位地址,并用最后一位区分是读地址还是写地址。通常来说,写地址最低位为0,读地址最低位为1。在这种模式下,通常一个主设备下可以外挂128个从设备。主设备不占用地址。
      3. SPI支持一主多从模式,其使用CS片选信号来选定需要通信的设备。
    4. 通信速率不同:
      1. 串口往往使用9600、115200bps等常用速率,但部分平台也原生支持自定义通信速率。
      2. I2C的标准模式下通信速率为100Kbps,快速模式下通信速率为400Kbps。
      3. SPI的具体速率往往没有约定成俗,最快速率取决于主设备和从设备。比如ESP32最高为80Mbps,ST7789V屏幕控制芯片的最高速率为50Mbps。
    5. 可靠性和错误处理不同:
      1. 串口有奇偶校验位,在波特率等设置正确的情况下,一定程度上可以避免传输错误
2.1.1.2 讲一下串口和并口的区别
2.1.1.3 讲一下在嵌入式系统中,如何管理内存
  1. 由于大多数嵌入式MCU并没有集成内存管理单元MMU,或者部分拥有MMU的SoC也并没有提供虚拟内存地址的功能(比如esp32),因此从硬件上就决定了大多数嵌入式MCU并没有硬件级别的动态内存管理能力,也无法避免动态内存的内存碎片问题。所以在嵌入式系统中,内存管理的方式主要有如下几种:
    1. 使用静态内存,直接将需要操作的内存分配在堆里。
    2. 自行实现或移植一个动态内存管理器,或者直接使用FreeRTOS的堆内存管理等。
2.1.1.4 在嵌入式系统中,如何处理异常和错误?
  1. 嵌入式系统中,异常主要可以分为硬件异常和软件异常。
  2. 硬件异常通常会触发对应的错误异常中断,需要在异常中断中完成错误处理,并将错误信息回报到软件层面。
  3. 软件异常通常包括输入参数异常,运行结果异常等。这些通常使用C语言的返回值进行错误传递、处理以及重试。
  4. 错误处理的方式通常有软件重启、硬件重启、错误重试等方式。
  5. 异常的预防措施有单元测试、断言等方式。
2.1.1.5 嵌入式系统中的网络协议栈是什么?常见的协议有哪些?
  1. 嵌入式的网络协议栈也是基于ISO/OSI七层网络模型进行设计的。其具体为:

    2.3 讲一下七层网络结构

    1. 七层网络协议是ISO组织提出的网络模型,其拥有应用层、表示层、会话层、传输层、网络层、数据链路层、物理层共计7层,典型协议如下:
      1. 应用层,例如 FTP Server 等应用。
      2. 表示层,例如 JPEG EncoderASCII 等负责数据编码解码、加密解密、压缩恢复技术。
      3. 会话层,例如 HTTPsocks 等协议。
      4. 传输层,例如 TCPUDP 等协议,主要为上层协议提供服务。
      5. 网络层,主要是 IP 协议。
      6. 数据链路层,有 PPPPPPoEIEEE 802.11 等协议,主要用于宽带拨号、无线wifi等。
      7. 物理层,主要规定了物理传输介质的一些物理或电气参数,如 RJ45 网络接口。
    2. 但是由于其规定的略为复杂,该协议理论成功事实失败,现主要使用 TCP/IP 协议。

    Pasted image 20240205011420.png

  2. 在嵌入式系统中,常用的协议有MQTT、HTTP、TCP、IP等网络协议。其中:
    • MQTT是一种轻量级的消息协议,主要用于物联网设备。
2.1.1.6 为什么CAN总线实时性比RS-485总线更高

考察企业:

  • 算能 嵌软

2.1.2 IIC协议

2.1.2.1 协议基础
2.1.2.2 IIC时序

考察企业:

  • 海康威视 嵌软
  • 荣耀 嵌软
  • 经纬恒润 嵌软
  • 科大讯飞 嵌软
I2C传输的总体流程
2.3 I2C传输的总体流程 ^odt3ol

2.3 I2C传输的总体流程

通常来说,嵌入式开发框架会同时提供普通的基本环节操作和封装好的数据传输操作,以分别应用于非标准的和标准的I2C硬件模型。

对于标准的I2C硬件模型,其从设备通常会有固定的I2C地址和若干可选的寄存器地址,对于这种标准模型,其读写流程是固定的,具体如下列章节所述。

2.3.1 写入数据

对于8位地址的标准I2C通信模型,其写入数据的流程如下:

  1. 发送开始信号
  2. 发送8位的从设备I2C地址
  3. 等待从机ACK
  4. 发送要写入的寄存器地址
  5. 等待从机ACK
  6. 传送n byte(s)数据,并在:
    • 非末尾byte处等待从设备ACK
    • 末尾byte不等待从设备ACK,进入环节5
  7. 发送结束信号
    数据包结构如下:

2.3.2 读取数据

对于8位地址的标准I2C通信模型,其读取数据的流程如下:

  1. 发送开始信号
  2. 发送8位的从设备I2C地址
  3. 等待从设备ACK
  4. 发送要读取的寄存器地址
  5. 等待从设备ACK
  6. 重新发送开始信号
  7. 主设备接收I2C数据,并发送ACK直到数据传输完毕
  8. 发送结束信号
2.1.2.3 如果两个IIC设备的地址完全一样应该怎么操作
  1. 首先应该查阅数据手册,考虑能否通过软件设置或者引脚配置等方式修改这两个IIC设备的地址,这样是最根本的解决方案。
  2. 考虑使用多个I2C总线
  3. 考虑使用I2C多路复用器
  4. 通过控制从设备的电源或者使能状态来保证数据传输时只有一个设备在工作
2.1.2.4 I2C从设备可以主动向主设备发送数据吗

同SPI中的相同问题,略。

2.1.2.5 I2C设备在控制SDA进行高低电平控制时,其GPIO的输出模式为(开漏、推挽等)?为什么?
  1. I2C设备在控制SDA进行电平控制时,其GPIO的输出模式为开漏模式。
  2. 其总线上的SDA和SCL会挂一个10K的上拉电阻到高电平,当其需要输出高电平时,GPIO为开漏高电平,依靠上拉电阻将总线拉到高电平。当需要输出低电平时,GPIO为开漏低电平,主动拉低到低电平。
  3. 这样设计的好处是避免I2C设备电平冲突,实现"线与"特性,即总线上有一个设备发送"1",则总线上所有设备收到的数据就是"1"。
2.1.2.6 I2C的引脚如何设置

考查企业:

  • 小米
  • 牧原 嵌软
2.1.2.7 I2C地址有几种类型

考查企业:

  • 科大讯飞 嵌软
  1. I2C地址有7位和10位两种类型:
    1. 7位地址传输时,I2C的第一个包的前7位用于传输该地址,第8位用于表示读写,随后接寄存器地址。
    2. 10位地址传输时,I2C的第一个包的前5位固定为 11110 ,随后跟2位10位地址的最高位,随后是读写位(即 11110${A9}${A8}${R/W} )。第二个包传输剩下的8位地址(即 ${A7~A0} )。第三个包开始传输寄存器地址。
2.1.2.8 I2C的SCL脉冲由谁控制?
  1. 无论通信方向,I2C的SCL脉冲一般都由主机控制
  2. 但是当低速从机需要等待时,其也可以拉低SCL暂停时钟强制I2C总线进行等待,该特性叫作时钟拉伸(例如EEPROM)。
  3. 也就是说I2C主机在结束该I2C低电平时期后,依旧会检测和等待SCL被成功释放。
2.1.2.9 I2C死锁是什么,如何解决
  1. I2C死锁的表现通常为重启MCU后,访问I2C一直出现busy的情况,且该情况无法通过重启MCU解决,只有让整板重新上电才可以恢复的一种现象。
  2. I2C的空闲状态为:SDA、SCL均为高电平。
  3. I2C传输的电平过程为:
    1. 等待SDA、SCL均为高电平的空闲状态。
    2. 主机拉低SDA发送Start信号。
    3. 主机操作SDA、SCL发送从机Address,拉高SDA、SCL进入空闲状态等待从机ACK。
    4. 从机拉低SDA发送ACK应答。
    5. 主机操作SDA、SCL发送包含寄存器地址在内的若干数据,拉高SDA、SCL进入空闲状态。并在非最后一个字节处等待ACK。
    6. 最后一个字节处不等待ACK,在SCL恢复高电平后拉高SDA,发送STOP信号,传输完毕。
  4. 一个简单的例子为:
    1. 等待SDA、SCL均为高电平的空闲状态。
    2. 主机拉低SDA发送Start信号。
    3. 主机操作SDA、SCL发送从机Address,拉高SDA、SCL进入空闲状态等待从机ACK。
    4. 主机意外复位从机一直拉低SDA等待主机应答
    5. 主机等待从机把SDA恢复为高电平后才能进行后续I2C通信死锁发生
  5. 该死锁问题主要依赖于I2C的如下几个特性:
    1. ACK信号仅能由数据接收方发起,数据发送方能做的只有等待该ACK与否。
    2. ACK信号可以不立即应答,只要使用时钟拉伸特性延长该SCL周期即可,也就是说ACK还是必须在第九个周期内完成应答,只是该周期可以被从机延长。
    3. ACK信号必须在某个I2C的下降沿后下一个上升沿前开始拉低SDA并在该SCL的高电平时期内永久保持低电平无论该SCL高电平时长有多长
    4. 规范并未规定从机在传输数据时,容许的SCL的最长时长。
  6. 因此,并不只是上述的Address写入后可能触发死锁,其他情况还有:
    1. 任何一个从机发送使用SDA传输bit0期间主机意外重置都会导致该现象
    2. 主机没有等待从机的ACK信号且未做任何"签收"ACK的逻辑处理
    3. 从机在SCL高电平期间传输bit0的过程中主机意外重启,且未做后续bit的接收工作。
  7. 解决方案有:
    2. 重置从机(事后方案)。
    3. 手动拉低SCL接收未完成的ACK应答或数据。

2.1.3 SPI协议

2.1.3.1 SPI接口的硬件线路组成及作用
  1. 标准SPI是摩托罗拉在1980年左右提出的,其最初的版本即较为常用的标准SPI。其硬件构成为MOSI、MISO、SCK、四条线路。其中:
    1. MOSI为Master Output Slave Input,主设备输出从设备输入线路
    2. MISO为Msater Input Slave Output,主设备输入从设备输出线路
    3. SCK为Serial Clock,即时钟线路
    4. 为片选线路,低电平有效
      这些电气线路在约定的时钟相位和时钟极性下进行数据传输。
  2. 除了标准SPI,还有缺线SPI、3-wire SPI、Dual SPI、Quad SPI等变种SPI。其中:
    1. 缺线SPI是指在MOSI或MISO中缺了一根通信线路的SPI,往往用于单向通信设备,例如ST7789等显示屏。缺线SPI是单向通信
    2. 3-wire SPI是指将MISO、MOSI合并为同一根电气线路的SPI。因为标准SPI尽管是全双工协议,但是输入输出任务往往交替运行。因此3-wire SPI在省略了一根电气线路时,实际传输速度基本没有受到影响。3-wire SPI是单工通信
    3. 而Dual SPI、Quad SPI是在3wire SPI的基础上进行改进的,其分别是双复用IO、四复用IO的SPI,分别每次传输2bit和4bit数据。Dual SPI、Quad SPI都是单工通信
2.1.3.2 从机会主动发送数据吗

考察企业:

  • 锦浪
  1. SPI的基本构成是...(略)
  2. 因此无论哪个版本的SPI,其通信都是由主设备通过SS信号来控制与哪个从设备进行通信,这一条电气线路被主机所控制,从机无法控制。因此不存在从设备只使用SPI所规定方法主动向主机进行通信的方式。
  3. 但是在实际工程中,从设备往往会提供一个可以配置的IO输出口,当从设备需要向主设备发送数据时,可以控制这个IO的电平,使用触发主设备中断等方式,通知主设备主动使用SPI协议查询或接收SPI从设备的数据。
2.1.3.3 SPI如何和多个设备进行通信

考查企业:

  • 小米

2.1.4 串口协议

2.1.4.1 485有多少根线,功能是什么
  1. RS485是串口协议的一种,其与RS232、TTL协议最大的区别是在于物理层定义的电平特性有所不同。但是其本质仍然是串口协议。
  2. RS485与RS232、TTL最大的不同是在于RS485使用的是差分线路,其使用了U+和U-两条查分信号对传输差分信号,当U+电压大于U-时表示逻辑1,反之则为逻辑0。
  3. 在硬件上,除了U+和U-以外通常还需要一根GND来当做参考电平,减少噪音干扰。其共模电压范围为-7V~+12V。
  4. 因此485通常至少要使用3根线,其中两根差分线路组成一个差分对进行数据传输。
2.1.4.2 简述一下485通讯协议以及硬件,485的从机数量有要求吗

考察企业:

  • 诺瓦星云
  • 经纬恒润
  1. RS485是串口协议的一种,其与RS232、TTL协议最大的区别是在于物理层定义的电平特性有所不同。但是其本质仍然是串口协议。
  2. RS485与RS232、TTL最大的不同是在于RS485使用的是差分线路,其使用了U+和U-两条查分信号对传输差分信号,当U+电压大于U-时表示逻辑1,反之则为逻辑0。
  3. 在硬件上,除了U+和U-以外通常还需要一根GND来当做参考电平,减少噪音干扰。其共模电压范围为-7V~+12V。
  4. 由于其只有一对查分信号对,因此其是半双工通信,往往需要应用层通信协议来完成通信。常用的应用层协议是Modbus。
  5. 在物理层协议层面,即RS-485协议上,其规定了单位负载下最多支持32个节点,即挂载32个从机。这是从电气负载、电容阻抗、噪声干扰层面进行考虑的。当从设备数量大于32个设备后应当考虑增加中继器。而RS-485设备所使用的Modbus通信协议支持挂载247从设备。
2.1.4.3 讲一讲串口的波特率和比特率,以及如何计算

考察企业:

  • 阳光电源 嵌入式
2.2.3 \[八股\] 波特率与比特率

2.2.3 [八股] 波特率与比特率

基本概念为计算机网络中的物理层概念,简单回顾一下码元波特率比特率的定义:

  • 码元:指使用一个固定时长的信号波形能传输的数字信号的信息量。例如一个波形可以表示一个二进制,则就是1码元,称为二级制码元;可以表示四进制就是2码元,称为四进制码元;N进制就是 码元,称为N进制码元。

  • 速率数据率数据传输速率:表示单位时间内传输的数据量,可以按照单位不同分为如下两种说法:
    • 码元传输速率波特率:单位时间内传输的码元个数,单位波特(Baud),例如2秒传输4800个码元,则波特率为2400B。码元速率与进制数无关,只与码元长度(码元宽度)有关。
    • 信息传输速率比特率:单位时间内传输的二进制码元个数,单位比特每秒(bit/s或bps)。

(详见计网 物理层基本概念)

明显地:

  • 串口传输中的波形只有逻辑高电平和逻辑低电平两种电平状态,则串口传输中的码元为1码元
  • 串口传输中不止有数据位,其还有起始位、停止位、校验位等概念。因此假设:
    • 某一串口的配置为:9600波特率、1起始位、8数据位、0校验位、1停止位,则:
      • 波特率为:
      • 比特率为:

2.1.5 CAN协议

2.1.5.1 简述一下CAN协议、两种CAN协议有什么不同、最大可以挂载多少设备
  1. CAN协议是博世公司为汽车以及工业领域开发的一种控制器局域网总线,其支持多主机模式,使用两根差分线作为数据线路。其位于OSI/ISO七层网络协议中的传输层、数据链路以及物理层。
  2. CAN协议规定了高速和低速两种总线,其区别是在于总线电气特性的不同:
    1. 高速总线在CAN_H和CAN_L差分线组的两端分别使用了一个120欧的终端电阻,以消除其回波反射,加快其隐式电平的电平回归。其传输速度更高,但是传输距离更近。
    2. 低速总线只在CAN_H和CAN_L的一端加上一个2.2k欧的一个终端电阻,用于消除回波反射。其传输速度较低,但是传输距离更远。
      两种CAN总线在数据编码规则上面没有差异。
  3. 高速CAN总线支持挂载30个设备,低速CAN总线支持挂载20个设备。
2.1.5.2 讲一讲CAN有哪几种电气特性,并讲一下其电路和电平特性

考查企业:

  • 科大讯飞 嵌软
2.1.5.3 CAN总线负载率如何计算

2.1.5.4 CAN总线负载率通常要维持在多少比较合适

CAN总线负载率过高时,一旦发生错误重传,系统可能出现数据积压、总线拥塞等问题。

2.1.6 中断

2.1.6.1 讲一下51单片机的中断处理流程
  1. 51单片机的中断信号通常是外部IO、定时器触发或者串口等通信协议触发。每个中断源都有对应的中断标志位。
  2. 当中断发生时,中断对应的中断标志位会自动被CPU设置,随后CPU检查中断使能位(EA)是否为1,如果为1则会CPU会继续响应,如果不为1则中断请求会被忽略。
  3. 随后CPU会检查中断源对应的局部中断使能,当该使能被设置为1时则会继续响应。
  4. 随后CPU会判定中断优先级,如果当前CPU并未在终端执行程序,或中断优先级比当前执行的中断优先级高,随后则会响应该中断。
  5. 随后CPU会保存上下文信息,包括程序计数器PC等必要寄存器。
  6. 随后CPU会查询内存中的中断向量地址,并跳转到对应的地址执行中断服务函数。
  7. 当中断服务函数执行完毕后,CPU恢复上下文信息,并继续进行中断发生前的程序。

几个注意事项:

  1. 低优先级的中断被高优先级中断打断时,低优先级的中断会被挂起,直到高优先级中断响应完毕。
2.1.6.2 什么是中断优先级,如何设置中断优先级
  1. 中断优先级指的是当若干中断同时到来,或者在执行中断函数时触发了别的中断时的嵌套与响应的优先级。

2.1.7 DMA

2.1.7.1 解释一下DMA的工作原理及其优缺点

2.1.8 ADC

2.1.9 GPIO

2.1.9.1 讲一下常见的GPIO模式

考查企业:

  • 牧原 嵌软
  • 科大讯飞 嵌软

通常来说GPIO有八种模式,其分别为:

  • 浮空数入:
  • 上拉输入:
  • 下拉输入:
  • 模拟输入:
  • 开漏输出:开漏输出在MCU内部实现为一个N-MOSFET,当MCU输出高电平时,下拉MOS管断开,此时单片机引脚悬空,通常会再加一个上拉电阻实现自定义"线与"特性自定义电平特性。
  • 推挽输出:推挽输出在MCU内部实现为一个P-MOSFET和一个N-MOSFET分别实现上下拉功能,使单片机在无论输出高电平还是低电平时都有驱动能力。
  • 复用开漏输出:通常用于总线协议的逻辑电平发送,例如I2C、CAN总线等。使用上拉+开漏而不使用推挽输出主要有两个优势:"线与"特性自定义电平
  • 复用推挽输出:通常用于TTL电平中的TX引脚,这样可以使该引脚有更强的负载驱动能力。
2.1.9.2 讲一下什么是推挽输出
2.1.9.3 讲一下开漏输出、推挽输出的区别

考察企业:

  • 小米

2.1.10 看门狗

2.1.10.1 讲几个看门狗的常见用途
  1. 可以使用看门狗,在程序进入错误循环时触发看门狗超时异常,然后在异常函数中打印栈回溯和寄存器信息,方便在没有调试器的情况下保存现场信息方便后续排故。在没有连接调试器的情况下,单片机发生死机,如何进行异常调试

2.2 单片机基础

2.2.1 单片机上电之后是怎么运行的

2.2.2 单片机上电之后不运行可能的原因是什么

考察企业:

2.2.3 讲一下BSS段

考察企业:

  • 深圳百格
  1. BSS段指的是C语言程序内存布局中的数据段中的未初始化数据段。
  2. 这段由系统进行分配并清零,因此每个程序开始时BSS段中的数据都是0。
  3. 而数据段主要存放全局变量和静态变量,其中程序定义了初始值的变量会存放进已初始化的数据段,这部分数据被编译在可执行文件中,并在加载时由系统拷贝。而未定义初始值的变量会存放到BSS段,由于BSS段初始数据为0,因此未设置初值的全局变量和静态变量的值均为0。

2.2.4 在没有连接调试器的情况下,单片机发生死机,如何进行异常分析

  1. 通常单片机死机时只有两种情况:进入硬件异常,或程序进入错误的循环。此时只需要加入硬件看门狗就可以将"单片机进入错误的循环"的情况转化为"硬件异常"情况。然后在所有的异常处理函数中加入栈回溯和寄存器信息保存输出功能即可得到单片机死机时的异常信息。
  2. 使用调试器,在调试时注意选择不重启单片机。

2.3 各类常用硬件及其基础硬件

2.3.1 STM32专题

已迁移至应试笔记与八股

2.4 常用软件层技术

2.4.1 通用软件层技术

2.4.1.1 如果考虑让你实现一个上位机,你将如何考虑通信协议

考察企业:

  • 阳光电源

通信协议的设计应当以实际需求为准,从硬件协议到软件协议的顺序进行设计。
首先是需求层面:

  1. 确定数据传输的数据量要求。
  2. 数据传输对数据完整性的要求:
    • 例如实时音视频流传输,对实时性要求很高,但是对少量数据差错不敏感。
    • 而在处理OTA升级等需求时,对完整性要求极高,因此其需要额外增加CRC校验等功能。
  3. 下位机的使用场景:
    • 工业自动化场景中通常使用Modbus进行设计
    • 汽车领域通常使用CAN等协议完成
    • 物联网通常使用TCP、UDP、MQTT、BLE等进行传输
  4. 安全性需求:
    • 对于网络传输或需要做硬件层面加密的需要加入加密算法

然后需要考虑硬件协议,这一点主要从开发资源、硬件限制等层面进行考虑:

  1. 在传输数据量要求不大,且可以进行有线连接时,串口是最常用的硬件协议。
  2. 在传输数据量高,且可以进行有线连接时,可以考虑使用以太网或USB进行传输。

最后确定应用层协议:

  1. 在硬件层面使用以太网、LTE、Wi-Fi等网络传输的设备,可以考虑使用TCP、UDP、MQTT等会话层、应用层协议。而在在数据包的编码上:
    1. 普通文本和少量二进制数据可以考虑使用Json协议
    2. 工业控制场景可以使用Modbus协议
    3. 高频大流量场景可以使用Protobuf等协议
  2. 如果使用串口,或使用SPI/I2C协议等的基础LoRa无线传输时,则通常需要考虑增加CRC校验功能。
2.4.1.2 比较一下各种通信协议

考察企业:

  • 阳光电源

2.4.2 modbus

2.4.2.1 讲一下modbus

考查企业:

  • 阳光电源

3 基础操作系统类(RTOS、Linux)

3.1 综述类

3.1.1 FreeRTOS和Linux的区别与相同点

考察企业:

  • 海康威视
  1. 首先FreeRTOS和Linux都是常用的嵌入式操作系统。相比于裸机,他们所解决的问题集中于多任务处理、开发生态环境等问题上,例如如果需要网络开发,则通常需要LwIP配合多任务调度等,如果需要ROS环境开发则无法离开Linux的支持。并且通常在引入操作系统之后,就可以利用操作系统的一些内存管理或者任务管理等裸机无法实现或难以实现的特性。
  2. 而在区别点上,Linux和FreeRTOS主要在于任务需求或硬件资源上进行选择或区分:
    1. 通常来说,FreeRTOS只需要几KB到几十KB的运行内存或储存,但是Linux则需要至少若干兆字节的运储存才能很好的运行。此外,Linux通常需要内存管理器MMU的支持,不然难以解决内存碎片问题。
    2. 在操作系统的特性上,FreeRTOS可以严格地保证任务调度的实时性,但是Linux需要打上实时性内核补丁才能保证较低实时性的任务。
    3. 在操作系统特性上,Linux提供了更多的现代操作系统的特性,例如多用户管理、虚拟内存、网络协议栈、加载内核模块、GUI界面、Shell终端等。

3.1.2 什么是互斥资源

3.1.3 什么是死锁

3.1.4 嵌入式系统的实时性是什么,如何评估实时性

3.1.5 嵌入式系统中的信号量和消息队列是什么?有什么区别?

3.1.6 什么是多核缓存一致性?如何解决?

考查企业:

  • 理想汽车 系统软件开发

3.2 Linux专题

已迁移至应试笔记与八股

3.3 FreeRTOS专题

已迁移至应试笔记与八股

3.4 OTA类问题

4 CPU架构相关

4.1 ARM

4.1.1 ARM架构编程时,函数传参数量最好小于几个?为什么?

考察企业:

  • 长鑫存储(常考)
  • 科大讯飞
  1. ARM架构在函数传参时,其参数传递主要有两种方式:寄存器传递和栈传递。其中:
    1. AArch32架构传参依靠 R0 ~ R3 四个寄存器进行传递,超过四个的参数会使用栈传递。
    2. AArch64架构传参依靠 X0 ~ X7 八个寄存器进行传递,超过八个的部分会使用栈传递。
  2. 上述特性与编译器几乎无关,是由ARM调用约定规定的。