【嵌入式面试】嵌入式面试笔试题

目录

引言

面试经验总结

一、进程跟线程的区别

二、中断函数有什么需要注意的地方

三、Linux的常用指令有什么

四、GPIO的作用是什么

五、进程间通信有什么区别

六、死锁现象是如何产生的

死锁的四个必要条件

示例

避免和解决死锁

七、如何避免僵尸线程?

1. 正确使用 pthread_join

2. 避免线程泄露

3. 使用线程池

4. 合理处理线程退出

5. 设置线程属性

6. 检查和调试

八、STM32芯片跟STC芯片的区别

九、C语言跟C++语言的区别

十、Git的使用流程,上传Git的指令是什么

十一、如何管理内存?

十二、你用过快速排序嘛?请你讲一下快速排序算法是如何实现的。

十三、SPI的工作模式、工作模式由什么决定

十四、解释一下资源争竞现象

十五、IIC协议是什么模式?IIC协议从机可以变为主机吗?

15.1 一主多从和多主多从模式的区别

15.2 软件IIC和硬件IIC的区别

15.3 IIC协议主机可以变为从机

十六、内存的几个区域,局部变量存储在哪个区域?

十七、项目的摄像头用的是什么接口?

十八、使用的TCP/IP协议的体现

十九、堆和桟的区别


引言

找工作太难啦,笔试的时候才发现自己的水平有多差,要好好努力!

持续更新,记录找工作期间遇到的各种面试题目!

面试经验总结

2024年8月20 面试了深圳一家公司的单片机方向 一定要做好简历上的复习,和对方工作岗位的一些知识的复习,然后约定的面试时间不要太赶,一定要缓一天两天去复习准备。

一、进程跟线程的区别

进程和线程的主要区别在于它们的基本结构和功能:

  • 进程:是程序执行的基本单位,每个进程拥有独立的内存空间和系统资源。进程间的通信相对复杂,因为它们有各自的内存区域。进程之间的隔离提供了更高的安全性和稳定性。

  • 线程:是进程内的执行单元,同一个进程中的线程共享内存和资源,但各自有独立的执行栈和程序计数器。线程间的通信和数据共享相对简单,但也需要注意同步问题,以避免竞争条件。

总的来说,线程比进程创建和销毁的开销小,但进程提供了更好的隔离性和稳定性。

二、中断函数有什么需要注意的地方

三、Linux的常用指令有什么

四、GPIO的作用是什么

五、进程间通信有什么区别

进程间通信(Inter-Process Communication, IPC)是指不同进程之间交换数据或信息的机制。不同的IPC方法有各自的特点和适用场景,常见的IPC机制包括:

  1. 管道(Pipes):

    • 匿名管道:用于父子进程之间的通信,通常在创建子进程时指定。数据流单向,适合于简单的通信需求。
    • 命名管道(FIFO):允许无亲缘关系的进程间通信。数据流单向,但管道有名字,可以在系统的文件系统中查看。
  2. 消息队列(Message Queues):

    • 提供了一个消息存储区,进程可以将消息发送到队列中,其他进程可以从队列中读取消息。支持异步通信,消息的顺序性和优先级可以得到管理。
  3. 共享内存(Shared Memory):

    • 允许多个进程访问同一块内存区域。适用于需要高效、大量数据交换的场景,但需要额外的同步机制(如信号量)来避免竞争条件。
  4. 信号量(Semaphores):

    • 主要用于进程同步。通过信号量可以控制进程对共享资源的访问。信号量自身不传输数据,而是用于协作进程间的资源控制。
  5. 套接字(Sockets):

    • 可以用于不同主机上的进程之间的通信,也可以用于同一主机上的进程通信。支持面向连接(TCP)和无连接(UDP)两种通信方式,灵活性高。
  6. 内存映射文件(Memory-Mapped Files):

    • 允许将文件映射到进程的地址空间中,进程可以通过内存操作文件内容。这种方式适合于需要高效文件访问的场景。
  7. 信号(Signals):

    • 用于进程间通知和事件处理,例如终止信号、停止信号等。信号本质上是一个简单的通知机制,不适合用于传输复杂数据。

主要区别

  • 效率:共享内存通常比消息队列和管道更高效,因为它避免了数据复制的开销。
  • 复杂性:共享内存需要额外的同步机制来避免数据竞争,而管道和消息队列提供了内建的同步机制。
  • 数据交换的方式:管道和消息队列提供的是流式或消息的方式,适合处理有序的数据流或消息;而共享内存允许直接操作数据,适合大规模数据的交换。
  • 灵活性:套接字提供了广泛的通信能力,可以在不同主机之间进行通信,但也更复杂。

六、死锁现象是如何产生的

死锁(Deadlock)是一种多线程或多进程环境下的现象,当两个或多个线程或进程在等待彼此释放资源时,就会导致程序的所有相关线程或进程无法继续执行,从而陷入一种永久的等待状态。死锁的产生通常涉及以下几个关键条件:

死锁的四个必要条件

  1. 互斥条件(Mutual Exclusion)

    • 资源只能被一个线程或进程独占。如果一个线程或进程正在使用某个资源,其他线程或进程只能等待该资源释放。
  2. 占有并等待条件(Hold and Wait)

    • 一个线程或进程已经持有了某些资源,并且在等待其他资源被释放。这意味着一个线程在拥有某些资源的情况下,还能请求额外的资源。
  3. 非抢占条件(No Preemption)

    • 资源不能被强制从持有者那里抢走,只能由持有者自行释放。这意味着资源的释放必须是由持有者自愿完成的。
  4. 循环等待条件(Circular Wait)

    • 存在一个等待资源的环路,其中每个线程或进程都在等待下一个线程或进程释放它所需要的资源。

示例

考虑一个简单的例子,两个线程 T1T2 分别持有资源 R1R2,同时都需要对方持有的资源:

  1. 线程 T1 持有资源 R1 并请求资源 R2
  2. 线程 T2 持有资源 R2 并请求资源 R1

这就导致了一个环路的等待条件:T1T2T1。由于两个线程都在等待对方释放它们需要的资源,导致了死锁现象。

避免和解决死锁

  1. 资源分配策略

    • 避免死锁:使用策略来避免满足所有四个死锁条件。例如,可以使用银行家算法来安全地分配资源,确保系统处于安全状态,从而避免死锁。
    • 检测和恢复:运行时检测死锁并采取措施恢复。例如,可以使用资源分配图来检测死锁,并采取回滚或终止部分进程的策略来恢复系统正常运行。
  2. 破坏条件

    • 破坏互斥条件:使资源能够被多个线程共享,但这可能不总是实际可行的。
    • 破坏占有并等待条件:要求线程在请求资源之前释放已持有的所有资源。
    • 破坏非抢占条件:允许系统强行抢占资源。例如,可以使用优先级调度来强制线程释放资源。
    • 破坏循环等待条件:对所有资源进行编号,并要求线程按照一定的顺序请求资源,以防止形成循环等待。
  3. 设计良好的同步机制

    • 使用适当的锁机制,例如读写锁、递归锁等,确保资源的正确使用。
    • 使用高级并发工具和库来简化资源管理,避免手动管理低级资源带来的复杂性。

通过理解和应用这些策略,可以有效地避免和处理死锁问题,从而提高系统的可靠性和性能。

七、如何避免僵尸线程?

僵尸线程(Zombie Threads)是指那些已经结束但仍然在系统中存在的线程。这种线程通常是因为它们的终止状态尚未被父线程收集。为避免僵尸线程,可以采取以下几种方法:

1. 正确使用 pthread_join

在多线程编程中,父线程应该调用 pthread_join 来等待子线程的终止并收集其退出状态。这确保了系统资源的回收,避免了僵尸线程的出现

2. 避免线程泄露

如果创建的线程不再需要,可以在主线程或创建线程的线程中确保调用 pthread_join。如果线程是在循环中创建的,确保在循环结束之前调用 pthread_join 来处理每个线程的状态。

3. 使用线程池

线程池可以管理线程的生命周期,并重用线程来执行任务。线程池中的线程在任务完成后不会被立即销毁,而是被复用。这样可以有效地减少线程创建和销毁的开销,同时避免僵尸线程。

4. 合理处理线程退出

在线程结束时,可以使用 pthread_exit 来主动退出线程,并且在父线程中使用 pthread_join 来确保状态被收集。

5. 设置线程属性

设置线程的属性为分离状态,这样线程在结束后会自动释放资源。使用 pthread_detach 可以将线程设置为分离状态

6. 检查和调试

使用工具如 valgrindgdb 来检测和调试线程相关问题。这些工具可以帮助找出线程管理中的问题和僵尸线程的存在。

通过这些方法,可以有效地避免和处理僵尸线程,确保程序的资源得到正确管理。

八、STM32芯片跟STC芯片的区别

九、C语言跟C++语言的区别

十、Git的使用流程,上传Git的指令是什么

十一、如何管理内存?

十二、你用过快速排序嘛?请你讲一下快速排序算法是如何实现的。

十三、SPI的工作模式、工作模式由什么决定

SPI是一主多从,全双工的工作模式

它的协议模式有四种,由配置时钟极性CPOL和时钟相位CPHA进行协议模式指定,默认为模式0,即时钟空闲为低电平,在上升沿时进行数据采样

十四、解释一下资源争竞现象

十五、IIC协议是什么模式?IIC协议从机可以变为主机吗?

IIC协议有一主多从模式和多主多从模式。

15.1 一主多从和多主多从模式的区别

一个主机和多个从机,主机拥有SCL时钟总线的绝对控制权。主机通过从设备的设备地址对指定的设备进行通信。

多个主机和多个从机,多个主机发起响应时,产生总线冲突,进行总线仲裁,仲裁成功的主机先占用SCL时钟总线,然后对需要通信的从设备地址进行通信。

协议上还区分软件IIC和硬件IIC。

15.2 软件IIC和硬件IIC的区别

软件IIC的资源比较丰富,只需要任意两根可以正常工作的GPIO引脚作SCL总线和SDA总线。

硬件IIC的资源为单片机固定的IIC外设,一般SCL总线的引脚和SDA总线的引脚限制为固定的GPIO引脚,能挂载的资源相对软件IIC更有限,但是通信的频率和波形都比软件IIC的好。

15.3 IIC协议主机可以变为从机

例如STM32的硬件IIC中,STM32初始化默认设置为从设备,当需要启用为主设备时,调用起始条件会自动配置为主设备。

十六、内存的几个区域,局部变量存储在哪个区域?

十七、项目的摄像头用的是什么接口?

十八、使用的TCP/IP协议的体现

十九、堆和桟的区别

在嵌入式系统中,堆(Heap)和栈(Stack)主要区别在于内存分配方式和用途。

栈用于自动分配和释放内存,速度快但大小有限;适用于函数调用、局部变量等。

堆则用于动态内存分配,大小灵活但管理复杂;适合需要在运行时动态分配和释放内存的场景。

栈的内存使用较为高效,而堆则提供了更大的灵活性。

二十、什么是I2S协议

二十一、什么是CAN协议

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跳河轻生的鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值