一、C/C++语言相关

(一)基础语法
- 变量与数据类型:嵌入式开发中对变量的定义、类型转换等要求精准。例如会问到不同数据类型的字节数,像在32位机器中,int类型通常是4个字节。还可能涉及到有符号和无符号类型的区别,如在处理某些寄存器值或者通信协议中的数据时,无符号类型能表示更大的正数范围,更符合需求。
- 指针与引用:这是C/C++中的重点和难点。面试官可能会问指针和引用的区别,如引用必须被初始化而指针不必,引用初始化后不能改变而指针可以改变所指对象,并且不存在指向空值的引用但存在空指针等。此外,还可能涉及到指针的运算,如指针的偏移量计算在数组操作中的应用等。
- 内存管理:包括堆和栈的区别,如栈由编译器自动管理,空间较小且操作效率高,用于存放函数调用中的参数、局部变量等;堆则由程序员手动管理,空间较大但容易出现内存泄漏等问题。像malloc和free函数(C)、new和delete关键字(C++)的使用,以及内存泄漏的检测和避免方法等也可能被问到。
(二)函数与结构体
- 函数特性:如函数的参数传递方式(值传递、指针传递、引用传递)及其特点。值传递会复制一份数据,而指针传递和引用传递可以直接操作原数据,在处理大量数据或者修改函数外部变量时,后两者更合适。还有函数的重载和覆盖概念的区别,函数重载是在同一个类中,函数名相同但参数列表不同;函数覆盖是在派生类中重新定义基类的虚函数。
- 结构体与联合体:需要掌握结构体和联合体的定义、使用场景以及它们之间的区别。结构体中的成员变量是各自独立存储的,可以同时存在;而联合体的所有成员共用同一块内存空间,同一时间只能存储其中一个成员的值。在嵌入式系统中,当需要对不同类型的数据进行打包传输时,结构体很常用;而在某些资源有限且数据不会同时使用的情况下,联合体可以节省内存空间。
二、嵌入式系统知识
(一)硬件相关
- 微控制器与微处理器选择:在选择合适的微控制器(MCU)或微处理器(MPU)时,要考虑多个因素。例如项目的性能需求,如果是对处理速度要求高、功能复杂的项目可能选择性能更强的MPU;而对于一些资源受限、功能相对单一且对功耗要求低的项目,MCU可能更合适。还要考虑成本、功耗、外设接口(如UART、SPI、I2C接口数量是否满足与外部设备通信的需求)等因素。
- 寄存器操作:嵌入式开发经常涉及到对硬件寄存器的读写操作。需要了解寄存器的地址映射,如何正确地设置寄存器的值来控制硬件功能。例如,设置定时器的寄存器来控制定时时长,设置串口的波特率寄存器来确定通信速率等。
(二)操作系统相关
- 嵌入式操作系统(RTOS):如果项目使用了RTOS,如FreeRTOS、uC/OS等,会问到RTOS的任务管理(如何创建、删除、挂起和恢复任务)、任务间通信(消息队列、信号量、互斥锁等机制的原理和使用)以及任务调度算法(如抢占式调度和非抢占式调度的区别和应用场景)等知识。
- Linux系统编程:对于涉及Linux系统的嵌入式开发,常见问题包括文件系统操作(如打开、读取、写入文件)、进程管理(进程的创建、终止、查看进程状态等)、网络编程(TCP/IP协议栈的理解,套接字编程等)等内容。
三、通信协议
(一)内部通信
- I2C协议:需要了解I2C的工作原理,包括其主从设备的通信机制、起始和停止条件、数据传输格式(7位或10位地址模式)等。例如在一些传感器与微控制器的通信中,I2C协议被广泛应用,因为它只需要两根线(SDA和SCL)就可以实现多设备连接。
- SPI协议:SPI协议相对复杂一些,要掌握SPI的四种工作模式(由时钟极性和时钟相位决定)、主从设备之间的数据传输过程、片选信号的作用等。在与外部闪存芯片或者显示屏等设备通信时,SPI协议可能会被用到。
(二)外部通信
- UART通信:这是最基本的串口通信协议,要清楚UART的波特率、数据位、停止位、奇偶校验位等参数的含义和设置方法。在嵌入式系统与上位机(如PC)进行简单的数据传输或者调试信息输出时,经常会使用UART接口。
- 网络通信协议(TCP/IP):对于有网络功能的嵌入式设备,需要了解TCP/IP协议族的分层结构(如网络层的IP协议、传输层的TCP和UDP协议等)。TCP协议的可靠连接建立过程(三次握手)、数据传输的可靠性保证(如确认应答、重传机制等),UDP协议的无连接、高效率、适合实时性要求高的应用场景(如视频流传输)等特性也都是常见考点。
声明:本文网友投稿,观点仅代表作者本人,不代表鲸选型赞同其观点或证实其描述。