得力嵌入式工程师 一面 面经
1. 自我介绍
您好,我叫[姓名],[学历]毕业于[学校][专业]。我有[X年]嵌入式开发经验,主要从事基于ARM Cortex-M系列微控制器的产品开发。
在技术方面,我熟悉C/C++编程,掌握RTOS(如FreeRTOS)的应用,熟悉常用外设驱动开发(UART、SPI、I2C、ADC、PWM等)。项目经验包括[具体项目1]和[具体项目2],在这些项目中我负责[具体职责],解决了[具体问题]。
我对嵌入式系统有浓厚兴趣,平时会关注行业新技术,也会通过开源项目和技术社区持续学习。希望能加入贵公司,在嵌入式领域继续深耕发展。
2. 进程和线程的区别
定义:
- 进程:系统资源分配的基本单位,拥有独立的地址空间
- 线程:CPU调度的基本单位,是进程内的执行单元
主要区别:
资源占用 |
独立地址空间,资源开销大 |
共享进程地址空间,开销小 |
通信方式 |
IPC(管道、消息队列、共享内存、信号量) |
直接访问共享变量(需同步) |
创建开销 |
大(需要分配独立资源) |
小(共享进程资源) |
切换开销 |
大(需要切换地址空间) |
小(同进程内切换) |
独立性 |
高,进程崩溃不影响其他进程 |
低,一个线程崩溃可能导致整个进程崩溃 |
嵌入式RTOS中的体现:在FreeRTOS等RTOS中,通常只有任务(Task)的概念,类似于线程,所有任务共享同一地址空间,通过队列、信号量、互斥锁等机制进行同步和通信。
3. 中断的优先级如何设置?中断嵌套了解吗?
中断优先级设置:
在ARM Cortex-M系列中,通过NVIC(嵌套向量中断控制器)管理中断优先级:
// 设置中断优先级(数值越小优先级越高) NVIC_SetPriority(UART0_IRQn, 2); // 设置UART0中断优先级为2 NVIC_EnableIRQ(UART0_IRQn); // 使能中断
优先级分组:
- Cortex-M支持抢占优先级和子优先级
- 通过AIRCR寄存器配置优先级分组
- 例如:4位优先级可分为3位抢占+1位子优先级
中断嵌套:
- 高优先级中断可以打断低优先级中断的执行
- 同优先级中断不能相互嵌套
- 中断嵌套深度受栈空间限制
注意事项:
- 关键任务(如安全相关)设置高优先级
- 耗时长的中断设置低优先级
- 避免在中断中执行耗时操作
- 合理使用中断屏蔽,防止竞态条件
4. volatile关键字的作用是什么?
作用:告诉编译器该变量可能被程序外部因素改变,禁止编译器对其进行优化。
使用场景:
- 中断服务程序中修改的变量:
volatile uint8_t flag = 0;
void UART_IRQHandler(void) {
flag = 1; // 中断中修改
}
int main(void) {
while(flag == 0); // 不加volatile可能被优化为死循环
}
- 硬件寄存器访问:
#define GPIO_REG (*(volatile uint32_t *)0x40020000) GPIO_REG = 0x01; // 确保每次都从内存读写
- 多线程共享变量:
volatile int shared_data; // 多任务访问的变量
注意:
- volatile不保证原子性,多线程需配合互斥锁
- volatile不能替代同步机制
- 过度使用会降低性能
5. 看门狗的作用及使用场景
作用:看门狗(Watchdog)是一种硬件定时器,用于检测和恢复系统故障,防止程序跑飞或死机。
工作原理:
- 启动后开始倒计时
- 程序需要定期"喂狗"(重置计数器)
- 如果超时未喂狗,系统自动复位
使用场景:
- 防止程序死循环:
void main_task(void) {
while(1) {
// 正常业务逻辑
process_data();
// 定期喂狗
WDT_Feed();
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。