- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
嵌入式软件开发面试题及答案
一、C语言基础与嵌入式实践
问题:嵌入式开发中,volatile关键字有什么实际用途?举个项目里的例子
答案:主要用来防止编译器优化“可能被硬件/中断修改的值”。比如我之前做串口接收时,定义了volatileuint8_tuart_rx_buf存接收数据——串口中断会修改这个变量,若不加volatile,编译器会觉得主函数里没主动改它,可能把它放到寄存器里反复读取旧值,导致主函数拿不到必威体育精装版的接收数据。还有访问硬件寄存器时,比如定时器计数寄存器TIM_CNT,必须加volatile,不然编译器会优化成“只读一次”,实际寄存器值早被硬件更新了。
问题:static修饰变量和函数在嵌入式里有什么用?举个例子
答案:修饰全局变量时,能限制变量只在当前.c文件可见,避免多文件变量名冲突。比如我写ADC驱动时,用staticuint16_tadc_avg_val存滤波后的平均值,只让驱动里的函数访问,防止其他模块误改。修饰函数时,比如staticvoidadc_filter(void),能避免函数名和其他文件重复,还能减少全局符号,让链接更高效。
二、MCU硬件操作与调试
问题:配置GPIO为推挽输出驱动LED,关键步骤有哪些?如果LED不亮,怎么排查?
答案:步骤分三步:①使能GPIO对应的时钟(比如STM32的RCC寄存器),不使能时钟引脚肯定没反应;②配置GPIO模式寄存器,设为推挽输出(区别于开漏,推挽能主动输出高电平);③操作输出数据寄存器(ODR)或置位/复位寄存器(BSRR),让引脚输出低电平(假设LED阳极接VCC)。
排查思路:先查硬件——用万用表测LED两端电压,看是不是有压差(没压差可能LED坏了或引脚没输出);再查引脚是否接对(比如画PCB时焊错引脚);然后查软件——确认时钟有没有使能(比如漏写RCC-AHB1ENR|=RCC_AHB1ENR_GPIOBEN),输出电平是不是设反了(比如误设成高电平),如果是复用功能(比如GPIO当SPI引脚),还要确认复用映射没配错。
问题:单片机程序跑飞了,你的排查步骤是什么?
答案:先排除硬件问题——测电源电压是不是稳定(比如纹波太大导致复位),复位电路有没有虚焊(比如复位按键卡住),晶振是不是起振(用示波器看晶振引脚波形);再查软件:①看是不是数组越界/指针乱指,比如定义uint8_tbuf[10],却写buf[15],可能覆盖栈里的返回地址;②查中断服务函数,比如中断里死循环、没清中断标志导致反复进中断;③用仿真器(比如J-Link)挂住程序,看PC指针指向哪里——如果指向乱码地址,大概率是栈溢出;如果指向某个函数,就看这个函数里有没有非法操作;④裸机的话可以加“看门狗”,如果程序跑飞能复位,还能在复位后读取复位原因寄存器,判断是不是watchdog复位。
三、RTOS核心概念与应用
问题:FreeRTOS里,信号量和互斥锁有什么区别?实际项目里怎么选?
答案:最大区别是互斥锁有“优先级继承”,信号量没有。比如两个任务:高优先级任务A(优先级5)和低优先级任务B(优先级3),都要访问串口。如果B先拿了信号量,A来了会一直阻塞;但如果用互斥锁,B拿锁后,A一来会把B的优先级临时提到5,让B快点执行完释放锁,避免A长时间等(防止优先级反转)。
实际选法:如果是“同步”场景(比如任务等外设准备好,比如ADC采集完发信号量通知任务处理),用信号量;如果是“互斥”场景(比如多个任务访问同一个共享资源,比如串口、全局变量),必须用互斥锁,防止优先级反转。我之前做电机控制项目,电机任务(高优先级)和显示任务(低优先级)都要写同一个“运行状态”全局变量,就用了互斥锁,没出现过状态错乱。
问题:任务栈溢出会导致什么问题?怎么避免和排查?
答案:症状很随机——可能任务突然退出、数据错乱、程序跑飞,甚至其他任务也受影响(因为栈溢出会覆盖相邻内存)。
避免:创建任务时,根据任务的实际需求设栈大小,别盲目设太大(浪费内存)也别太小。比如一个只做简单IO操作的任务,栈设512字节够了;如果任务里调用了嵌套较深的函数,或者用了大数组,栈要设大些(比如2048字节)。可以用FreeRTOS的uxTaskGetStackHighWaterMark()函数,查任务运行中栈的最小剩余空间,比如剩余100字节,说明当前栈大小够,留了余量。
排查:①用上面的栈水位函数,看是不是某个任务剩余空间接近0;②栈初始化时填充特定值(比如0xCC),运行一段时间后,用仿真
有哪些信誉好的足球投注网站
文档评论(0)