嵌入式大厂面经 10(持续更新中!)

这是一个嵌入式大厂面试题专栏,每天更新高频面试题。专栏将包含题目描述、详细解析、相关知识点扩展以及实际代码示例。内容涵盖操作系统、驱动开发、通信协议等核心领域,并结合实际项目经验进行分析。每道题目都会附带面试官可能的追问方向,帮助大家更好地准备面试!

1. .c文件转换为可执行程序的过程

C语言源文件(.c)转换为可执行程序需要经过以下几个阶段:

预处理阶段

  • 处理所有预处理指令(#include, #define等)
  • 展开宏定义
  • 条件编译处理
  • 删除注释
gcc -E main.c -o main.i

编译阶段

  • 将预处理后的代码转换为汇编代码
  • 进行语法分析、语义分析
  • 代码优化
gcc -S main.i -o main.s

汇编阶段

  • 将汇编代码转换为目标文件(机器码)
  • 生成.o文件(Windows)或.obj文件(Linux)
gcc -c main.s -o main.o

链接阶段

  • 将目标文件与库文件链接
  • 解析符号引用
  • 生成最终可执行文件
gcc main.o -o main.exe

完整编译命令

gcc main.c -o main.exe

2. SPI和IIC寻址的区别

SPI寻址机制

  • 硬件选择方式:使用独立的片选(CS/SS)信号线
  • 每个设备需要单独的片选线
  • 无地址字节:通信时不需要发送地址字节
  • 寻址过程: 主机拉低对应从机的CS线直接开始数据传输通信结束后拉高CS线
// SPI设备选择示例
void SPI_SelectDevice(uint8_t device_id) {
    // 确保所有设备都未选中
    GPIO_SetBits(CS_PORT, CS_PIN1 | CS_PIN2 | CS_PIN3);
    
    // 根据设备ID选择对应设备
    switch(device_id) {
        case 1:
            GPIO_ResetBits(CS_PORT, CS_PIN1);
            break;
        case 2:
            GPIO_ResetBits(CS_PORT, CS_PIN2);
            break;
        case 3:
            GPIO_ResetBits(CS_PORT, CS_PIN3);
            break;
    }
}

I2C寻址机制

  • 软件寻址方式:使用地址字节
  • 共享总线:所有设备共享SDA和SCL线
  • 7位或10位设备地址
  • 寻址过程: 主机发送起始条件发送从机地址+读/写位等待从机应答进行数据传输
// I2C设备寻址示例
bool I2C_WriteData(uint8_t device_addr, uint8_t reg_addr, uint8_t data) {
    // 发送起始条件
    I2C_GenerateSTART(I2C1, ENABLE);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
    
    // 发送设备地址(写模式)

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式面试八股文全集 文章被收录于专栏

这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论
点赞 回复 分享
发布于 03-25 09:08 山西
很好
点赞 回复 分享
发布于 03-25 16:02 黑龙江
😱😱😱😱😱😱😱😱
点赞 回复 分享
发布于 03-26 10:12 上海

相关推荐

评论
3
1
分享

创作者周榜

更多
牛客网
牛客企业服务