【嵌入式】嵌入式软硬件开辟中常见的口试题,涉及硬件、电子根本知识、算法、C/C++、Linux、及时利用体系、盘算机网络和通讯、bug排查、git版本控制(一连更新中)

[复制链接]
发表于 2026-4-24 08:54:53 | 显示全部楼层 |阅读模式
嵌入式开辟中常见的口试题。从事嵌入式开辟须要把握的软硬件知识须要非常全面,本文整理了一些口试过程中常见的高频题目及其参考答案。涉及硬件、电子根本知识、算法、C/C++、Linux、及时利用体系、盘算机网络和通讯、bug排查、git版本控制(一连更新中)

   🧑 作者简介:现任阿里巴巴嵌入式技能专家,15年工作履历,深耕嵌入式+人工智能范畴,夺目嵌入式范畴开辟、技能管理、简历雇用口试。CSDN优质创作者,提供产物测评、学习辅导、简历口试辅导、毕设辅导、项目开辟、C/C++/Java/Python/Linux/AI等方面的服务,如有须要请站内私信大概接洽恣意文章底部的的VX手刺(ID:gylzbk)
    💬 博主粉丝群先容:① 群内高中生、本科生、研究生、博士生遍布,可相互学习,互换狐疑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以互换写作本事,上榜履历,涨粉秘笈。③ 群内也有职场精英,大厂大佬,可互换技能、口试、找工作的履历。④ 进群免费赠予写作秘笈一份,助你由写作小白提拔为创作大佬。⑤ 进群赠予CSDN批评防封脚本,送真生动粉丝,助你提拔文章热度。有爱好的加文末接洽方式,备注自己的CSDN昵称,拉你进群,相互学习共同进步。
  


嵌入式开辟是指针对嵌入式体系的软件开辟过程。嵌入式体系是一种专用盘算机体系,通常被计划用来控制、监督或辅助利用呆板和装备。这些体系被嵌入到更大的装备或体系中,成为其不可或缺的一部分,因此得名“嵌入式”。
嵌入式开辟涉及硬件和软件的精麋集成,开辟者须要思量到目标硬件的特性、性能限定以及功耗要求等因素。在软件方面,嵌入式开辟通常利用特定的编程语言(如C、C++或汇编语言)来编写步伐,这些步伐直接运行在嵌入式体系的微处理惩罚器或微控制器上。
以是,从事嵌入式开辟须要把握的软硬件知识须要非常全面,本文整理了一些口试过程中常见的高频题目及其参考答案。后续将一连更新。
1. 硬件和电子根本知识

1.1 题目:表明什么是GPIO,以及怎样在嵌入式体系中利用它们?

答案:GPIO(General Purpose Input/Output)是通用输入输出端口的简称,用于与外部硬件举行交互。在嵌入式体系中,我们可以通过编程控制GPIO的输入输出状态,从而实现对外部装备的控制或读取外部装备的状态。
1.2 题目:形貌制止是什么,以及为何以及怎样在嵌入式体系中利用制止?

答案:制止是嵌入式体系中一种紧张的机制,用于在特定变乱发生时打断当前程序的实验,转而实验相应的制止服务步伐。利用制止可以进步体系的相应速率和处理惩罚本事,特殊是在须要及时相应外部变乱的场景下。在嵌入式体系中,我们会设置制止源和制止处理惩罚步伐,并在须要时触发制止。
1.3 题目:简述SPI和I2C通讯协议的区别?

答案:SPI(Serial Peripheral Interface)和I2C(Inter-Integrated Circuit)都是常见的嵌入式体系通讯协议。SPI是一种高速、全双工的同步串行通讯总线,紧张用于微处理惩罚器与外部装备之间的毗连。I2C则是一种双向、半双工的同步串行总线,紧张用于毗连低速外设。两者在通讯速率、毗连方式等方面有所区别,选择利用哪种协议取决于详细的应用需求。
1.4 题目:怎样利用振荡器和时钟在微控制器中产生可靠的时序?

答案:振荡器和时钟是微控制器中用于产生时序信号的关键组件。振荡器产生稳固的频率信号,时钟则根据这个频率信号来产生微控制器所需的时序脉冲。通过设置振荡器的频率和时钟的分频系数,我们可以得到所需的时序精度和稳固性。
2. 编程和算法

2.1 题目:利用C编写一个函数来反转字符串?

答案:以下是一个简单的C函数,用于反转字符串:
  1. void reverseString(char *str) {
  2.     if (str == NULL) {
  3.         return;
  4.     }
  5.     char *end = str + strlen(str) - 1;
  6.     char temp;
  7.     while (str < end) {
  8.         temp = *str;
  9.         *str++ = *end;
  10.         *end-- = temp;
  11.     }
  12. }
复制代码
2.2 题目:怎样在没有利用库函数的环境下检测内存走漏?



  • 答案:检测内存走漏通常涉及到对内存分配和开释的细致跟踪。在没有库函数的环境下,可以通过在分配和开释内存时维护一个全局的内存管理表来实现。每次分配内存时,将相干信息(如所在和巨细)添加到表中;每次开释内存时,从表中移除相干信息。定期查抄这个表,假如发现有未开释的内存块,则大概存在内存走漏。
2.3 题目:形貌在一个不利用动态内存分配的嵌入式体系中管理内存的战略?

答案:在不利用动态内存分配的嵌入式体系中,可以接纳静态内存分配战略。这意味着在步伐编译时,就预先为全部须要的数据布局分配固定的内存空间。如答应以制止运行时的内存分配和开释利用,淘汰内存走漏和碎片化的风险。但须要注意的是,这种战略大概导致内存利用服从不高,因此须要细致规划内存的利用。
2.4 题目:表明什么是“竞态条件”,以及怎样在多线程应用中制止它?

答案:竞态条件(Race Condition)是指两个或多个线程在访问共享数据时,由于实验序次的不确定性而导致的结果差异等或不可猜测的环境。为了制止竞态条件,可以利用互斥锁(Mutex)、信号量(Semaphore)等同步机制来确保同一时间只有一个线程访问共享数据。别的,还可以利用原子利用来确保数据利用的原子性,制止数据被其他线程打断。
3. 嵌入式利用体系

3.1 题目:表明及时利用体系(RTOS)和通用利用体系的紧张区别?

答案:及时利用体系(RTOS)和通用利用体系的紧张区别在于其计划目标和性能特点。RTOS专注于提供可猜测的、确定性的相应时间,以支持及时应用的需求。它通常具有较小的内存占用和高效的调理战略,以确保使命的及时性。而通用利用体系则更注意提供丰富的功能和精良的用户体验,其相应时间大概不那么确定,但通常可以满足一样寻常应用的需求。
3.2 题目:形貌使命调理器在RTOS中的作用是什么?

答案:使命调理器是RTOS中的焦点组件,它负责根据使命的优先级和状态来安排使命的实验序次。调理器会综合思量使命的等候时间、实验时间等因素,以确保使命可以大概按照预定的要求得到实验。通过公道的使命调理战略,RTOS可以进步体系的相应速率和性能
3.3 题目:怎样度量和改进RTOS体系的相应时间和性能?

答案:度量RTOS体系的相应时间和性能可以通太过析使命的实验时间、调理耽误、制止相应时间等指标来实现。改进体系性能的方法包罗优化使命调理算法、优化制止处理惩罚、淘汰使命间的通讯开销等。详细来说,可以针对使命的实验路径举行性能分析,找出瓶颈并举行优化;同时,公道设置制止优先级和处理惩罚流程,淘汰制止对体系性能的影响;别的,通过淘汰不须要的使命间通讯和共享数据,可以低落体系的开销并进步相应速率。
3.4 题目:以arm芯片+linux体系为例,先容从芯片上电从功能全部启动的过程

答案:ARM芯片加Linux体系的启动过程,从芯片上电到功能全部启动,可以大抵分为以下几个阶段:

  • 电源上电与体系Reset

    • 电源接通后,体系起首举行Reset利用,确保芯片和全部相干硬件组件回到初始状态。

  • 内部启动步伐的读取与实验

    • CPU内部的boot ROM开始读取并实验,同时strapping GPIO数值被锁定。
    • 根据strapping GPIO值和SoC内部fuse设置,确定用于启动的装备。

  • 设置信息的读取与DDR RAM的初始化

    • 从启动装备起始位置读取用于设置DDR RAM和定位boot loader的设置信息。对于i.MX6平台,会利用’image vector table (IVT)’ 和 ‘device configuration data (DCD)’,假如从NAND装备启动,还会包罗’boot control blocks (BCB)'。
    • DDR RAM被boot ROM初始化,为后续步伐的运行提供内存空间。

  • Bootloader的加载与实验

    • Bootloader是体系上电后运行的第一段步伐,它紧张完成一些初始化使命,比方初始化RAM和串口,检测处理惩罚器范例,设置Linux启动参数等。
    • Bootloader将Flash中的Linux内核拷贝到RAM中,并跳转到内核的第一条指令处继承实验,从而启动Linux内核。

  • Linux内核的初始化

    • 内核在启动后,起首设置非常向量表,以便正确处理惩罚硬件产生的制止或故障。
    • 内核接着对处理惩罚器举行初始化,包罗设置页表、启用缓存、初始化制止控制器等。
    • 创建第一个用户进程(通常是init进程),并将控制权转交给它。

  • 启动初始化(Init)

    • init进程是用户空间的第一个进程,它继承体系控制权后,会举行一系列的启动初始化工作,比方挂载文件体系、启动体系服务等。

  • 等候应用步伐实验

    • 完成上述全部步调后,体系已经预备好运行应用步伐。此时,Linux体系会等候并相应应用步伐的实验哀求。

在ARM芯片加Linux体系的启动过程中,各个环节精密相连,每个阶段的乐成实验都是确保体系终极可以大概正常运行的关键。别的,对于差异的ARM芯片和Linux发行版,详细的启动过程大概会有所差异,但大要上都会遵照类似的步调和逻辑。
4. C/C++ 语言深入题目

4.1 题目:C和C++语言的紧张区别是什么?

答案:C和C++的紧张区别在于C++支持面向对象编程,包罗类、对象、继承、多态等特性,而C是面向过程的编程语言。别的,C++提供了更丰富的标准库和特性,如模板、非常处理惩罚等,而C则相对简便。在语法上,C++也增长了一些新特性,如定名空间、引用等。
4.2 题目:表明C++中的虚函数(virtual function)和纯虚函数(pure virtual function)?

答案:虚函数是C++中用于实现动态多态性的关键机制。它答应在基类中声明一个函数,并在派生类中提供差异的实现。通过基类指针或引用来调用派生类对象上的虚函数时,会实验派生类中的实现。纯虚函数是一种特殊的虚函数,它在基类中只声明而不界说,且必须在派生类中被重写。包罗纯虚函数的类被称为抽象类,它不能被实例化。
固然可以,以下是两个关于C/C++语言深入的题目:
4.3 题目:请表明C++中的RAII(Resource Acquisition Is Initialization)原则

答案:RAII(Resource Acquisition Is Initialization)是C++中一种紧张的编程原则,它夸大在对象的生命周期中管理资源。根据RAII原则,资源的获取(如动态内存分配、文件句柄、锁等)应该在对象的构造时完成,而资源的开释则应该在对象的析构时自动举行。如许,纵然发生非常或提前退出函数,也能确保资源得到正确开释,制止了资源走漏。
一个常见的RAII应用例子是智能指针(如std::unique_ptr和std::shared_ptr)。这些智能指针在构造时继承资源的全部权,并在析构时自动开释资源。利用智能指针可以制止手动管理内存时的常见题目,如忘记删除指针或多次删除同一指针。
4.4 题目:C++11引入了右值引用和移动语义,请表明它们的概念以及它们怎样资助提拔性能?

答案:在C++11中,右值引用是一种新的引用范例,它绑定到右值(如暂时对象或字面量)而非左值(如变量或长期对象)。通过右值引用和移动语义,C++11引入了一种新的资源管理方式,即移动而非复制资源,从而进步了性能。
移动语义答应对象通过“盗取”其他对象拥有的资源来初始化,而不是创建资源的副本。这通常涉及到互换两个对象内部的指针或句柄,从而制止了不须要的资源分配和开释。
比方,思量一个包罗动态分配内存的类。在C++11之前,当你转达或返回如许的对象时,通常会复制整个对象,包罗其内部的动态内存。这大概会导致性能降落,尤其是当对象很大时。利用移动语义,可以仅移动指针,从而制止了复制内存的开销。
C++11标准库中的许多容器和智能指针都支持移动语义,通过提供移动构造函数和移动赋值运算符来实现。利用std::move函数可以将左值转换为右值引用,从而触发移动利用。
通过公道利用右值引用和移动语义,可以显着进步涉及大量数据或资源转移的代码性能。
5. 软件计划

5.1 题目:形貌嵌入式体系中常用的软件计划模式?

答案:嵌入式体系中常用的软件计划模式包罗状态机模式、观察者模式、单例模式等。状态机模式用于管理对象的状态转换和活动;观察者模式用于实现对象之间的松耦合通讯;单例模式确保一个类只有一个实例,并提供全局访问点。这些模式有助于进步嵌入式体系的可维护性、可扩展性和可靠性。
6. 网络和通讯

6.1 题目:简述TCP/IP模子中每一层的职责?

答案:TCP/IP模子包罗应用层、传输层、网络层和数据链路层。应用层负责处理惩罚特定的应用步伐协议;传输层提供端到端的可靠数据传输服务(如TCP)或无毗连的数据报服务(如UDP);网络层负责将数据报从源主机路由到目标主机;数据链路层则负责将数据帧在相邻节点间举行无不对的传输。
6.2 题目:请表明TCP(传输控制协议)和UDP(用户数据报协议)之间的紧张区别

答案:TCP和UDP是两种紧张的传输层协议,它们在许多方面存在显着的区别。
起首,TCP是一种面向毗连的协议,它在发送数据之前须要先创建毗连。这种毗连机制包管了数据传输的可靠性和序次性,由于TCP会对数据包举行排序和确认,确保数据按照正确的序次到达且没有丢失。而UDP则是一种无毗连的协议,它在发送数据前不须要创建毗连,因此具有更高的传输服从,但大概无法包管数据的可靠性和序次性。
其次,TCP提供流量控制和拥塞控制机制,可以根据网络状态动态调解发送速率,制止网络拥塞。而UDP则没有这些机制,它只管发送数据,不关心对方是否能收到或网络是否拥塞。
末了,由于TCP的复杂性和可靠性要求,它通常用于须要确保数据完备性和序次性的应用,如文件传输、电子邮件等。而UDP则由于其简单和高效,通常用于及时性要求较高的应用,如音视频流、及时游戏等。
6.3 题目:TCP毗连为什么须要3次握手,而不是2次大概4次?

答案:紧张缘故原由如下:

  • 确保两边通讯本事:通过3次握手,客户端和服务器都能确认对方可以大概发送和吸收数据。在第一次握手中,客户端发送SYN包给服务器,表现客户端盼望创建毗连;在第二次握手中,服务器收到SYN包并复兴ACK和SYN,表现服务器同意创建毗连并关照客户端其已预备好;在第三次握手中,客户端收到服务器的SYN+ACK包后,再发送一个ACK包给服务器,表现客户端也预备好了。如许,两边都确认了对方的发送和吸收本事。
  • 防止已失效的毗连哀求报文段突然又传送到了服务端:在TCP毗连中,客户端大概由于某种缘故原由发送了一个SYN包,但该包在网络中丢失了,导致客户端没有收到服务器的回应。假如接纳2次握手,客户端大概会以为毗连已经创建,而服务器现实上并未收到SYN包,这大概导致数据丢失或其他题目。而3次握手则可以确保在这种环境下,客户端可以大概重新发送SYN包,直到收到服务器的回应为止。
  • 制止资源浪费:3次握手中的末了一次是为了让客户端确认收到服务器发送的数据,制止服务器在未收到确认的环境劣等候,造成资源浪费。
至于为什么不须要4次握手,这紧张是由于TCP协议的计划目标是在包管可靠性的同时只管进步服从。过多的握手次数会增长通讯开销和耽误,低落网络性能。因此,3次握手是一个在可靠性和服从之间取得均衡的选择。
总的来说,TCP毗连的3次握手机制确保了两边通讯的可靠性,防止了已失效的哀求报文段造成的题目,并制止了不须要的资源浪费。
7. 设置管理和版本控制

7.1 题目:怎样在嵌入式项目中利用版本控制体系,如Git?

答案:在嵌入式项目中利用Git等版本控制体系可以追踪代码的变革汗青、管理差异版本的代码以及协作开辟。通过Git,可以创建代码堆栈、提交代码更改、查察修改纪录、分支和归并代码等。别的,还可以利用Git的特性如标签、钩子等来辅助项目管理和自动化构建。
7.2 题目:请形貌Git中“commit”的寄义以及它在版本控制中的作用

答案:Git中的“commit”指的是将暂存区(staging area)中的文件改动内容提交到本地堆栈,形成一个新的版本。每一次提交都会天生一个唯一的提交ID(通常是一个SHA-1哈希值),并纪录下改动的详细信息,如提交者、提交时间、提交信息以及改动的文件内容等。通过提交,我们可以纪录项目汗青中的每一个状态,并方便地回溯、查察或规复到某个特定的版本。因此,“commit”在版本控制中起到了生存项目状态、纪录修改汗青以及实现版本回溯的关键作用。
7.2 题目:请形貌Git中“rebase”与“merge”的区别,以及各自的利用场景。

答案:Git中的“rebase”和“merge”都是用于整合差异分支的改动,但它们的工作方式和实用场景有所差异。
merge


  • 工作方式:merge会创建一个新的归并提交,将两个分支的最新改动归并到一起。这个新的提交包罗了两边分支的最新内容,并纪录了归并的汗青。
  • 实用场景:当两个分支并行开辟,且两边改动不辩论或辩论可以轻易办理时,可以利用merge来整合改动。它生存了完备的归并汗青,有助于相识项目标发展过程。
rebase


  • 工作方式:rebase会将一个分支的改动“复制”到另一个分支上,并重新应用这些改动。这现实上是创建了一系列新的提交,这些提交与原始分支的提交具有雷同的改动内容,但基于目标分支的最新状态。
  • 实用场景:当盼望保持一个线性的提交汗青,大概当须要在将改动归并到主分支之前先清算本地分支的提交汗青时,rebase是一个很好的选择。它可以使提交汗青更加清楚和整齐,但须要注意的是,在公共分支上利用rebase大概会导致一些题目,由于它会改变提交的汗青。
总结来说,merge生存了完备的归并汗青,而rebase则创建了一个更线性的提交汗青。选择利用哪一个取决于项目标详细需求和团队的偏好。在处理惩罚公共分支时,通常更倾向于利用merge,以制止潜伏的辩论和杂乱。而在处理惩罚个人分支或须要保持线性汗青的场景时,rebase大概更为符合。
8. 题目排查和调试

8.1 题目:形貌怎样确定并修复嵌入式体系中的内存走漏?

答案:确定和修复嵌入式体系中的内存走漏通常涉及利用内存分析工具来检测走漏点,并检察代码以找出走漏的缘故原由。一旦确定了走漏的位置和缘故原由,就可以通过修改代码来修复它,比方开释不再利用的内存、修复内存分配和开释的匹配题目等。
8.2 题目:什么是死锁?

答案:死锁是指两个或两个以上的进程在实验过程中,由于资源竞争大概由于相互通讯而造成的一种壅闭征象。在这种环境下,若无外力作用,这些进程都将无法继承实验下去,体系此时处于死锁状态。这些因等候其他进程开释资源而无法继承实验的进程,被称为死锁进程。
8.3 题目:怎样排查死锁题目?

答案:排查死锁题目紧张可以接纳以下几种方法:

  • 资源分级:对体系中的各种资源(如CPU、内存、磁盘等)举行分级,优先分配高级别的资源给进程。这有助于淘汰因资源分配不当导致的死锁环境。
  • 哀求和保持:当一个进程在等候一个资源时,假如该资源被其他进程占用,则该进程哀求其他空闲资源,并保持对已分配资源的占据,防止开释大概引起死锁的资源。如答应以低落因资源竞争导致的死锁风险。
  • 检测工具:利用专门的死锁检测工具来监控监控体系的运行状态,一旦检测到死锁征象,这些工具会提供详细的陈诉,资助管理员或开辟者定位题目。
  • 日记分析:查抄体系日记,特殊是与进程和资源利用相干的日记,可以资助辨认大概导致死锁的利用或模式。
  • 代码检察:对大概导致死锁的代码举行细致检察,查抄是否存在不恰当的同步、锁利用或资源分配战略。
9. 安全

9.1 题目:形貌在嵌入式体系中实现安全通讯的方法?



  • 答案:在嵌入式体系中实现安全通讯的方法包罗利用加密协议(如TLS/SSL)来掩护数据传输的机密性和完备性,利用身份验证机制(如数字证书)来验证通讯两边的身份,以及实验访问控制和权限管理来限定对敏感数据和功能的访问。别的,还可以接纳其他安全步伐,如安全启动、代码署名和更新验证等,来进步体系的团体安全性。
9.2 题目:表明为何固件加密对于嵌入式装备至关紧张

答案:固件加密对于嵌入式装备至关紧张,这紧张基于以下几个方面的缘故原由:
起首,固件是嵌入式装备的焦点构成部分,包罗了装备的运行逻辑和功能实现。固件的安全性直接影响到整个装备的运行稳固和数据安全。假如固件被恶意攻击者篡改或注入恶意代码,大概会导致装备功能失效、数据泄漏等严厉结果。因此,通过固件加密可以有用防止潜伏攻击者获取固件的源代码或举行篡改,确保固件的安全性和完备性。
其次,嵌入式装备广泛应用于各个范畴,包罗工业控制、智能家居、医疗装备等。这些装备每每承载偏紧张的数据和功能,一旦受到攻击,大概会对社会生产和人们生存造成严厉影响。比方,在医疗装备中,固件加密可以防止恶意攻击者篡改医疗装备的功能,保障患者的安全。因此,固件加密是保障嵌入式装备安全运行的须要本事。
别的,固件加密还可以进步嵌入式装备的性能。通过公道的加密方案,可以确保固件在装备上的正确加载和运行,制止因固件粉碎或篡改导致的性能降落或装备故障。同时,固件加密还可以防止未经授权的访问和修改,掩护装备的合法权益。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表