介绍一下SPI时序

  1. 硬件信号
  1. CPOL / CPHA 定义

SPI 的“模式”由 CPOL(时钟极性)CPHA(时钟相位) 决定。

模式 CPOL CPHA 空闲电平 采样沿 改变数据的沿
0 0 0 上升沿采样 下降沿改变
1 0 1 下降沿采样 上升沿改变
2 1 0 下降沿采样 上升沿改变
3 1 1 上升沿采样 下降沿改变
  1. 数据传输过程

    1. 主机拉低 CS → 从机被选中。
    2. 主从机都在时钟驱动下,把各自移位寄存器的数据逐位推出,同时采样对方数据。
    3. 每个 SCLK 周期传输 1 bit,通常是 MSB 先行
    4. 常见帧长度为 8/16/32 位。
  2. 为什么要这样设计


介绍一下IIC协议

好的,我们来系统地讲一遍 I²C 协议 (Inter-Integrated Circuit)。它是嵌入式面试的常客,理解了“电气层 + 协议层 + 仲裁/应答”,就能对答如流。


I²C 协议介绍

  1. 硬件层特点
  1. 基本时序规则
  1. 帧结构

一个完整传输由以下部分组成:

START → [7位地址 + R/W] → ACK → [数据字节] → ACK/NACK → ... → STOP
  1. 速度等级
  1. 仲裁与时钟同步

一句话总结

I²C 用两根线、开漏与上拉,依靠 START/STOP 和 ACK/NACK 来分隔字节,支持多主仲裁与时钟拉伸,最常见速率是 100 kHz 与 400 kHz。


介绍一下CAN协议,仲裁机制

物理层特性

一帧包含:

仲裁机制原理

举例

假设两个节点同时发报文:

逐位仲裁:

所以 ID 越小,优先级越高

工程意义

一句话总结

CAN 总线用显性(0)压制隐性(1),在仲裁段逐位比较 ID,谁先发 1 却读到 0 就输,结果是 ID 数值小的报文优先级最高。

有用过FreeRTOS吗,有了解优先级和调度的策略吗?

FreeRTOS 的优先级和调度策略

  1. 调度方式
  1. 优先级策略
  1. 同优先级任务的调度
  1. 阻塞与唤醒
  1. 特殊机制
  1. 回答要点(简洁版,适合面试)

“FreeRTOS 的调度是基于优先级的抢占式调度,最高优先级就绪任务总能运行;同优先级任务可以配置是否时间片轮转;任务可以因延时或等待事件而阻塞,再由中断或内核唤醒。为防止优先级反转,FreeRTOS 的互斥锁支持优先级继承机制。”

static

  1. 在函数外(全局变量/函数前面加 static

👉 示例:

// file1.c
static int counter = 0;  // 只能在 file1.c 使用

static void helper() {   // 只能在 file1.c 调用
    counter++;
}
  1. 在函数内部(局部变量前加 static

👉 示例:

void foo() {
    static int cnt = 0;  // 只初始化一次
    cnt++;
    printf("%d\n", cnt);
}

调用 foo() 三次,输出:

1
2
3
  1. 在类内部(C++)

👉 示例:

class A {
public:
    static int count;       // 类变量
    static void show() {    // 类函数
        cout << count << endl;
    }
};

int A::count = 0;  // 必须在类外定义(C++17 起可用 inline static 省略)
  1. static 的总结

手撕:链表插入

struct ListNode { int val; ListNode* next; ListNode(int v): val(v), next(nullptr) {} };

struct DNode { int val; DNode* prev; DNode* next; DNode(int v): val(v), prev(nullptr), next(nullptr) {} };

进程和线程的区别

进程 (Process) 操作系统分配资源的基本单位。每个进程有独立的 地址空间、代码段、数据段、堆、栈等。

线程 (Thread) CPU 调度的最小单位,是进程中的“执行流”。一个进程可以有多个线程,它们共享进程的地址空间和资源。

进程:创建/切换时需要切换 虚拟内存页表、文件描述符表 等,开销大。

线程:切换时只改寄存器、栈指针,上下文切换轻量。

进程间通信 (IPC):管道、消息队列、共享内存、socket 等。需要操作系统内核支持。

线程间通信:更简单,直接共享内存 + 同步原语(互斥锁、条件变量、信号量)。

CAN总线中的采样点

采样点就是 CAN 控制器在比特周期内“读取总线电平”的时刻,通常设置在比特时间的 80% ~ 87.5%,通过调节 PROP_SEG 和 PHASE_SEG1 实现。它的位置影响 CAN 总线对抖动、延迟和噪声的容忍度。