我是老温,一名热爱学习的嵌入式工程师7 m, r/ ?' b0 ~0 m% \" H
关注我,一起变得更加优秀!有些工程师可能觉得单片机没啥技术含量,但事实是单片机涵盖的技术非常之多,从底层到应用,应该没有一个人能熟练掌握其中所有的技术。
( d, N" v' y; e: ?/ o- O! g9 n, ~/ r* M0 C* m. j* P" J
这里就站在面试的角度来说说:单片机工程师面试常见问题。
+ y3 V# R0 e) b" w7 V" J9 C: y+ K3 D4 R3 y
1、单片机上电之后不运行,可能的原因有哪些?
) ?# p9 c( ]( m- a可能的原因包括供电问题(如VCC电压偏离正常范围)、晶振问题(如晶振损坏或未起振)、RESET引脚电平逻辑错误(如一直处于复位状态)、程序下载或擦除问题(如flash无法下载或损坏)以及控制程序问题(如程序存在bug)。 t' C& E: g1 d. i
9 \5 V/ \" k" @0 E; H2 y2、看门狗定时器的作用?
' S. n/ n9 L6 G) q看门狗定时器(Watchdog Timer)在嵌入式系统中用于监控和重置系统,以防止因软件故障导致的系统崩溃。它通过定时检查系统是否正常运行,并在超时后触发系统重置,从而提高系统的可靠性和稳定性。3 F2 M; x2 ^& y9 f
& }! f3 ]! m& C' Z! q. ~
3、单片机中断处理流程是怎样的?
% I: n( D* U0 D4 P" L7 J: J5 `3 F单片机中断处理流程通常包括三个步骤:中断响应、中断处理和中断返回。5 r! G: }; d+ c# o; {
当中断发生时,中断系统通过硬件自动生成长调用指令(LACLL),将断点地址压入堆栈保护,并将对应的中断入口地址装入程序计数器PC,使程序转向该中断入口地址执行中断服务程序。中断服务程序完成后,计算机通过中断返回指令RE将断点地址从堆栈中弹出,返回到程序计数器PC,并通知中断系统已完成中断处理。
- F$ Z! t, b; @* d3 Y) \
; H K1 }* f. y- H' A% ^4、解释一下进程、线程、协程的概念8 N+ i6 B0 E' R9 l! h0 s* e
进程:进程是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。
# ^+ D4 K2 G; _: C, y1 y) ~, [% Y) c- K
线程:线程是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。
6 E7 k' }6 y, ^2 Y
/ J# i! W- }! {/ z协程:是一种比线程更加轻量级的存在。一个线程也可以拥有多个协程。其执行过程更类似于子例程,或者说不带返回值的函数调用。' d- ?" ]. a ~
wwszqs4mczi64095463034.jpg
/ u7 U" p: r V" y/ R9 q" x k
5、什么是嵌入式系统?# [9 T. s: S; K. T0 m8 `% m
嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪的专用计算机系统。它适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的场合。嵌入式系统通常由处理器、存储器、输入输出设备、软件等组成,具有体积小、功耗低、可靠性高、功能专用等特点。9 h, V, b6 C& o# O# o9 h
1 Z- s$ _* E) j6、C语言中堆和栈的区别是什么?
% L W7 I& V. K( q1 c堆和栈是C语言中用于存储数据的两种不同区域。栈由系统自动分配和管理,通常用于存储局部变量和函数调用时的临时数据;而堆需要程序员自己申请和释放,通常用于存储动态分配的数据。两者在存储内容、管理方式、空间大小、能否产生碎片、生长方向、分配方式和分配效率等方面都存在差异。% q, T& w8 O9 Z/ O8 S9 g6 B
, P* Q3 f7 Q# K {7、请简单说下嵌入式系统中的RTOS调度策略
2 j3 x8 T; R* b2 f* B% Z NRTOS(实时操作系统)的调度策略包括基于优先级的调度、轮询调度、时间片轮转调度等。这些策略直接影响系统的实时性和效率,确保任务能够按照预定要求得到执行。
/ u. k4 h6 L& ^; g; u* s; _
" o6 k0 }# P s6 n5 j8、你如何保证单片机代码的质量和可靠性?( P6 ?1 ~! F2 g! ?
在单片机项目中,我通常会采取以下措施来保证代码的质量和可靠性:首先,我会对代码进行严格的测试和验证,包括单元测试、集成测试和系统测试等;其次,我会遵循良好的编程规范和代码风格,以提高代码的可读性和可维护性;最后,我会定期回顾和更新代码,以消除潜在的错误和漏洞。
- b9 ]1 U0 f+ Q; x1 X. ^/ ~$ B& @% G O% R$ Q7 k3 h( ?5 s( c7 n
9、程序的局部变量、全局变量和动态申请数据分别存在于哪里?
$ y0 j/ w; _/ [局部变量存在于栈区。全局变量存在于静态区(数据段)。动态申请的数据存在于堆区。
. H0 A. k3 c1 d; Z% ^2 Q10、在C语言中,如何实现链表?请举例说明。/ L4 j$ x0 I/ T3 s) Y1 ~
链表是一种动态数据结构,由节点组成,每个节点包含数据部分和指向下一个节点的指针。
4 B4 k+ X5 r" U* B3 g1 }! C在C语言中,可以通过结构体和指针来实现链表。例如,单链表的节点可以定义为:
/ T8 b. p( w4 V) b% R( tstruct Node { int data; struct Node* next;};
' k& O: y! ~7 b) {! @然后通过动态分配内存和设置指针来构建链表。例如,创建一个新的节点并插入到链表的开头:8 ]; E( |& X- ^0 K
struct Node* head = NULL;struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));newNode->data = 10;newNode->next = head;head = newNode;
% H' `) B& H' d7 w& O5 a由于篇幅有限,今天就分享这些,其实还有很多很多,大家面试之前,尽量先刷一波面试题。: W) s0 ?# Q, [3 O- B8 L! W) V
: I9 t7 w' _; p/ a, I+ n作者 | strongerHuang
8 Z7 V! a/ v: j, c微信公众号 | strongerHuang
1 |$ n/ j5 P# T/ U6 d# J3 [$ W2 f5 x-END-
5 O, o9 [% S0 n9 K往期推荐:点击图片即可跳转阅读0 G% j7 T0 m, l2 g) _
6 J& a4 A5 V! C4 W; a
' Q/ n9 t/ a0 C+ q7 X7 I# Y0 x F
1 h& z& R4 p- h! u4 f' e
* D- m% s+ L; ?/ W6 |. k l
zixvifsym0564095463134.jpg
7 r& _* J G9 F5 P" i9 H! S1 t1 V
' q. q5 p+ f0 h) U
硬件都做出来了,客户说想改一下,结果,全部推倒重做!( ~ L: P* C9 P; C- y* Y
9 g5 Y; J' @ W
/ E4 i" t5 t; q# ~% l+ m" x ) q+ Y. n1 v9 c6 P$ z
) [" g. L4 C6 s2 N w% } Q, N+ S, x F) z
tw04f5t5stg64095463234.jpg
4 l# F: }* \/ D/ y
" `. D }) V: M- X1 c) Y+ G* _
嵌入式架构设计,浅谈"驱动分离式"设计思想。' d. N2 a9 ], _
2 j( V; U" M" x; W
9 M# x& I2 j) z6 h! l4 c$ m / [& R9 ~) }4 Q) b, ~
3zkpel5jkn464095463334.jpg
3 M$ N3 L; b3 T2 z
0 ^; b X: v' O: d 分享一个跨平台通用的 GUI 框架!9 c* }: D9 o3 r E% i2 U
9 q d# k! c* L+ V6 P% ]
2 W$ c. ?6 F8 g- z6 R, L, J 3 s/ h6 ~& b/ q* B1 ]5 S2 ?8 ]
我是老温,一名热爱学习的嵌入式工程师
3 y" j. v X( y: D" ?* U关注我,一起变得更加优秀! |