嵌入式Free RTOS常见面试题详解汇总
嵌入式Free RTOS单片机STM32面试题汇总,积累多多~看完轻松面对面试官~
嵌入式Free RTOS单片机STM32面试题汇总
用关键词搜索:单片机、STM32、FreeRTOS等;
FreeRTOS 主要知识点
1.核心概念
任务(Task):FreeRTOS 中的基本执行单元,具有运行态、就绪态、阻塞态、挂起态和删除态。
任务调度:支持抢占式、时间片轮转和合作式调度。
内核对象:包括队列、信号量、互斥量、事件组和任务通知,用于任务间通信和同步。
2.任务管理
创建任务:通过 xTaskCreate 或静态创建方式。
删除任务:使用 vTaskDelete。
任务优先级:内核根据任务优先级调度,优先级越高,越先获得 CPU。
3.内存管理
提供静态和动态内存分配。
动态内存分配通过 pvPortMalloc 和 vPortFree 实现。
4.同步与通信
队列:用于任务间或中断与任务间的消息传递。
信号量:分为二值信号量和互斥量,用于任务同步和互斥。
事件组:用于任务间的同步。
任务通知:一种轻量级的任务间通信方式。
5.低功耗支持
Tickless 模式:在系统空闲时关闭滴答定时器以降低功耗。
空闲任务回调:可在空闲任务中执行低功耗代码。
6.移植与配置
通过 FreeRTOSConfig.h 配置系统功能,如任务优先级、调度策略和滴答定时器频率。
移植时需根据硬件平台选择合适的内存管理方案。
常见面试题
1.基础概念
FreeRTOS 的任务状态有哪些?
Ready:就绪态
Running:运行态
Suspended:挂起态
Blocked:阻塞态
FreeRTOS 的调度方式有哪些?
时间片轮转:相同优先级的任务具有相同的时间片(1ms)
抢占式调度:高优先级的任务可以强制低优先级的任务执行
协作式调度:vTaskDelay,信号量,互斥量
FreeRTOS 的内核对象有哪些?
croutine.c:协程
event_gropus.c:事件组
list.c:链表
queue.c:队列
stream_buffer:流缓冲区
tasks.c:任务
timers.c:软件定时器
heap:内存管理
2.任务管理
如何创建和删除任务?
如何动态调整任务优先级?
如何避免任务优先级反转?任务优先级反转:低优先级的任务先于高优先级的任务执行
互斥量:优先级继承
3.同步与通信
如何使用队列实现任务间通信?
1.创建队列
2.读写
信号量和互斥量的区别?
1.信号量:二进制信号量,计数型信号量,互斥量只有0和1
2.使用信号量的时候可能发生优先级反转,互斥量可以避免优先级反转(优先级继承)
3.信号量:同步和互斥,互斥量:互斥(保护共享资源)
如何使用事件组?
1.创建事件组
2.设置事件组
3.读取事件组
4.内存管理
FreeRTOS 的内存分配方案有哪些?
FreeRTOS 提供了多种内存管理方案,以适应不同的嵌入式系统需求。以下是它们的对比总结表:
如何避免内存泄漏?
在 FreeRTOS 中,避免内存泄漏的方法主要包括以下几个方面:
1. 选择合适的内存管理方案
1.避免 heap_1(无法释放内存),如果需要动态释放,建议使用 heap_4 或 heap_5。
2.heap_3 依赖 C 库的 malloc/free,可能会带来碎片化问题,需要注意管理。
2. 确保正确释放动态分配的资源
1.调用 vTaskDelete() 删除任务后,确保删除任务使用的 动态内存(如 pvPortMalloc() 分配的内存)也被释放。
2. vQueueDelete() 释放队列,vSemaphoreDelete() 释放信号量和互斥量,避免资源泄漏。
3. 避免内存碎片化
1.采用 固定大小的内存块,减少频繁的分配和释放(heap_4 会自动整理碎片)。
2.预先分配任务栈、消息队列等资源,避免运行时频繁申请/释放。
4. 使用 FreeRTOS 内存管理 API
1.pvPortMalloc() 和 vPortFree() 替代标准的 malloc/free,保证内存分配可控。
2.xPortGetFreeHeapSize() 监测剩余堆空间,xPortGetMinimumEverFreeHeapSize() 获取最低历史可用堆大小,以检查内存使用情况。
5. 使用 configASSERT() 捕获错误
1.配置 configASSERT() 以捕获任务栈溢出、非法访问等问题。
2.启用 configCHECK_FOR_STACK_OVERFLOW,可自动检测任务栈溢出。
6. 使用 uxTaskGetStackHighWaterMark() 监测任务栈
1.定期调用 uxTaskGetStackHighWaterMark() 检查最小剩余栈空间,避免任务栈溢出导致未定义行为。
7. 避免创建未使用的任务和资源
1.定期检查 vTaskList() 输出的任务状态,找出是否有长期空闲但未释放的任务。
2.确保不重复创建队列、信号量、定时器等对象,否则会导致泄漏。
8. 启用 FreeRTOS 运行时内存统计
1.通过 vTaskGetRunTimeStats() 或 vTaskList() 分析任务的资源占用情况。
2.结合 heap_4 机制,利用 xPortGetMinimumEverFreeHeapSize() 监测堆的最小剩余空间,判断是否有内存泄漏。
总结:选择合适的内存管理策略、确保正确释放资源、定期监测内存使用情况,并使用 FreeRTOS 提供的 API 进行调试,是避免内存泄漏的关键。
5.低功耗支持
FreeRTOS 的 Tickless 模式是如何工作的?
FreeRTOS 的 Tickless 模式是为了降低功耗而设计的。当系统处于空闲状态时,不再依赖固定频率的滴答定时器中断,而是通过计算任务的空闲时间,动态设置下一次定时器中断的触发时刻。这样,系统可以进入低功耗模式,直到下一次事件或任务需要调度时才唤醒。
工作流程:
1.空闲时计算中断时间: FreeRTOS 计算下一次任务调度所需的时间。
2.进入低功耗模式: 系统进入低功耗模式,等待定时器中断。
3.定时器中断唤醒: 当定时器到期时,CPU 唤醒并继续调度任务。
优点:
4.节省功耗,延长电池寿命。
配置:
在 FreeRTOSConfig.h 中启用:
#define configUSE_TICKLESS_IDLE 1
如何通过空闲任务实现低功耗?
通过 空闲任务 实现低功耗的关键在于利用 FreeRTOS 提供的空闲任务(Idle Task),让系统在没有活动任务时进入低功耗模式。具体方法如下:
1.空闲任务: 在 FreeRTOS 中,空闲任务会在没有其他任务需要执行时被调度运行。
2.进入低功耗模式: 在空闲任务中,可以调用硬件相关的低功耗函数(如进入待机模式、睡眠模式等),使 CPU 进入省电状态,减少功耗。
3.唤醒机制: 当有新的任务需要执行时,系统会被中断唤醒,空闲任务结束,恢复正常运行。
示例:
在空闲任务中使用如下代码进入低功耗模式:
void vApplicationIdleHook(void)
{
// 进入低功耗模式
enterLowPowerMode();
}
6. 移植与配置
如何移植 FreeRTOS?
1.复制响应的组件(.c .h文件)
2.FreeRTOSConfig.h移植过来
3.编译解决报错问题(缺少头文件,路径问题)
4.
如何通过 FreeRTOSConfig.h 进行系统配置?
FreeRTOSConfig.h是RTOS中的一个配置文件,通过配置文件可以去打开或者是关闭RTOS中的功能。
通过对应的宏去修改或者是打开关闭具体的功能:
7. 实际应用
如何在 FreeRTOS 中实现定时任务?
1.创建任务,设置时间
2.使用软件定时器
3.使用硬件定时器
如何处理任务间的共享资源?
使用信号量,互斥量保护共享资源
如何优化 FreeRTOS 的性能?
1. 减少中断延迟
中断优先级配置:在 FreeRTOS 中,中断优先级直接影响任务的调度。确保 FreeRTOS 内核的最大中断优先级低于系统的中断优先级,以避免中断中断内核操作。
中断服务例程(ISR)优化:在 ISR 中避免执行复杂的操作,将大部分处理推迟到任务中。尽量保持 ISR 执行时间短。
2. 任务调度优化
任务优先级设计:合理设置任务的优先级,避免任务饥饿。通过优先级反转控制机制(如使用 FreeRTOS 的优先级继承机制)避免低优先级任务占用高优先级任务资源。
简化任务栈:减小任务栈的大小,避免分配过多内存给任务栈。可以使用 FreeRTOS 提供的 configSTACK_DEPTH_TYPE 来调整任务栈的深度。
3. 内存管理优化
堆内存分配优化:选择合适的内存分配器(如 heap_4.c 或 heap_5.c)。一些内存分配器(如 heap_1.c)提供简单且快速的内存分配,但功能有限。对于更复杂的内存管理需求,可以选择更高效的分配策略。
避免动态内存分配:尽量避免在任务执行过程中动态分配内存,尤其是实时性要求高的任务,建议使用静态内存分配。
4. 定时器优化
时间片和Tick频率调节:根据实际需求调整系统时钟频率(configTICK_RATE_HZ)。较低的 Tick 频率可能会降低调度的频率,但也能减少系统的运行开销。高频率的 Tick 可能带来较高的调度频率,但也会增加 CPU 占用。
定时器合并:如果多个任务依赖于定时器,可以通过合并多个定时器事件来减少中断次数。
5. 优化任务切换
任务切换时间优化:通过调整任务切换的上下文保存和恢复的实现,减少任务切换的开销。合理设计任务的 CPU 占用时间,避免过于频繁的上下文切换。
使用协作调度:如果不需要严格的实时性,考虑使用协作调度(如任务主动放弃 CPU 使用时间)。这将减少任务切换的频率。
6. 使用轻量级同步机制
避免使用较重的同步机制:使用 binary semaphore 或 mutex 时,要避免不必要的加锁和解锁,特别是在实时要求较高的情况下。可以考虑使用基于信号量的轻量级同步机制来避免占用过多的 CPU 时间。
使用任务通知机制:任务通知(task notifications)是 FreeRTOS 提供的高效同步机制,能显著降低内存占用并提高效率。
7. 使用断点调试
分析瓶颈:使用 FreeRTOS 提供的性能分析工具,来查找任务、定时器、中断等方面的性能瓶颈。
调试工具:通过 JTAG 或 SWD 等调试接口,查看系统中断频率、任务切换频率等信息,分析任务执行和资源使用情况,进一步优化代码。
8. 优化系统中断
减少中断服务程序(ISR)的时间:在 ISR 中避免长时间运行的操作,把复杂的操作延迟到任务中处理。
减少中断的数量和频率:降低频繁中断的来源,减少 ISR 的负担,从而提高系统效率。
9. 任务管理
任务的优先级调度:合理配置任务的优先级,避免频繁的任务抢占导致的频繁上下文切换。
任务堆栈大小:根据每个任务的实际需求调整任务的堆栈大小,过大的堆栈会浪费内存,过小的堆栈可能导致堆栈溢出。
10. 降低系统负荷
减少不必要的功能调用:减少任务中的不必要计算和函数调用,优化常用代码路径。
适当使用空闲任务:在 FreeRTOS 中使用 vTaskDelay() 或 vTaskDelayUntil() 来使得任务在等待时不会占用 CPU。
8.其他
FreeRTOS 的启动流程。
1.初始化调度器
2.启动调度器
3.创建空闲任务
4.开启任务的调度
如何调试 FreeRTOS 中的任务?
如何监控任务的运行状态?
1. 使用 FreeRTOS 提供的 API 获取任务状态
FreeRTOS 提供了几个 API 函数,可以用来查询任务的状态或获取任务的信息:
eTaskGetState():eTaskGetState() 用来获取某个任务的当前状态。它返回一个 eTaskState 枚举值,表示任务的状态。
#include "FreeRTOS.h"
#include "task.h"
eTaskState eTaskGetState(TaskHandle_t xTask);
eTaskState 枚举包括以下状态:
eRunning:任务正在运行。
eReady:任务处于就绪状态,等待调度器选择运行。
eBlocked:任务被阻塞,等待某个事件(例如信号量、队列等)。
eSuspended:任务处于挂起状态,不会被调度。
eDeleted:任务已经被删除。
使用 eTaskGetState() 可以帮助你查询某个任务的状态:
TaskHandle_t xTaskHandle; // 要查询状态的任务句柄
eTaskState taskState;
taskState = eTaskGetState(xTaskHandle);
switch (taskState)
{
case eRunning:
// 任务正在运行
break;
case eReady:
// 任务准备好运行
break;
case eBlocked:
// 任务被阻塞
break;
case eSuspended:
// 任务被挂起
break;
case eDeleted:
// 任务已被删除
break;
default:
break;
}
2. 通过任务通知(Task Notifications)进行监控
FreeRTOS 任务通知是一种轻量级的机制,可以用于监控任务状态。你可以在任务内部通过任务通知机制传递状态信息。
xTaskNotifyGive(xTaskHandle); // 通知任务运行状态变更
其他任务可以通过 ulTaskNotifyTake() 或 xTaskNotifyWait() 等函数来等待任务状态的更新。
例如,你可以让一个任务在运行时通知其他任务它的状态:
void vTaskFunction(void *pvParameters)
{
// 任务执行的代码
// 假设任务执行过程中会发送一个通知
xTaskNotifyGive(xTaskHandle); // 通知主任务
}
3. 使用 FreeRTOS 内存分析工具
FreeRTOS 提供了几个内存和任务监控工具,可以帮助你查看任务的栈大小、任务间的内存使用情况等:
uxTaskGetStackHighWaterMark(): 这个函数返回指定任务栈的最小剩余空间。监控栈的使用情况对于判断任务是否有栈溢出风险非常重要。
UBaseType_t uxHighWaterMark;
uxHighWaterMark = uxTaskGetStackHighWaterMark(xTaskHandle);
printf("Task's stack high water mark: %d\n", uxHighWaterMark);
如果 uxHighWaterMark 返回的值接近零,说明该任务的栈空间几乎用完,可能会发生栈溢出。
4. 使用 FreeRTOS Trace Tools(如 FreeRTOS+Trace)
FreeRTOS 提供了一些跟踪工具,如 FreeRTOS+Trace,这是一种图形化的工具,可以帮助你可视化任务的调度、任务间的切换、ISR 调用等。通过这种工具,你可以实时监控任务的运行状态,查看任务执行的时间、频率以及任务切换的情况。
FreeRTOS+Trace 的优势是它能生成详细的时间轴,帮助你分析任务的执行顺序、性能瓶颈以及系统的实时行为。
5. 任务调度日志
通过在任务的代码中加入日志打印,手动记录任务的状态信息,可以帮助你跟踪任务的运行。比如,在任务的执行过程中添加如下代码:
void vTaskFunction(void *pvParameters)
{
printf("Task started.\n");
while (1)
{
printf("Task running...\n");
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
你也可以通过串口、UART 或其他通讯接口实时输出任务的状态,帮助调试和监控。
6. 使用 SystemView(SEGGER)
SEGGER 提供了一个工具叫 SystemView,它用于实时监控嵌入式系统中的 FreeRTOS 任务调度。通过 SystemView,你可以看到任务的执行情况、任务切换、系统调用、计时等信息。它会生成一个图形化的时间线,帮助开发者理解任务的行为和实时调度情况。
7. 使用软中断(Software Interrupts)或硬件定时器
你还可以使用硬件定时器或软件定时器来定期检查任务状态,或使用软中断机制将任务状态传递到其他任务或系统中。
8. 使用 Idle Hook 函数
FreeRTOS 提供了一个 空闲钩子(Idle Hook) 函数,它在每次调度器空闲时调用。在这里,你可以检测系统的整体状态(例如系统是否有任务可运行),或者将系统资源的使用情况发送到外部设备或记录日志。
void vApplicationIdleHook(void)
{
// 在空闲时进行任务状态检查或记录
}
总结:
要监控 FreeRTOS 任务的运行状态,主要有以下几种方法:
使用 eTaskGetState() 查询任务状态。
使用任务通知进行任务间通信和监控。
使用内存分析工具(如 uxTaskGetStackHighWaterMark())检测栈的使用情况。
使用外部工具如 FreeRTOS+Trace 或 SEGGER SystemView 进行更精细的监控。
通过日志和调试输出记录任务的状态信息。
结合这些方法,可以有效地监控 FreeRTOS 中任务的状态和系统行为,帮助调试和优化系统。
一、单片机常见经典面试题目
1. 单片机IO口开漏输出和推挽输出的区别
**开漏输出:**只能输出低电平,要输出高电平需通过上拉电阻实现,类似于三极管的集电极输出。
**推挽输出:**可输出低电平和高电平,能够直接驱动功耗较小的数字器件,具有较低的导通损耗和高效率,且提高了电路的负载能力和开关速度。
拓展:STM32的8种GPIO模式
浮空输入:I/O电平不确定,由外部决定。
上拉输入:悬空时电平保持高电平。
下拉输入:悬空时电平保持低电平。
模拟输入:输入模拟信号到片上外设模块。
开漏输出:需要外部上拉或下拉电阻来决定电平。
开漏复用输出:外设模块控制电平。
推挽输出:由P-MOS和N-MOS控制电平。
2. 单片机定时器的作用和优势
**作用:**计数、延时、输入捕获、输出比较(如输出PWM)、产生中断等。
**优势:**无需CPU参与,精度高。
3. 同步通信和异步通信的区别
**同步通信:**发送和接收需要相同的时钟频率,按帧发送数据。
**异步通信:**无需保持相同时钟,起始位和结束位用于判断数据到达。
4. 什么是中断?
当CPU正在执行程序时,因外部或内部事件使得CPU暂停当前工作,去执行中断服务程序。执行完毕后,恢复现场并继续执行原程序。
中断过程:
1.保护现场,将PC地址压栈。
2.执行中断服务程序。
3.恢复现场,将PC从栈中取回。
4.继续执行被中断的指令。
5. SPI、IIC、UART接口的区别及数据收发方式
**SPI(全双工,四线):**速度快,但无流控和应答机制。通过MISO、MOSI、SCLK、CS线进行通信。
**IIC(半双工,两线):**简单,支持多主控,速度较慢。通过SDA和SCL线通信。
**UART(全双工,两线):**无需时钟,传输距离远,有检错机制。通过RX和TX进行通信。
6. 无线通信技术简介
**BLE(蓝牙):**近距离通信,频段为2.4GHz ISM频段,适用于短距离、低功耗场景。
**WIFI:**基于802.11b协议,频率为2.4GHz,速度可达11Mbps,覆盖范围约100米。
**NFC:**短距离通信,频率为13.56MHz,用于双向识别和连接。
**Zigbee:**低速、低功耗无线通信技术,支持复杂拓扑结构,使用2.4GHz频段。
7. MQTT、CoAP、HTTP三种协议的区别
**MQTT:**基于TCP协议,常用于物联网消息发布和订阅。
**CoAP:**基于UDP协议,适合低资源设备和低功耗网络。
**HTTP:**基于TCP协议,主要用于Web通信,传输开销较大。
8. TCP的三次握手和四次挥手过程
三次握手:客户端发送SYN请求,服务器返回SYN+ACK。
客户端发送确认包,建立连接。
四次挥手:客户端发送FIN请求,服务器ACK。
服务器处理完后发送FIN,客户端ACK,连接断开。
9. C语言:找到数组中最小值
int get_min(int* array, int n) {
int min = array[0];
for (int i = 1; i < n; i++) {
if (array[i] < min) {
min = array[i];
}
}
return min;
}
10. 摩拜单车生产的多线程机制
工序A每5分钟生产一辆单车,工序B每1分钟检测一辆,检测失败需返回工序A重新生产。多线程机制可使用生产者-消费者模型最大化产能。
11. 关于指针的定义
指向指针的指针,指向一个整型数: int **a;
有10个指向整型数的指针数组: int *a[10];
指向有10个整型数数组的指针: int (*a)[10];
二、(嵌入式)面试必须掌握的题目
1. STM32的I2C通信协议的工作原理是什么?
2. 请描述I2C总线的优缺点。
3. SPI通信协议与I2C相比有哪些优势和劣势?
4. STM32中如何配置SPI通信?
5. 什么是USART,如何在STM32中使用它?
6. 请解释ARM Cortex-M3的中断处理机制。
7. 中断服务例程(ISR)应该注意哪些事项?
8. 如何在STM32中实现中断优先级管理?
9. 中断和异常的具体区别是什么?
10. 请描述ARM处理器的工作模式及其特性。
11. IRQ和FIQ中断请求的主要区别是什么?
12. 什么是PLL(锁相环),在STM32中如何配置?
13. STM32的时钟系统是如何工作的?
14. 请解释STM32中HSI和HSE的区别。
15. 如何在STM32中使用定时器?
16. STM32如何实现PWM信号的生成?
17. 请描述STM32中GPIO的基本使用方法。
18. 在嵌入式系统中,如何进行错误处理和异常管理?
19. STM32的ADC和DAC的工作原理是什么?
20. 如何在STM32中实现看门狗定时器?
21. 请解释嵌入式系统中的DMA(直接内存访问)及其优势。
22. 如何在STM32中配置和使用RTOS?
23. 请描述嵌入式系统中的多线程编程模型。
24. STM32如何实现数据持久化?
25. 请解释在嵌入式系统中如何进行功耗管理。
26. STM32中的Flash存储器是如何工作的?
27. 如何在STM32中实现固件升级?
28. 请描述嵌入式系统中的状态机设计模式。
29. STM32如何与外部设备进行通信?
1. 请解释嵌入式系统中的资源管理和优化策略。
三、嵌入式面试题及答案
1、请解释如何在STM32中生成PWM波,以及如何计算其频率和占空比。
解答:
在STM32中,PWM(脉宽调制)波形的生成依赖于定时器模块。PWM的频率和占空比的计算涉及定时器的时钟频率、预分频器(Prescaler)、自动重装载寄存器(ARR,Auto-Reload Register)和捕获比较寄存器(CCR,Capture/Compare Register)的值。
● PWM频率:PWM的频率由定时器的时钟频率和自动重装载寄存器的值决定。公式如下:[PWM_Frequency = \frac{Timer_Clock}{(ARR + 1)}]其中,Timer_Clock 是定时器的输入时钟频率,ARR 是自动重装载寄存器的值。
● PWM占空比:占空比由捕获比较寄存器(CCR)的值与自动重装载寄存器(ARR)的值确定。公式如下:[Duty_Cycle (%) = \frac{CCR}{ARR + 1} \times 100%]通过改变 ARR 和 CCR 的值,可以调整PWM的频率和占空比。
2、FreeRTOS和RT-Thread两个实时操作系统有何主要区别?请从系统架构、任务管理、内存管理、和应用场景等方面进行比较。
解答:
FreeRTOS和RT-Thread都是广泛使用的嵌入式实时操作系统,但在系统架构、功能设计和应用场景上存在一定区别:
● 系统架构:FreeRTOS: 轻量级,内核非常小巧,核心代码量少,设计简单,适合资源有限的系统。RT-Thread: 更为丰富的功能模块,包含完整的组件和软件包管理器,扩展性更强,但相应的占用资源也更多。
● 任务管理:FreeRTOS: 采用基于优先级的抢占式调度,支持静态和动态任务创建。RT-Thread: 支持优先级调度,时间片轮转等,且内置更多的任务管理特性,如信号量、消息队列等。
● 内存管理:FreeRTOS: 提供简单的内存分配方式,通常采用静态分配或者小块动态分配。RT-Thread: 支持动态内存管理,提供了更复杂的内存管理机制,如堆和栈的管理。
● 应用场景:FreeRTOS: 适用于内存和资源非常有限的小型嵌入式系统。RT-Thread: 适用于需要丰富功能支持的嵌入式应用,如需要GUI、网络等功能的系统。
3、在过往项目中,哪部分工作让你感到最困难?请描述该问题的背景,分析遇到的挑战,以及最终的解决方案。
解答:
在项目开发中,挑战通常来自于硬件兼容性问题、实时性要求高的任务调度、或资源受限的系统优化。以硬件兼容性为例:
● 背景: 在一个项目中,我们使用了多种传感器,这些传感器在不同温度和湿度环境下表现不一致,导致采集的数据精度波动较大。
● 挑战: 由于项目的时间紧迫性,我们无法对所有传感器进行逐一标定,也无法更换硬件。
● 解决方案: 我们分析了各传感器的数据特性,发现其波动具有一定的模式,于是通过在软件层面加入数据滤波算法和校准曲线,减少了外界环境对传感器数据的影响。同时,调整了传感器采集的频率,以减少由环境因素引入的噪声。
4、在嵌入式系统中,如何在串口中断中有效处理接收的数据?请详细描述典型的处理流程。
解答:
在串口中断处理中,通常的步骤如下:
1.中断触发: 串口接收到数据时触发中断。
2.读取数据: 在中断服务程序(ISR)中,从串口数据寄存器(如USART_DR)读取接收到的数据。
3.存储数据: 将读取到的数据存储在一个环形缓冲区或FIFO中,以便后续处理。这样可以避免在中断中执行耗时操作。
4.信号通知: 通过设置标志位或发送信号量,通知主循环或任务有新的数据可处理。
5.退出中断: 确保在中断中处理的时间尽量短,以减少中断延迟对系统的影响。
5、 如何在嵌入式系统中接收并解析一个大数据包(如1K字节以上,带帧头、帧长和校验码)?请描述详细的处理流程。
解答:
处理大数据包的流程通常如下:
1.初始化环形缓冲区: 使用一个足够大的环形缓冲区来存储接收到的数据。
2.分段接收: 在串口中断服务程序中,将接收到的数据段存入缓冲区,并持续检测是否收到完整帧头和帧长字段。
3.帧校验: 当数据接收完成后,根据帧长字段提取完整数据帧,使用校验码(如CRC或校验和)验证数据的完整性。
4.数据解析: 对校验通过的数据帧,解析出实际数据内容(如数据段、命令等)。
5.错误处理: 如果校验失败或接收超时,丢弃当前帧并重置缓冲区状态。
6、 请解释IIC(I²C)协议的工作原理及其典型应用场景。
解答:
IIC(I²C,Inter-Integrated Circuit)是一种串行通信协议,主要用于低速设备之间的短距离通信。IIC是半双工的,多主多从设计,具有以下特性:
● 物理层: 使用两根信号线,分别是SCL(时钟线)和SDA(数据线),通过上拉电阻连接。
● 通信过程: 起始条件: 主设备通过拉低SDA线并保持SCL线高电平,发出起始信号。数据传输: 在时钟信号SCL的引导下,数据位按高位在前的顺序通过SDA线传输。数据每传输8位后,接收方需要发送应答信号(ACK)。停止条件: 主设备拉高SDA线并保持SCL线高电平,发出停止信号,结束通信。
● 应用场景: 适用于芯片间短距离通信,如MCU与EEPROM、传感器、实时钟(RTC)等器件之间的通信。
7、 请解释SPI(Serial Peripheral Interface)协议的基本原理及其在嵌入式系统中的典型应用。
解答:
SPI(Serial Peripheral Interface)是一种全双工的同步串行通信协议,通常用于微控制器和外围设备之间的高速通信。
● 物理层: SPI通常使用四根线,分别是SCLK(串行时钟)、MOSI(主设备输出从设备输入)、MISO(主设备输入从设备输出)和SS/CS(从设备选择)。
● 通信过程:时钟信号: 由主设备生成SCLK时钟信号,控制数据传输速率。数据传输: 数据在时钟边沿上同步传输,MOSI用于主设备向从设备发送数据,MISO用于从设备向主设备回传数据。从设备选择: 通过SS/CS信号选择相应的从设备。
● 应用场景: 常用于高速数据传输的场景,如连接闪存、LCD显示屏、传感器、SD卡等外设。
8、 请简要解释CAN(Controller Area Network)协议的基本工作原理及其应用场景。
解答:
CAN(Controller Area Network)是一种串行通信协议,广泛用于汽车电子等需要可靠通信的领域。
● 物理层: CAN使用差分信号进行通信,通常有CAN_H和CAN_L两根信号线。
● 数据帧: 帧格式: 包括帧起始、标识符(ID)、控制字段、数据字段、CRC校验字段、应答字段和帧结束。仲裁机制: 通过标识符(ID)优先级进行总线仲裁,优先级高的帧先传输。
● 错误检测: CAN协议内置多个错误检测机制,如CRC校验、位填充错误、帧格式错误等,以保证数据的完整性和可靠性。
● 应用场景: 广泛应用于汽车、工业自动化等需要高可靠性和实时通信的场合。
9、 UART、RS232和RS485三者之间有什么区别?请从硬件接口、电气特性和应用场景的角度进行说明。
解答:
UART、RS232和RS485是常用的串行通信方式,但它们在接口形式、电气特性和应用场景上有所不同:
● UART:硬件接口: 直接使用TX(发送)和RX(接收)引脚,不定义特定的电压标准。电气特性: 通常与TTL电平(0V和3.3V/5V)兼容,适用于短距离通信。应用场景: MCU内部或MCU与外设之间的简单通信。
● RS232:硬件接口: 使用DB9等接口,典型电平标准为±12V。电气特性: 采用不对称信号,单端传输,噪声抗扰性较差,传输距离有限(一般小于15米)。应用场景: 传统的PC串行端口通信,如与调制解调器或串行设备连接。
● RS485:硬件接口: 通常使用A/B差分对进行传输。电气特性: 差分信号传输,抗干扰能力强,支持长距离通信(可达1200米),且支持多点总线(多达32个节点)。应用场景: 工业控制、楼宇自动化等需要长距离、多设备通信的场合。
10、 请解释FreeRTOS中任务调度的原理,以及调度过程中涉及的关键机制。
解答:
FreeRTOS采用基于优先级的抢占式调度算法,任务调度的核心机制包括:
● 优先级调度: 每个任务分配一个优先级,优先级高的任务优先运行。如果有多个任务处于就绪状态,内核会选择优先级最高的任务执行。
● 时间片轮转: 对于相同优先级的任务,FreeRTOS可以采用时间片轮转的方式进行调度,即多个任务轮流执行,每个任务在其时间片内运行,直到时间片用尽或被挂起。
● 抢占式调度: 当一个高优先级任务变为就绪状态时,当前运行的低优先级任务会被挂起,高优先级任务立即被调度执行。
● 任务状态: 任务在运行中可能会因为等待事件(如信号量、队列消息)或延时函数调用而进入阻塞状态,此时调度器会选择其他就绪任务执行。
11、 在FreeRTOS中,哪些事件会触发任务调度?请详细描述。
解答:
在FreeRTOS中,任务调度可能在以下情况发生:
● 任务优先级变化: 当一个高优先级任务变为就绪状态(例如通过信号量释放、消息队列接收等),当前任务可能会被抢占。
● 系统节拍中断: 每次系统节拍(tick)中断都会触发调度器,检查是否有就绪任务需要切换(如时间片轮转的场合)。
● 任务挂起或删除: 当前任务调用vTaskSuspend()或vTaskDelete()后,会立即让出CPU,调度器选择其他就绪任务执行。
● 延时函数调用: 当任务调用vTaskDelay()或vTaskDelayUntil()时,任务进入阻塞状态,调度器会选择其他任务运行。
12、 如果在FreeRTOS中配置了非礼让(non-yielding)和非抢占(non-preemptive)模式,为什么当前任务会一直执行?
解答:
在非礼让+非抢占模式下,FreeRTOS不会主动切换任务,除非当前任务主动让出CPU。这意味着:
● 非礼让: 当前任务不会因为相同优先级的其他任务处于就绪状态而主动放弃CPU,即使时间片用尽,也不会被强制切换。
● 非抢占: 即使有更高优先级的任务变为就绪状态,也不会立即打断当前任务,调度器在当前任务执行完成或进入阻塞状态后才会调度其他任务。
因此,在这种配置下,当前任务会一直执行,直到其主动调用延时、挂起或删除等函数来让出CPU。
13、 请解释冒泡排序算法的基本思路,并推导其时间复杂度为何是O(N²)。
解答:
冒泡排序是一种简单的交换排序算法,其基本思路如下:
● 基本思路: 在每一轮遍历中,比较相邻的元素。如果前一个元素比后一个大,则交换它们的位置。经过一轮遍历后,最大或最小的元素会“冒泡”到数组的末端。然后在剩余的部分重复上述过程,直到整个数组有序。
● 时间复杂度:最坏情况: 在最坏情况下(例如数组完全逆序),需要进行N-1轮比较,每轮需要比较(N-1)次、(N-2)次、...、1次,因此比较次数为: [1 + 2 + 3 + \dots + (N-1) = \frac{N(N-1)}{2}] 这个和的计算结果为O(N²)。平均情况: 平均情况下,也需要比较接近O(N²)次。因此,冒泡排序的时间复杂度为O(N²)。
14、 在裸机开发中,如何实现一个软件定时器,并有效地管理和调度100个任务的定时执行?
解答:
在裸机开发中,可以通过以下方法实现软件定时器并管理多个任务的定时执行:
● 实现软件定时器:基本思路: 利用硬件定时器或系统时钟中断,周期性触发一个全局时钟计数器。每个软件定时器维护一个初始倒计时时间和当前剩余时间。在每次时钟中断时,遍历所有软件定时器,减少其剩余时间,直到倒计时结束。任务调度: 当某个定时器倒计时结束后,触发相应任务的执行。
● 定时处理100个任务:任务队列: 使用链表或数组管理100个任务,每个任务都关联一个软件定时器。轮询机制: 在时钟中断服务程序中,轮询任务列表,对所有定时器进行倒计时,并检查任务是否到期执行。优化考虑: 为了减少遍历时间,可以使用时间轮等数据结构优化定时任务的调度。
15、 IO口有哪些模式?推挽输出和开漏
输出的区别是什么?题目润色: 嵌入式系统中的IO口通常有哪些工作模式?请详细解释推挽输出和开漏输出的区别及应用场景。
解答:
嵌入式系统中的IO口常见的工作模式包括:
● 输入模式: 用于读取外部信号,可以是浮空输入、上拉输入、下拉输入等。
● 输出模式: 用于输出信号,可以是推挽输出、开漏输出等。
● 复用模式: IO口可以复用为特定外设功能,如UART、SPI、I2C等的信号引脚。
● 模拟模式: 用于模拟信号输入或输出,如ADC(模数转换)输入。
推挽输出和开漏输出的区别:
● 推挽输出:结构: 通过两个互补的MOSFET或双极性晶体管控制输出电平。特性: 可以输出高电平或低电平,驱动能力强,适合直接驱动LED、继电器等负载。应用场景: 常用于需要稳定、高驱动电流输出的场合,如LED驱动、数字信号输出。
● 开漏输出:结构: 只有一个低电平开关(通常是MOSFET)连接到地。特性: 只能拉低电平,需要外部上拉电阻来产生高电平。可以连接多个设备实现“与”逻辑或总线共享。应用场景: 适用于I²C总线、需要多设备共享信号线或需要“线与”逻辑的场合。
16、 请详细解释IIC(I²C)协议的读操作时序,包括起始条件、地址传输、数据接收及停止条件等步骤。
解答:
IIC协议的读操作时序通常包括以下步骤:
1.起始条件(Start Condition): 主设备拉低SDA线并保持SCL线高电平,发送起始信号。
2.从设备地址传输: 主设备发送从设备地址(7位)和读/写位(R/W=1表示读),然后等待从设备的应答。
3.从设备应答: 从设备检测到自己的地址后,在下一个SCL时钟周期将SDA线拉低,发送ACK应答信号。
4.数据传输: 从设备开始在SDA线上发送数据,主设备每接收到8位数据后,拉低SDA线发送ACK应答,表示数据已成功接收。
5.数据接收: 主设备继续发送SCL时钟,读取数据位,直到所需数据接收完成。
6.停止条件(Stop Condition): 主设备在接收完数据后,将SDA线拉高并保持SCL线高电平,发送停止信号,结束通信。
17、 链表数据结构中可以使用二分查找算法吗?在什么情况下适合使用二分查找?
解答:
在链表中,通常不适合使用二分查找算法,原因如下:
● 链表特性: 链表是线性存储结构,无法直接访问中间元素。二分查找需要频繁访问数组中间位置的元素,在链表中实现二分查找需要从头遍历到中间元素,导致效率低下。
● 适用场景: 二分查找通常应用于有序数组或连续内存块的查找操作,适合在数据量较大且访问时间非常重要的场合使用。
如果必须在链表中使用类似二分查找的操作,通常需要将链表转换为数组或使用跳表(skip list)等数据结构。
18、 请解释深度优先搜索(DFS)和广度优先搜索(BFS)算法的基本原理,并简要比较它们的应用场景。
解答:
● 深度优先搜索(DFS):基本原理: DFS算法沿着图或树的分支尽可能深地探索,直到找到目标节点或无可继续的路径为止,然后回溯到前一个节点,继续其他未探索的分支。实现: 通常使用递归或栈实现。应用场景: 适用于需要探索所有路径的场合,如迷宫问题、连通性检测、拓扑排序等。
● 广度优先搜索(BFS):基本原理: BFS算法从起始节点开始,逐层向外扩展,访问离起始节点距离最近的节点,直到找到目标节点或遍历完所有节点。实现: 通常使用队列实现。应用场景: 适用于寻找最短路径、层次遍历等场合,如无权图的最短路径问题。
四、FreeRtos面试题目
1. 实时系统 如何实现任务的优先级继承?
2. 任务状态有哪些?
3. 如何使用队列实现任务间的消息传递?
4. FreeRTOS如何处理时间片轮转调度?
5. 如何使用软件定时器实现周期性任务?
6. FreeRTOS中如何处理任务的堆栈溢出?
7. 如何在FreeRTOS中实现任务的优先级动态调整?
8. 如何使用事件组实现多任务间的同步?
9. FreeRTOS中如何实现多任务的负载均衡?
10. 如何使用信号量实现生产者-消费者模型?
11. FreeRTOS中如何进行任务的延时等待?
12. 如何实现任务的状态机设计?
13. FreeRTOS中如何配置和使用硬件定时器?
14. 如何使用互斥量实现临界区保护?
15. FreeRTOS中如何监控任务的内存使用情况?
16. 如何实现任务的优先级动态提升?
17. FreeRTOS中的任务优先级如何影响系统性能?
18. 如何使用回调机制处理异步事件?
19. FreeRTOS中如何使用消息缓冲区?
20. 如何利用FreeRTOS的API进行任务的调试?
21. FreeRTOS中如何实现任务的动态堆栈分配?
22. 如何使用信号量实现任务的互斥访问?
23. FreeRTOS中如何实现任务的重启机制?
24. 如何使用事件标志组实现任务间的通信?
25. FreeRTOS中如何处理硬件中断的优先级?
26. 如何在FreeRTOS中实现任务的负载监控?
27. FreeRTOS如何支持多核处理器的任务调度?
28. 如何使用FreeRTOS的API进行系统性能分析?
29. FreeRTOS中如何处理任务的异常和错误?
30. 如何优化FreeRTOS的内存管理策略?
五、格力-电控软件面经
1、单片机了解哪些,应用
2、iic协议实现及项目中应用
3、操作系统了解哪些,linux freertos qnx等分析
4、操作系统应用
5、项目介绍亮点,团队细节(两个项目都问)
6、嵌入式方向学习,是否考研
7、项目中控制算法有哪些,如何实现
8、PID算法讲解
9、STM32外设相关
10、实习经历询问
11、电路相关知识了解程度
12、软硬件学习
六、科大讯飞-嵌入式面经
1.项目中如何去使用esp8266。
2.IIC接口地址位有几位,只有这一种模式吗,理论上能接多少外设,实际上能接多少,是什么影响的
3.写过IIC驱动吗,为什么要这么去实现,简述一下
4.stm32里,串口接收哪几种模式,你比较常用什么模式,为什么呢。它是接受断如何判断数据接受结束的。
5.项目里mpu6050如何工作的,有哪些参数,有什么作用。
6.pid参数是自己调的吗,怎么去调节的。
7.速度如何去让电机速度变化的。
8.项目中提到就CAN口,说说CAN口的有哪几种模式,说说这几种模式电平特性。
9.项目中用到了FreeRTOS,自己移植过吗?
10.移植了哪些文件,他们有什么作用。
11.FreeRTOS如何去实现任务调度的。
12.FreeRTOS的多任务之间如何去进行通信的,什么方法,它实现原理是什么。
13.stm32的最小系统是什么。
14.C语言基础知识,什么是堆和栈,在mcu中程序运行的空间是什么样的。
15.static和const的区别,常用在什么地方,空间上有什么区别吗
16.static修饰的在其他文件能使用吗。
17.extern。
18.局部变量与全局变量的区别。在MCU上空间上有什么不同吗?
七、逸动科技-电控软件面经
1、 static的作用,作用范围
2、 volatile的作用,
3、 stm32的软件框架
4、 结构体空间计算,注意事项
5、 怎么解决头文件包含的问题
八、大疆-嵌入式软件开发面经
(一)
一面
1、芯片选型考虑哪些因素?
2、系统用了哪些外设?
3、对哪些通信接口熟悉?介绍一下SPI;
4、线程都有哪些状态?及其各自的转换?
5、有cache的CPU上使用DMA如何保证数据的一致性?
6、系统跑了几个任务?
7、按键防抖如何实现,该线程优先级如何设置?
8、平时怎么debug?
9、用过哪些锁?
10、static关键字作用?
11、程序段还有哪些区?
12、哪些地方会用到栈?有没有关注flash和ram空间?
13、volatile关键字作用?
14、选择DJI的主要原因?
15、有用过DJI的产品吗?
16、MCU能不能运行Linux?
17、STM32启动过程?
18、进程和线程的区别?
19、C++为什么有指针还要引用?
二面
1、对公司有什么了解?
2、为什么想加入大疆?
3、选择一家公司的原则?
4、你觉得加入大疆会遇到的困难与挑战是什么?
5、为什么参加RM?
6、参加rm之前在做什么?参加比赛时的挑战?
7、用过大疆哪些产品?RoboMaster S1
8、谈一谈对于S1产品定位于初高中以及大学生的看法
9、 一个技术问题:互斥量和信号量区别
10、项目中碰到的困难,怎么解决的。
11、无人机的未来(大疆产品得缺点)
(二)
linux的中断流程,有哪些中断处理操作?
阻塞休眠原理
tasklet和workqueue的底层区别、
RTOS采取哪些手段保证他的实时性?
在做硬件驱动的时候,碰到的比较困难的问题?
项目中有制定通讯协议,就问有出现过什么通讯错误,出现错误了怎么办?
通讯丢失怎么办?
做过哪些linux驱动,遇到过什么问题?
linux中能进行浮点数运算吗?
RTOS中哪里会进行线程调度
线程切换为什么用PendSVC,有什么优势
static用法,变量存储位置
C语言编译后的内存分布
volatile变量作用?修饰哪些变量,为什么这些变量要用volatile修饰
SPI四种模式
串口发送一个字节多少位
线程优先级反转,如何解决?
(三)
1、51和32架构的区别
2、Stm32处理中断的过程
3、Stm32是要中断嵌套的吗,什么时候需要什么时候不需要
4、Cortex-m系列使用浮点会对stm32中断效率产生什么影响(不清楚)
5、 对嵌入式哪方面比较深刻,研究比较深入的
6、Uart是怎么样的接口
7、Uart异步,不需要时钟,那为什么还要设定波特率
8、Spi跟uart在使用上有什么区别
9、Spi和uart需不需要区分主从
10、 Spi的从是否可以主动读写主的数据,怎么做到的
11、写iic、spi、uart驱动需要哪些注意的地方
12、Iic、spi、uart接收方式有三种,轮询,中断和DMA,如果是中断收到的数据要谁去申请谁去释放
13、中断里数据往一个buffer去放,这个buffer要谁去申请
14、如何保证buffer读和写的互斥
(四)
1、项目中freertos创建了几个任务,都是什么用途,任务之间如何设计数据交互
2、静态局部变量与局部变量的区别
3、为什么局部变量未定义时,每次初始化的结果是不确定的?是个真随机数还是个伪随机数?
4、嵌入式中栈的工作机制是什么?
5、连续调用同一个函数两次,他的局部变量初始化结果是否会一致?
九、禾望电气-嵌入式硬件面试题目汇总
1、用过ZYNQ7020芯片,讲讲项目,系统原理,为什么使用这款芯片
2、MCU和FPAG对比,优缺点
3、PL端加速算法具体是怎样实现的
4、FPGA代码写的多吗
5、挑一个画过的电路板介绍一下
6、IIC外设用的哪些
7、stm32最小系统包含哪些
8、STM32自带ADC相关参数
9、ADC采集的电压做什么处理,直接STM32读取吗
10、ESP8266与STM32通信
11、PCB平时用什么画的
12、常用通信协议CAN,RS485
13、CAN硬件设计相关
14、CAN通信协议的特点
15、CAN协议的收发,是固定主机吗,从机可以主动发数据吗
16、RS485通信协议
17、RS422通信协议
18、数字电路学怎么样
19、电流采集方案
20、霍尔电流传感器原理
21、电流与电压的关系
22、运放的选型,用的哪一款
23、单片机选的哪一款,工作频率是多少
24、采集精度要求
25、软件上如何组织的
26、ADC采集方式,为什么使用DMA+中断,如何配置的
27、数据采集周期
28、电路板包括哪些部分
29、MCU如何选型的
30、电源部分描述一下
31、DC-DC降压原理
32、buck降压主要考虑哪些器件选型,哪些参数
33、底盘电路与云台电路什么方式通信,传输哪些数据
34、原理图和PCB用什么工具画的
35、CAN通信描述一下
36、120欧姆电阻什么用
37、显性和隐性电平
38、说一说对ZYNQ-7020芯片的了解
39、说一下AXI总线
40、Python框架熟悉哪些
十、厨芯-嵌入式软件工程师面经
1、gps硬件连接(uart),连接了什么接口(TX,RX,GND),
2、获取什么数据(经纬度GPGGA)
3、传输数据是什么格式(NMEA0813)
4、mpu6050用的什么接口(iic)
5、接收的数据是什么(加速度和陀螺仪的数据,用calculate函数进行处理,阈值检测的方式);
6、使用的stm32芯片是什么封装。
7、从stm32 rtos串口数据解析介绍,对于一个串口做一个应答机,包括解析数据,解包,发回复信息,考虑做成几个任务
8、串口控制器在什么情况下会出发中断,中断用在什么地方
9、dma接收软件部分的操作
10、reertos的多任务同步机制列举
11、iic和spi的区别
12、全局变量和局部变量放在什么位置
13、堆和栈的区别
十一、广州蝠鲨-面经(嵌软)
1.modbus协议作为一主多从的协议,如何来确定从机 (设备地址)
2.从机地址是主机确定的还是从机确定的(从机)
3.讲一下rs485协议?ttl?232?
4.你说你深入阅读了freertos源码讲讲(大致答了通用寄存器入栈和出栈 从tcb控制块开始说,里面有栈顶指针,cortexm3有自动入栈和出栈的寄存器,本质任务切换就是入栈出栈,切换栈顶指针)
5.freertos可以调节每个任务的时间频率?
6.dhcp原理
7.mqtt
8.spi
9.半双工spi
10.扩展spi
11.项目里面有一个多种传感器具体型号是?有几种?
12.这个项目里面开了几个task(有网络信息 有mqtt 有传感器采集 有查询命令机制)
13 dhcp项目里面咋用?
十二、嵌入式111道高频面试题
1.1 进程线程的基本概念
1.1.1 什么是进程,线程,彼此有什么区别
1.1.2多进程、多线程的优缺点
1.1.3什么时候用进程,什么时候用线程
1.1.4多进程、多线程同步(通讯)的方法
1.1.5进程的空间模型
1.1.6进程线程的状态转换图 什么时候阻塞,什么时候就绪
1.1.7父进程、子进程的关系以及区别
1.1.8什么是进程上下文、中断上下文
1.1.9一个进程可以创建多少线程,和什么有关
1.2 并发,同步,异步,互斥,阻塞,非阻塞的理解
1.2.1什么是线程同步和互斥
1.2.2线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗?
1.2.3并发,同步,异步,互斥,阻塞,非阻塞的理解
1.3 孤儿进程、僵尸进程、守护进程的概念
1.3.1基本概念
1.3.2如何创建守护进程:
1.3.3正确处理僵尸进程的方法
第二章 C/C++高频面试题
2.1 c和c++区别、概念相关面试题
2.1.1 new和malloc的区别
2.1.2 malloc的底层实现
2.1.3在1G内存的计算机中能否malloc(1.2G)?为什么?
2.1.4指针与引用的相同和区别;如何相互转换?
2.1.5 C语言检索内存情况 内存分配的方式
2.1.6 extern”C” 的作用
2.1.7头文件声明时加extern定义时不要加 因为extern可以多次声明,但只有一个定义
2.1.8函数参数压栈顺序,即关于__stdcall和__cdecl调用方式的理解
2.1.9重写memcpy()函数需要注意哪些问题
2.1.10数组到底存放在哪里
2.1.11 struct和class的区别
2.1.12 char和int之间的转换;
2.1.13 static的用法(定义和用途)
2.1.14 static的用法(定义和用途)
2.1.15const常量和#define的区别(编译阶段、安全性、内存占用等)
2.1.16 volatile作用和用法
2.1.17有常量指针 指针常量 常量引用 没有 引用常量
2.1.18没有指向引用的指针,因为引用是没有地址的,但是有指针的引用
2.1.19c/c++中变量的作用域
2.1.20 c++中类型转换机制?各适用什么环境?dynamic_cast转换失败时,会出现什么情况?
2.2 继承、多态相关面试题
2.2.1继承和虚继承
2.2.2多态的类,内存布局是怎么样的
2.2.3被隐藏的基类函数如何调用或者子类调用父类的同名函数和父类成员变量
2.2.4多态实现的三个条件、实现的原理
2.2.5对拷贝构造函数 深浅拷贝 的理解 拷贝构造函数作用及用途?什么时候需要自定义拷贝构造函数?
2.2.6析构函数可以抛出异常吗?为什么不能抛出异常?除了资源泄露,还有其他需考虑的因素吗?
2.2.7什么情况下会调用拷贝构造函数(三种情况)
2.2.8析构函数一般写成虚函数的原因
2.2.9构造函数为什么一般不定义为虚函数
2.2.10什么是纯虚函数
2.2.11静态绑定和动态绑定的介绍
2.2.12 C++所有的构造函数
2.2.13重写、重载、覆盖的区别
2.2.14成员初始化列表的概念,为什么用成员初始化列表会快一些(性能优势)?
2.2.15如何避免编译器进行的隐式类型转换;(explicit)
第三章 网络编程
3.1 TCP UDP
3.1.1 TCP、UDP的区别
3.1.2 TCP、UDP的优缺点
3.1.3 TCP UDP适用场景
3.1.4 TCP为什么是可靠连接
3.1.5典型网络模型,简单说说有哪些;
3.1.6 Http1.1和Http1.0的区别
3.1.7 URI(统一资源标识符)和URL(统一资源定位符)之间的区别
3.2 三次握手、四次挥手
3.2.1什么是三次握手
3.2.2为什么三次握手中客户端还要发送一次确认呢?可以二次握手吗?
3.2.3为什么服务端易受到SYN攻击?
3.2.4什么是四次挥手
3.2.5为什么客户端最后还要等待2MSL?
3.2.6为什么建立连接是三次握手,关闭连接确是四次挥手呢?
第四章 常见算法
4.1 排序算法
4.1.1各种排序算法的时间空间复杂度、稳定性
4.1.2各种排序算法什么时候有最好情况、最坏情况(尤其是快排)
4.1.3冒泡排序
4.1.4选择排序
4.1.5插入排序
4.1.6希尔排序
4.1.7归并排序
4.1.8快速排序
4.1.9快排的partition函数与归并的Merge函数
4.2 STL库相关
4.2.1 vector list异同
4.2.2 vector内存是怎么增长的vector的底层实现
4.2.3 vector和deque的比较
4.2.4为什么stl里面有sort函数list里面还要再定义一个sort
4.2.5 STL底层数据结构实现
4.2.6利用迭代器删除元素会发生什么?
4.2.7 map是如何实现的,查找效率是多少
4.2.8几种模板插入的时间复杂度
第五章 Linux操作系统常见面试题
5.1 Linux内核相关
5.1.1 Linux内核的组成
5.1.2用户空间与内核通信方式有哪些?
5.1.3系统调用read()/write(),内核具体做了哪些事情
5.1.4系统调用的作用
5.1.5内核态,用户态的区别
5.1.6 bootloader内核 根文件的关系
5.1.7 Bootloader多数有两个阶段的启动过程:
5.1.8 linux的内核是由bootloader装载到内存中的?
5.1.9为什么需要BootLoader
5.1.10 Linux内核同步方式总结
5.1.11为什么自旋锁不能睡眠 而在拥有信号量时就可以?
5.1.12 linux下检查内存状态的命令
5.2 其他操作系统常见面试题
5.2.1大小端的区别以及各自的优点,哪种时候用
5.2.2 一个程序从开始运行到结束的完整过程(四个过程)
5.2.3什么是堆,栈,内存泄漏和内存溢出?
5.2.4堆和栈的区别
5.2.5死锁的原因、条件 创建一个死锁,以及如何预防
5.2.6硬链接与软链接的区别;
5.2.7虚拟内存,虚拟地址与物理地址的转换
5.2.8计算机中,32bit与64bit有什么区别
5.2.9中断和异常的区别
5.2.10中断怎么发生,中断处理大概流程
5.2.11 Linux 操作系统挂起、休眠、关机相关命令
5.2.12数据库为什么要建立索引,以及索引的缺点
第六章 单片机常见面试题
6.1 CPU 内存 虚拟内存 磁盘/硬盘 的关系
6.2 CPU内部结构
6.3 ARM结构处理器简析
6.4波特率是什么,为什么双方波特率要相同,高低波特率有什么区别;
6.5arm和dsp有什么区别
6.6 ROM RAM的概念浅析
6.7 IO口工作方式:上拉输入 下拉输入 推挽输出 开漏输出
6.8扇区 块 页 簇的概念
6.9简述处理器在读内存的过程中,CPU核、cache、MMU如何协同工作?画出CPU核、cache、MMU、内存之间的关系示意图加以说明
6.10请说明总线接口USRT、I2C、USB的异同点(串/并、速度、全/半双工、总线拓扑等)
6.11什么是异步串口和同步串口
6.12 I2C时序图
立即扫码
更多推荐
所有评论(0)