嵌入式面试常见问题(五)— 牛客网_牛客网嵌入式面试题

3、/proc,proc可以读取内核空间的配置信息和运行状态并且设置部分属性的值。

4、文件,可以通过指定文件的读写操作来实现通信。

5、netlink,类似socket通信方式,可以读写大量的数据,实现稍微复杂。

6、ioctl,可以实现数据量比较少时候的通信

42、怎样预防死锁?

打破互斥条件:改造独占性资源为虚拟资源,大部分资源已无法改造。

打破不可抢占条件:当一进程占有一独占性资源后又申请一独占性资源而无法满足,则退出原占有的资源。

打破占有且申请条件:采用资源预先分配策略,即进程运行前申请全部资源,满足则运行,不然就等待,这样就不会占有且申请。

打破循环等待条件:实现资源有序分配策略,对所有设备实现分类编号,所有进程只能采用按序号递增的形式申请资源。

43、硬链接与软链接的区别?

硬链接与原文件公用一个inode号,他们是同一个文件,而软链接与原文件拥有不同的inode号,他们是两个不同的文件;在文件属性上软链接明确写出了是链接文件,而硬链接没有写 出来,因为在本质上硬链接文件和原文件是完全平等关系;软链接的链接数目不会增加,硬链接没增加一个,链接数目就会加1;硬链接文件显示的大小是跟原文件是一样的,软连接不一定。

44、Linux系统的挂起、待机、休眠?

挂起:CPU、内存工作,而硬盘、显示器等外部设备停止工作。

待机:只对内存供电,CPU、外设停止工作。

休眠:CPU、内存停止工作,内存中的数据保存在硬盘中,外部设备也停止工作。

45、TCP、UDP的区别?

TCP是面向连接的,UDP是面向无连接的。 TCP是面向字节流的,UDP是基于数据报的。

TCP提供可靠服务(正确性、顺序性),UDP提供不可靠服务。

TCP程序结构复杂,占用资源多;UDP程序结构简单,占用资源少。

TCP有拥塞控制;UDP没有拥塞控制。

TCP只支持一对一;UDP支持一对一、一对多、多对一、多对多。

46、简述TCP三次握手的过程。

第一次握手:客户端创建传输控制块,然后向服务器发出连接请求报文(将标志位SYN置1,随机产生一个序列号seq=x),接着进入SYN-SENT状态。

第二次握手:服务器收到请求报文后由SYN=1得到客户端请求建立连接,回复一个确认报文(将标志位SYN和ACK都置1,ack=x+1,随机产生一个序列号seq=y),接着进入SYN-RCVD状态。此时操作系统为该TCP连接分配TCP缓存和变量。

第三次握手:客户端收到确认报文后,检查ack是否为x+1,ACK是否为1,是则发送确认报文(将标志位ACK置1,ack=y+1,序列号seq=x+1),此时操作系统为该TCP连接分配TCP缓存和变量。服务器收到确认报文并检查无误后则连接建立成功,两者都进入ESTABLISHED状态,完成三次握手。

47、TCP为什么需要三次握手,第三次握手去掉行不行?

进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。第三次握手不能去掉,第三次握手能防止发生死锁,因为若为两次握手且服务器发出第二次握手而客户端没有收到,服务器开始传输数据报后客户端便不会理会,导致服务器以为丢包而源源不断地发送数据报,造成死锁。

48、简述TCP四次挥手的过程。

第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

49、为什么TCP建立连接是三次握手,而关闭连接却是四次挥手?

建立连接的时候,服务器在LISTEN状态下,不需要等待,可以立即建立连接,把ACK和SYN放在一个报文里发送给客户端,因此只需要三次握手。 而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接受数据,而自己未必将所有数据都发送完了,所以服务器可以立即关闭,也可以发送一些数据后再关闭,所以服务器的确认报文(ACK=1)和连接释放报文(FIN=1,ACK=1)一般分开发送,因此形成四次握手。

50、进程和线程的区别?

进程是资源分配的最小单位,线程是CPU调度的最小单位。一个进程可以包含多个线程,所以进程要比线程消耗更多的计算机资源。每个进程都有单独的地址空间,而同一进程内的线程共享进程的地址空间。

51、C语言中,static关键字的作用?

在C中,static主要定义全局静态变量、定义局部静态变量、定义静态函数。

1、定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点。
a.在全局区分配内存。
b.如果没有初始化,其默认值为0.
c.该变量在本文件内从定义开始到文件结束可见。

2、定义局部静态变量:在局部变量前面加上关键字static,其特点如下:
a.该变量在全局数据区分配内存。
b.它始终驻留在全局数据区,直到程序运行结束。
c. 其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

52、进程间通信方法

常用的进程间通信方式有: 管道 ,包括有名管道和无名管道。 信号量。 共享内存 消息队列 本地套接字

53、程序中的内存分配方法

内存为程序分配空间有四种分配方式:
1、连续分配方式
2、基本分页存储管理方式
3、基本分段存储管理方式
4、段页式存储管理方式

54、编译有几个阶段每个阶段做什么事情

词法分析阶段:读入源程序,对构成源程序的字符流进行扫描和分解,识别出单词。

语法分析阶段:机器通过词法分析,将单词序列分解成不同的语法短语,确定整个输入串能够构成语法上正确的程序。

语义分析阶段:检查源程序上有没有语义错误,在代码生成阶段收集类型信息。

中间代码生成阶段:在进行了上述的语法分析和语义分析阶段的工作之后,有的编译程序将源程序变成一种内部表示形式。

代码优化:这一阶段的任务是对前一阶段产生的中间代码进行变换或进行改造,目的是使生成的目标代码更为高效,即省时间和省空间。

目标代码生成:这一阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码

55、内核申请内存vmalloc和kmalloc的区别是什么

1,vmalloc分配的一般为高端内存,只有当内存不够的时候才分配低端内存;kmallco从低端内存分配。

2,vmalloc分配的物理地址一般不连续,而kmalloc分配的地址连续,两者分配的虚拟地址都是连续的;

3,vmalloc分配的一般为大块内存,而kmaooc一般分配的为小块内存,(一般不超过128k);

56、简单描述一下数组指针和指针数组

数组指针是一个指针,指向一个数组。指针数组由n个指针类型的数组元素组成。数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。

指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。

57、简单描述linux设备驱动中的总线,设备和驱动的关系。

总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。一个现实的Linux设备和驱动通常都需要挂接在一种总线上。设备与驱动的关联通过总线的match()方法进行匹配,驱动挂载总线时与所有设备进行匹配,设备挂载总线时与所有的驱动进行匹配,所以驱动和设备的挂载无先后之分。匹配成功后会通过调用驱动的probo()方法来初始化设备。

58、简述一下什么是红黑树

红黑树是一种近似平衡的二叉查找树,它能够确保任何一个节点的左右子树的高度差不会超过二者中较低那个的一倍。具体来说,红黑树是满足如下条件的二叉查找树
1.每个节点要么是红色,要么是黑色。

2.根节点必须是黑色。

3.红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色)。

4.对于每个节点,从该点至null(树尾端)的任何路径,都含有相同个数的黑色节点。

5.最长的路径长度不会超过任意路径的两倍。

59、在FreeRTOS中,二值信号量和互斥量的区别?

互斥型信号量必须是同一个任务申请,同一个任务释放,其他任务释放无效。

同一个任务可以递归申请。

二进制信号量,一个任务申请成功后,可以由另一个任务释放。

60、在FreeRTOS中,任务通知的运行机制是怎么样的?

任务通知的数据结构包含在任务控制块中,只要任务存在,任务通知数据结构就已经创建完毕,可以直接使用。任务通知可以在任务中向指定任务发送通知,也可以在中断中向指定任务发送通知,FreeRTOS 的每个任务都有一个 32 位的通知值,任务控制块中的成员变量 ulNotifiedValue就是这个通知值。只有在任务中可以等待通知,而不允许在中断中等待通知。如果任务在等待的通知暂时无效,任务会根据用户指定的阻塞超时时间进入阻塞状态,我们可以将等待通知的任务看作是消费者;其它任务和中断可以向等待通知的任务发送通知,发送通知的任务和中断服务函数可以看作是生产者,当其他任务或者中断向这个任务发送任务通知,任务获得通知以后,该任务就会从阻塞态中解除。

61、什么情况下会栈溢出?如何避免?

1.局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。

2.递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。

3.指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。
解决这类问题的办法有两个, 一是增大栈空间,二是改用动态分配,使用堆(heap)而不是栈(stack)。

62、深复制和浅复制的区别?

浅复制:被复制对象的所有变量都含有与原来对象相同的值,而所有其他对象的引用仍然指向原来的对象。

深复制:被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象,而不再是原有的那些被引用的对象。

63、从一个源文件到可执行文件的过程?

主要包括4个过程: 1. 预处理;2.编译(产生.s文件,-s);3.汇编(产生.o或者.obj文件,-c);4. 链接

64、简述一下快速排序的步骤

1.从数列中挑出一个元素,称为 “基准”;

2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置;

3.递归地把小于基准值元素的子数列和大于基准值元素的子数列排序;

65、头文件的两种包含方式的区别

< >引用的是编译器的类库路径里面的头文件,#include <> 的查找位置是标准库头文件所在目录;

" "引用的是你程序目录的相对路径中的头文件, #include “” 的查找位置是当前源文件所在目录。

66、.CAN通信介绍;CAN通信报文的标识符有几位?

CAN 是ISO国际标准化的串行通信协议。
CAN 控制器根据两根线上的电位差来判断总线电平。
总线电平分为显性电平和隐性电平,二者必居其一。
发送方通过使总线电平发生变化,将消息发送给接收方。
通信报文标识符有标准格式和扩展格式两种格式。标准格式有11 个位的标识符(ID),扩展格式有29 个位的ID。

67、C语言结构体怎么定义节省内存

1.在保证值域足够的情况下,用小字节变量代替大字节变量,如用short替代int 2.将各成员按其所占字节数从小到大声明,以尽量减少中间的填补空间(字节对齐)。 3.可以取消字节对齐,#pragma pack(1),当然这会牺牲效率,谨慎采用。

68、STM32 中断是怎么进入到中断服务程序的

在STM32中,为了区分不同的中断,每个设备有自己的中断号。系统有0-255一共256个中断。系统有一张中断向量表,用于存放256个中断的中断服务程序入口地址。每个入口地址对应一段代码,即中断服务程序。

69、malloc和new的区别

1、申请的内存所在位置不同。new操作符从自由存储区上为对象动态分配内存空间,malloc函数从堆上动态分配内存。

2、返回类型安全性不同。new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。

3、内存分配失败时的返回值不同。new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL。malloc分配内存失败时返回NULL。

4、是否需要指定内存大小不同。使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。malloc则需要显式地指出所需内存的尺寸。

70、为什么局部变量未赋值时,每次初始化的结果是不确定的?

定义局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是反复使用的,上次用完没清零的,所以说使用栈来实现的局部变量定义时如果不显式初始化,值就是脏的,是不确定的。

71、linux的锁机制?

(1)互斥锁:mutex,保证在任何时刻,都只有一个线程访问该资源,当获取锁操作失败时,线程进入阻塞,等待锁释放。

(2)读写锁:rwlock,分为读锁和写锁,处于读操作时,可以运行多个线程同时读。但写时同一时刻只能有一个线程获得写锁。

(3)自旋锁:spinlock,在任何时刻只能有一个线程访问资源。但获取锁操作失败时,不会进入睡眠,而是原地自旋,直到锁被释放。这样节省了线程从睡眠到被唤醒的时间消耗,提高效率。

(4)条件锁:就是所谓的条件变量,某一个线程因为某个条件未满足时可以使用条件变量使该程序处于阻塞状态。一旦条件满足了,即可唤醒该线程(常和互斥锁配合使用)

(5)信号量。

72、介绍下常用的gdb命令

quit:退出gdb,结束调试

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

图片转存中…(img-d1Xgs6zH-1715715916914)]

[外链图片转存中…(img-wSVFrX7e-1715715916914)]

[外链图片转存中…(img-ZOEBWlPo-1715715916915)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

  • 23
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 什么是嵌入式系统? 嵌入式系统是一种特殊的计算机系统,通常被设计用于执行特定的任务或控制特定的设备。它通常包含有限的硬件资源和软件功能,并且被嵌入到一个更大的系统中,例如家电、汽车、医疗设备、航空航天系统等。 2. 嵌入式系统与普通计算机系统有什么不同? 嵌入式系统通常具有更小的体积、更低的功耗、更强的实时性和更高的可靠性。它们也通常需要更少的资源来实现特定的功能,例如存储器、处理器和网络连接等。 3. 嵌入式系统的硬件组成有哪些? 嵌入式系统的硬件组成通常包括处理器、存储器、输入输出接口、时钟、电源和外设等。这些组成部分可以根据实际应用需求进行定制和优化。 4. 嵌入式系统的软件开发流程是什么? 嵌入式系统的软件开发流程通常包括需求分析、系统设计、软件开发、系统测试和部署等步骤。这些步骤需要合理规划和组织,以确保软件质量和项目进度。 5. 嵌入式系统的实时性是什么意思? 嵌入式系统的实时性是指系统能够在规定的时间内响应外部事件并作出相应的操作。实时性对于许多嵌入式系统的应用非常重要,例如控制系统、汽车电子、医疗设备等。 6. 嵌入式系统的调试和测试有哪些方法? 嵌入式系统的调试和测试有许多方法,例如单元测试、集成测试、系统测试、性能测试等。这些测试方法可以帮助开发人员发现和修复软件缺陷,保证系统的稳定性和可靠性。 7. 嵌入式系统的安全性和可靠性如何保证? 嵌入式系统的安全性和可靠性可以通过多种方式来保证,例如合理的设计、正确的编码、安全的通信协议、自适应算法等。此外,系统的可靠性还需要进行严格的测试和验证,以确保系统在各种条件下都能正常运行。 8. 嵌入式系统的未来发展趋势是什么? 嵌入式系统的未来发展趋势包括更高的性能、更小的尺寸、更低的功耗、更强的安全性和可靠性、更智能的算法和更广泛的应用领域等。随着物联网和人工智能的发展嵌入式系统将在未来变得更加重要和普及。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值