- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
嵌入式工程师面试题及参考答案
一、基础概念题(共5题)
问题:什么是volatile关键字?在嵌入式开发中常用在哪些场景?
答案:volatile是C语言关键字,作用是告诉编译器“变量值可能被意外修改(比如中断、硬件寄存器)”,禁止编译器对该变量做优化(比如缓存到寄存器),每次访问都必须从内存读取最新值。嵌入式常用场景:①中断服务函数中修改的全局变量;②硬件寄存器地址映射的变量(比如GPIO数据寄存器);③多线程/多任务共享的变量(未加锁时)。
问题:嵌入式系统中“中断优先级”和“任务优先级”的区别是什么?
答案:中断优先级是硬件层面的优先级,由MCU的NVIC(嵌套向量中断控制器)或中断控制器配置,决定中断请求的响应顺序,高优先级中断可以打断低优先级中断(嵌套);任务优先级是操作系统(RTOS)层面的优先级,决定多任务调度时CPU的分配权,高优先级任务会抢占低优先级任务运行。核心区别:中断优先级管理硬件事件响应,任务优先级管理软件任务调度,中断优先级高于所有任务优先级(即使最高优先级任务运行时,中断来了也会暂停任务)。
问题:什么是内存对齐?为什么嵌入式开发要关注内存对齐?
答案:内存对齐是CPU访问内存时的规则——要求数据存储地址是其自身长度的整数倍(比如32位CPU中int型(4字节)需存在地址0x0000、0x0004等)。嵌入式关注内存对齐的原因:①提高访问效率:CPU按对齐地址访问时无需拆分指令,未对齐可能需要两次访问;②避免硬件错误:部分MCU(比如ARMCortex-M系列)对未对齐访问直接报错,导致程序崩溃;③节省内存:合理对齐可减少内存碎片,尤其嵌入式系统内存资源有限。
问题:GPIO有哪些工作模式?以STM32为例,简述推挽输出和开漏输出的区别。
答案:GPIO常见工作模式:输入(浮空、上拉、下拉)、输出(推挽、开漏)、复用功能(推挽、开漏)、模拟输入。STM32中推挽与开漏的区别:①推挽输出:可直接输出高电平(VDD)和低电平(GND),驱动能力强,无需外接上拉电阻;②开漏输出:只能输出低电平(GND),高电平需通过外接上拉电阻实现,适合电平转换、总线通信(比如I2C),多个设备可共用总线(避免短路)。
问题:RTOS中的“任务切换”是如何实现的?核心步骤是什么?
答案:RTOS任务切换本质是“上下文保存与恢复”,依赖CPU的中断机制和寄存器操作。核心步骤:①触发切换:中断(比如滴答定时器中断)、任务主动放弃CPU(比如调用延时函数);②保存上下文:将当前任务的寄存器值(PC、SP、通用寄存器等)保存到该任务的栈空间;③选择下一个任务:根据调度算法(比如优先级抢占)从就绪队列中选出最高优先级任务;④恢复上下文:从选中任务的栈空间中读取寄存器值,恢复到CPU中;⑤执行新任务:PC指针指向新任务的代码地址,继续运行。
二、编程实践题(共3题)
问题:用C语言写一个函数,实现对STM32F103的GPIOA_PIN5(LED引脚)进行初始化,配置为推挽输出,初始电平为低电平。
答案:
#includestm32f10x.h
voidLED_Init(void)
{
//1.使能GPIOA时钟(APB2总线)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//2.配置GPIOA_PIN5模式
GPIO_InitTypeDefGPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;//选中PIN5
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//输出速度50MHz
GPIO_Init(GPIOA,GPIO_InitStruct);
//3.初始电平低电平
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
}
关键说明:①嵌入式GPIO初始化必须先使能对应时钟(STM32时钟默认关闭,节省功耗);②速度配置需根据实际需求选择(2MHz/10MHz/50MHz),并非越高越好;③复位函数(GPIO_ResetBits)确保初始状态一致。
问题:编写一个中断服务函数,实现“按键(GPIOA_PIN0,上拉输入)按下时触
原创力文档


文档评论(0)