嵌入式大厂面经 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编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论
spi的寻址方式为硬件选址,采用nss片选信号进行选址,i2c的寻址方式为软件地址字节进行选址,主机发起通信时会首先发送目标设备的地址,只有地址对应的从设备才会相应
点赞 回复 分享
发布于 04-14 21:00 未知
.c文件转换可执行文件的过程,一共有四步,预处理、编译、汇编和链接,预处理阶段是出来源代码文件的预处理指令,输出.i文件,编译是将预处理后的源代码文件转换为汇编语言文件,输出.o文件,汇编是将汇编语言文件转换机器可读的机器语言文件,输出输出目标文件.s文件,链接就是讲多个可执行文件组成一个可执行文件
点赞 回复 分享
发布于 04-14 20:55 未知
😱😱😱😱😱😱😱😱
点赞 回复 分享
发布于 03-26 10:12 上海
很好
点赞 回复 分享
发布于 03-25 16:02 黑龙江
点赞 回复 分享
发布于 03-25 09:08 山西

相关推荐

03-24 17:55
已编辑
中南大学 Java
被闪击了,qwq刚吃完饭还没出食堂,一个山东的电话打过来,我还寻思没有投山东的公司。然后问我现在有没有空,然后就开始面了## 3.24上来先是自我介绍,然后先问的项目相关1.第一个项目用了SpringCloud,有用什么注册中心来做模块间的信息传递我只用了RocketMQ,所以就说了消息队列2.第二个项目用了Nacos,怎么用的只把Nacos作为了注册中心,因为没什么配置要用到nacos,就一个spi对应的资源3.看我项目用到了Redis,怎么用的就是当作缓存,缓解Mysql压力然后就小问了一下八股,介于煮啵最近在看项目相关八股,然后基础答得稀碎4.== 与 equals() 区别差点答反了,而且说的确实模棱两可5.关键字final的用法煮啵只用过类和变量上的final,忘了方法也可以,被提醒了,类答的就是string类就是final的6.刚刚你提到了string,String、StringBuffer、StringBuilder的区别String不可变然后把StringBuffer是线程安全和StringBuilder不安全搞反了,寄寄7.然后问Mysql的底层数据结构我又没想起来,然后人家提醒是b+淦嘞,我记起来索引是用的b+,忘了mysql也是8.然后问我用没用过mybatis和mybatisplus我说用过然后就结束了,到反问环节了1.这后面还有面试吗小哥说不清楚,可能有二面,也可能hr和你交流(感觉已经暗示我的死亡了)2.公司是干什么的小哥说他们是科技公司,他所在的部门是给证券,国债什么的设计软件的,所以也要用到springboot、redis、mq等然后我就再见挂电话了总结:小哥人非常好,我菜成这个样子也一直在引导我,但这问的有点少了吧(流汗),如果不算kpi,那可能就是一面不卡人吧
查看11道真题和解析
点赞 评论 收藏
分享
评论
3
1
分享

创作者周榜

更多
牛客网
牛客企业服务