嵌入式软件面试基础知识点

本文整理了嵌入式软件面试中常见的知识点,包括STM32时钟系统、C语言堆栈区别、推挽输出概念、单片机故障排查、数据结构与内存管理、串口与并口对比、中断处理流程、预编译作用、指针与函数指针解析、TCP与UDP特性等,旨在帮助准备面试的开发者巩固基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        准备了一些嵌入式软件面试的基础知识点,有一些是面试中常见的问题,大部分问题都配有答案。作者水平有限,部分问题的答案可能会有错误或者没有答案,希望能给秋招春招的同学们一点小帮助。以后如果有补充将会不定时更新!

1、stm32时钟系统(以stm32f1为例)。

(1)stm32时钟源有五个:

        ①HSI_RC(高速内部时钟源,RC振荡电路8MHz)

        ②HSE_OSC(高速外部时钟源,晶振,4~16MHz,一般为8MHz)

        ③LSI_RC(低速内部时钟源,RC振荡电路40KHz)

        ④LSE_OSC(低速外部时钟源,晶振,32.768KHz)

        ⑤PLL_CLK(锁相环时钟源,由HSI或HSE分频得到)

        ps:RC振荡电路产生的时钟源不稳定,一般情况下使用晶振

(2)系统内各时钟来源:

        ①系统时钟(SYSCLK)来源:HSI、HSE、PLL

        ②实时时钟来源:HSE(分频)、LSI、LSE

        ③看门狗时钟来源:LSI

        ④USB时钟来源:PLL(分频)

(3)stm32f1有两条外设时钟总线,分别为APB1和APB2,这两个总线时钟都是由系统时钟(SYSCLK)分频而来,其中APB1为低速时钟总线(通用定时器、串口、I2C、USB),APB2为高速时钟总线(IO口、ADC、SPI)。

 图片源自正点原子STM32配套学习视频PPT

2、C语言堆和栈的区别。

(1)栈区空间较小,由系统自动分配内存空间,同时系统自动释放空间。

    堆区空间较大,需要手动申请空间并指明大小,并且需要手动释放空间。

(2)栈区的空间可以静态分配也可以自动分配。

    堆区的空间都是动态分配,没有静态的堆。

(3)栈区空间较小,所以存放的一般都是生命期比较短的数据,例如函数的参数和局部 变量等。

    堆区空间较大,存放动态申请的内存等。

(4)栈区的地址是连续的,不会产生内存碎片。栈是向低地址扩展的数据结构。

    堆区的地址不一定连续,很容易产生内存碎片。堆是向高地址扩展的数据结构。

3、什么是推挽输出?

        推挽输出是指既可以输出低电平,也可以输出高电平,可以直接驱动功耗不大的数字器件。

        推挽电路是由两个三极管或MOSFET,以推挽方式存在于电路中,电路工作时,两只对称的开关管每次只有一个导通,所以导通损耗小、效率高、既提高电路的负载能力(带负载能力增强),又提高开关速度。

4、单片机上电之后不运行,可能的原因有哪些?

(1)供电电压是否正常

(2)复位引脚是否正常

(3)晶振是否起振

5、举例:单片机的型号和主要参数

        

6、结构体、联合体、sizeof

结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

参考博客:C语言共用体(C语言union用法)详解

7、串口和并口的区别

        串行接口也称串口(Serial Interface),通常指COM接口(例如stm32的串口和电脑上的USB串口),串口数据传输是数据一位一位地按顺序在串口线上进行传输,特点是结构简单,成本低,适用于远距离传输。缺点是传输速度慢。

        并行接口简称并口(Parallel interface),指采用并行传输方式来传输数据的接口标准。并口数据传输是数据多位同时在并口线上进行传输,最常见的是8位并口,特点是传输速度快,缺点是远距离传输成本高。

8、局部变量和全局变量分别存放在哪里

(1)局部变量:栈区

(2)全局变量:静态存储区

(3)动态申请的数据(malloc):堆区

9、精度和分辨率有什么区别

        对于一把10cm的尺子,假设它有100个均匀分布的刻度,那么我们就可以理解为这把尺子的分辨率是10cm/100 = 0.1cm,但是实际上我们并不知道这把尺子是否真的就是10cm,或者说我们并不知道这把尺子的每个刻度是否真的就是0.1cm,因为他可能与真实的0.1cm有一点误差。此时,如果说这把尺子的精度是±5%,那么这把尺子的真实长度可能是9.5cm~10.5cm。所以,分辨率指的是测量仪器在没有误差的情况下所能测得的最小数值,大部分情况下分辨率与分度值相同;而精度则是指测量仪器的测量结果与真实值之间的偏差。

10、static关键字

(1)一个声明为static的局部变量仅初始化一次,在函数调用结束后其值会被保留而不会被释放。

(2)一个声明为static的全局变量,仅能被模块内的其他函数调用而不能在模块外调用。

(3)一个声明为static的函数,仅能在声明它的模块内被调用而不能在模块外调用。

11、SPI

SPI是四线的全双工通信,四根线分别为:

        ①MISO(Master Input Slave Output):主设备数据输入,从设备数据输出

        ②MOSI(Master Output Slave Input):主设备数据输出,从设备数据输入

        ③SCLK:时钟信号,由主设备提供

        ④CS:从设备片选信号,由主设备提供

参考博客:SPI通信协议(SPI总线)学习 - 涛少& - 博客园

12、I2C

(1)I2C是两线的半双工通信,一根时钟线SCL,一根数据线SDA。

(2)I2C协议:

        ①空闲状态:SCL和SDA均为高

        ②START:SCL为高期间,SDA从高到低跳变

        ③END:SCL为高期间,SDA从低到高跳变

        ④ACK(应答):应答信号一般出现在每个字节数据的后面,即第九位,在SCL为高期间SDA持续稳定为底则表示有效应答,如果SDA持续稳定为高则表示否应答。

        ⑤数据的有效性:SCL为高期间,SDA持续稳定为高则表示1,如果SDA持续稳定为低则表示0。

(3)I2C数据包组成:(上图为写,下图为读)

13、中断的处理流程

14、什么是预编译,何时需要预编译

(1)不经常改动的大型代码体可以预编译。多个模块都使用同一标准的头文件和相同的编译条件,可以将所有头文件进行预编译。

(2)预编译指令指示了在程序正式编译前由编译器进行的操作,可以放在程序中的任何位置。

15、一个32位的机器,该机器的指针是多少位?

        指针是多少位取决于地址总线的位数。一个机器是多少位的取决于处理器一次运算所能处理的二进制数的位数。

16、局部变量与全局变量重名

        在局部变量的作用范围内,局部变量会屏蔽全局变量。

17、进程和线程的区别

基本概念:进程是资源分配的最小单位,线程是CPU调度的最小单位。

(1)一个进程可以包含多个线程

(2)同一进程中多个线程之间资源可以共享,不同进程之间资源无法共享

(3)进程比线程消耗更多的资源

(4)进程之间不会互相影响,但是一个线程崩溃将会导致整个进程崩溃

(5)为什么要多线程?

        机器的运行,实际上就是CPU与相关寄存器和RAM之间的数据交流。但是CPU的速度很快,往往比寄存器和RAM的操作快得多,为了提高CPU的利用率,我们往往会创建一个进程,然后在进程下面创建多个线程,让它们轮流获得CPU的使用权,减小CPU的闲置时间。

(6)为什么要多进程?

        对于如果的CPU而言,一个CPU内部可能不是一个核而是多核,多线程技术可以提高CPU中多核的运行效率,最大限度地使用计算机解决问题。

18、TCP和UDP的区别

(1)TCP是面向连接的,UDP是无连接的,即发送数据之前不需要建立连接。

(2)TCP比UDP更可靠,TCP尽可能保证数据无差错,不丢失,不重复且按顺序到达;UDP只是尽最大努力传输数据,不保证数据的可靠性。

(3)UDP省去了繁琐的交互和检错,具有较好的实时性,工作效率比TCP高。适用于需要高速传输和对实时性有较高要求的通信场景。

(4)TCP是点对点通信,UDP支持一对一、一对多、多对一、多对多的通信方式。

19、指针函数与函数指针

(1)定义不同

        指针函数本质是一个函数,其返回值为指针。

        函数指针本质是一个指针,其指向一个函数。

(2)写法不同

        指针函数:int* fun(int x,int y);

        函数指针:int (*fun)(int x,int y);

        可以简单粗暴的理解为,指针函数的*是属于数据类型的,而函数指针的星号是属于函数名的。再简单一点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。

参考博客:函数指针和指针函数用法和区别

20、C语言编译过程

主要流程概括为:

(1)预编译(处理预编译指令),由.c文件生成.i文件

(2)编译(检查语法,优化代码),由.i文件生成.s文件

(3)汇编(由汇编生成机器码),由.s文件生成.o文件

(4)链接(连接各个模块,生成可执行文件),由.o文件生成可执行文件

参考博客:C语言编译和链接过程简介_liuchunjie11的博客-优快云博客_c语言编译过程

 如果有需要word文档的同学可以留下邮箱,给个三连奥!

### 嵌入式领域面试常见问题及答案 #### 硬件与电子基础 对于嵌入式系统的开发者来说,理解底层硬件至关重要。常见的面试题目可能包括微控制器的工作原理、存储器映射以及外设接口的设计。 - **什么是SPI和I2C?两者有何区别?** SPI (Serial Peripheral Interface) 和 I2C (Inter–Integrated Circuit) 是两种常用的串行通信协议。SPI 使用四条线实现全双工数据传输,而 I2C 只需两条线即可工作,并支持多主机和多从机模式[^1]。 ```c // 示例:初始化SPI配置 void spi_init(void){ // 设置SPI参数... } ``` #### 编程语言 C/C++ 由于大多数嵌入式应用都依赖于高效的资源管理,因此熟练掌握C或C++编程是必不可少的技能之一。以下是几个典型的技术考察点: - **解释volatile关键字的作用是什么?** `volatile`告诉编译器该变量可能会被意想不到地改变,比如由外部中断服务程序或其他并行运行的任务修改;所以每次访问此变量时都要重新读取其最新值而不是缓存中的副本。 ```c volatile int flag; if(flag != 0){ /* do something */ } ``` #### 实时操作系统(RTOS) RTOS用于处理时间敏感型应用程序,在工业自动化控制系统等领域广泛应用。了解如何创建任务、信号量机制等概念非常重要。 - **描述一下互斥锁(mutex)和二值信号量(binary semaphore)之间的差异?** 虽然二者都可以用来保护共享资源免受并发访问的影响,但是mutex具有所有权属性——只有获得它的进程可以释放它;相比之下binary semaphore则没有这样的约束条件。 #### Linux环境下的开发技巧 随着越来越多的产品采用基于Linux的操作系统作为平台支撑,熟悉Linux命令行操作、驱动编写等方面的知识变得越来越重要。 - **怎样查看当前目录下所有的文件及其子目录内的所有文件?** 使用`find .`命令可以在指定路径(这里指代为`.`即当前位置)查找符合条件的所有项,包括隐藏文件夹在内的全部内容都会显示出来。 ```bash $ find . ``` #### Bug排查方法论 有效的错误诊断能力可以帮助工程师快速定位问题所在位置从而提高工作效率。这通常涉及到日志记录、调试工具的应用等多个方面。 - **当遇到难以重现的问题时应该采取哪些措施来解决这个问题呢?** 记录详细的上下文信息如输入输出状态变化情况、异常发生前后的时间戳序列号等有助于后续分析;另外还可以借助专业的仿真软件模拟现场场景以便更好地观察现象特征。 #### Git版本控制实践 良好的代码管理和协作习惯能够促进团队间的交流沟通效率提升产品质量。掌握基本的Git指令集对于任何一名现代程序员而言都是至关重要的。 - **如果想要撤销最近一次提交该如何做?** 如果尚未推送到远程仓库,则可以通过执行`git reset --soft HEAD~1`来回退到上一版次的状态而不丢失已做的更改;反之亦然需要先拉取最新的改动再考虑其他解决方案。 ```bash $ git reset --soft HEAD~1 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值