嵌入式面试高频问题

  1. C语言指针和数组的区别?

维度 指针 数组

本质 存储内存地址的变量,占用独立内存空间(32位系统4字节) 连续的内存块,存储数据本身;数组名是常量地址,不占用额外空间

sizeof结果 等于指针本身的大小(如32位系统固定为4字节) 等于数组元素个数 × 单个元素大小

可修改性 可以修改指向(如 p++ ) 数组名是常量地址,不可直接修改(如 arr++ 非法)

传参行为 传递的是地址拷贝 传参时会退化为指向数组首元素的指针

一句话总结:数组是数据的容器,指针是地址的容器。

  1. STM32有效优先级怎么配置?
  • 核心规则:抢占优先级(Preemption Priority) > 响应优先级(Sub Priority)
  • 配置步骤:
  1. 先配置 NVIC_PriorityGroupConfig() ,确定抢占/响应优先级的位宽(比如分组2:抢占2位,响应2位)。
  2. 再给每个中断设置 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority (抢占优先级)和 NVIC_IRQChannelSubPriority (响应优先级)。
  • 生效逻辑:
  • 抢占优先级高的中断可以打断低抢占优先级的中断。
  • 抢占优先级相同时,响应优先级高的先响应,但不能打断当前正在执行的中断。
  1. volatile 关键字的作用是什么?

volatile 告诉编译器:该变量的值可能被硬件、中断或多线程意外修改,禁止对它做任何优化,每次访问都必须从内存中读取,而不是使用寄存器缓存的值。

  • 典型使用场景:
  • 硬件寄存器映射变量(如串口、定时器寄存器)。
  • 中断服务函数中修改的全局标志变量。
  • 多线程/多任务共享的全局变量。
  • 不加 volatile 会导致的问题:编译器优化后,程序可能一直读取寄存器中的旧值,导致逻辑异常。
  1. FreeRTOS中任务调度的策略有哪些?
  • 抢占式调度:高优先级任务就绪时,会立即抢占低优先级任务的CPU使用权,保证高优先级任务的实时性。
  • 时间片轮转调度:相同优先级的任务按时间片轮流执行,时间片用完后切换到下一个任务。
  • 协作式调度(旧版/可选):任务主动放弃CPU使用权才会切换,实时性较差,现代FreeRTOS默认不推荐。
  1. I2C和SPI的区别是什么?

特性 I2C SPI

信号线 仅2根(SDA数据线 + SCL时钟线) 4根(SCLK时钟 + MOSI主机发 + MISO主机收 + CS片选)

通信方式 半双工 全双工

拓扑结构 多设备挂同一总线,通过设备地址区分 每个设备需要独立片选线,主从一对一通信

速度 标准模式100Kbps,最高一般几Mbps 速度更高,可达几十Mbps

典型场景 低速外设(EEPROM、RTC、传感器) 高速外设(Flash、LCD、ADC)

  1. 什么是内存泄漏,如何避免?
  • 定义:动态分配的内存(如 malloc )使用后未释放,导致系统可用内存不断减少,严重时会引发系统崩溃。
  • 避免方法:
  1. 遵循"谁申请谁释放"原则, malloc 和 free 成对出现。

  2. 函数返回前检查所有分支路径,确保申请的内存都被释放。

  3. 使用静态分析工具(如 valgrind )检测内存泄漏。

  4. 嵌入式中尽量减少动态内存分配,优先使用全局/静态数组。

  5. 堆栈溢出的原因和解决方法?

  • 栈溢出原因:
  • 局部变量过大(如函数内定义大数组)。
  • 函数递归调用过深。
  • 中断嵌套过深,栈空间被反复占用。
  • 堆溢出原因:
  • 写操作越界访问了动态分配内存的相邻地址。
  • 多次释放同一块内存(double free)。
  • 解决方法:
  • 增大栈空间配置,减少局部大变量,改用动态分配或全局变量。
  • 限制递归深度,优化中断优先级和嵌套。
  • 检查数组/指针操作,避免越界访问。
  • 使用内存保护单元(MPU)监控内存访问。
  1. 常见的通信校验方法:
  • 奇偶校验:在数据位后添加一位校验位,使数据中1的个数为奇数/偶数,检测单比特错误。
  • 校验和(Checksum):对所有数据字节求和,结果作为校验码,简单但抗干扰性差。
  • 循环冗余校验(CRC):通过多项式运算生成校验码,抗干扰性强,常用CRC8/CRC16/CRC32。
  • 避免校验错误的方法:
  1. 通信两端约定统一的校验方式和参数。

  2. 增加帧头、帧尾和长度字段,辅助定位错误帧。

  3. 采用超时重传机制,对校验失败的帧进行重发。

  4. Linux中进程和线程的区别?

维度 进程 线程

资源分配 拥有独立的地址空间和系统资源 共享所属进程的地址空间和资源

创建/切换开销 开销大,需要复制页表等资源 开销小,仅需保存少量寄存器

通信方式 需通过IPC(管道、消息队列、共享内存) 直接读写共享变量即可通信(需同步机制)

安全性 一个进程崩溃不影响其他进程 一个线程崩溃会导致整个进程退出

相关推荐
IT策士1 小时前
k8s 常见面试问题
容器·面试·kubernetes
syagain_zsx2 小时前
Linux进程控制学习总结(1/2)
linux·运维·学习
晨晖22 小时前
linux命令12(shell编程)
linux·运维·服务器
雨打夏夜2 小时前
VMware + CentOS 9 双网卡静态 IP 配置完整指南
linux·虚拟机
承渊政道2 小时前
【MySQL数据库学习】MySQL基本查询(上)
linux·数据库·学习·mysql·bash·数据库开发·数据库系统
道川贤林2 小时前
EMMC开发环境的搭建与备份
linux·嵌入式·rk3588·orangepi
Benszen2 小时前
云计算基础-4:Linux 进程管理
linux·运维·云计算
人间乄惊鸿客10 小时前
Linux所遇问题自记录
linux
AOwhisky11 小时前
MySQL 学习笔记(第四期):SQL 语言之多表查询
linux·运维·网络·数据库·笔记·学习·mysql