您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页嵌入式面试常见问题(四)—牛客网_面试kzalloc

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

来源:叨叨游戏网

Linux中断处理过程分为两部分: 上半部:上半部就是中断处理函数,那些处理过程比较快,不会占用很长时间的处理就可以放在上半部完成。 下半部:如果中断处理过程比较耗时,那么就将这些比较耗时的代码提出来,交给下半部去执行,这样中断处理函数就会快进快出。 那些对时间敏感、执行速度快的操作可以放到中断处理函数中,也就是上半部。剩下的所有工作都可以放到下半部去执行,比如在上半部将数据拷贝到内存中,关于数据的具体处理就可以放到下半部去执行。一般来说,不希望被其他中断打断、对时间敏感、和硬件有关的任务建议放在中断上半部。

13、说一说进程的几个状态及转换条件?

进程状态包括就绪态,运行态,阻塞态,除此以外还包括新建态和退出态。 进程首次创建并未参与调度为新建态 从新建态做好准备(初始化成功)等待调度为就绪态 内核调度此进程时,此进程从就绪态转换为运行态 进程执行完内核分配的时间片后,从运行态再次回到就绪态 进程执行时如果等待其他条件满足后才能执行,则进程从运行态转换为阻塞态 阻塞的进程等待的条件满足后,进程重新进入就绪态 进程终止或者异常,进程将进入退出态

14、static修饰局部变量和全局变量会有什么效果

静态全局变量:具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被 static 关键字修饰过的变量具有文件作用域。 静态局部变量:具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在。

15、堆和栈的区别
16、简述gcc编译过程

预处理、编译、汇编和链接,一个hello.c的c语言程序如下。 预处理阶段:hello.c–>hello.i 编译阶段:hello.i–>hello.s 汇编阶段:hello.s–>hello.o 链接阶段:hello.o–>hello

17、线程与进程的区别

进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发;
线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;
线程是操作系统可识别的最小执行和调度单位。 一个线程只能属于一个进程,而一个进程可以有多个线程。进程在执行过程中拥有的内存单元,而多个线程共享进程的内存 进程是资源分配的最小单位,线程是CPU调度的最小单位进程切换的开销也远大于线程切换的开销。进程编程调试简单可靠性高,但是创建销毁开销大;线程正相反,开销小,切换速度快,但是编程调试相对复杂

18、野指针出现情况、怎么解决
19、DMA有什么用

直接存储器存取(Direct Memory Access,DMA)可以让某些电脑内部的硬体子系统(电脑外设),可以地直接读写系统存储器,而不需绕道 CPU。在同等程度的CPU负担下,DMA是一种快速的数据传送方式。它允许不同速度的硬件装置来沟通,而不需要依于 CPU的大量中断请求。大大提高了访问效率,减少访问时间,降低CPU资源的消耗。

20、说一说RISC和CISC的区别

精简指令集RISC和复杂指令集CISC CISC处理的是不等长指令集,它必须对不等长指令进行分割,因此在执行单一指令的时候需要进行较多的处理工作。而RISC执行的是等长精简指令集,CPU在执行指令的时候速度较快且性能稳定。因此在并行处理方面RISC明显优于CISC,RISC可同时执行多条指令,它可将一条指令分割成若干个进程或线程,交由多个处理器同时执行。由于RISC执行的是精简指令集,所以它的制造工艺简单且成本低廉。

21、谈一谈什么是系统声明周期,说说你对敏捷开发的理解以及和SDLC的关系

SDLC:sdlc(系统生命周期,系统生存周期)是软件的产生直到报废的生命周期,是软件工程中的一种思想原则,包括: 问题定义及规划、需求分析、软件设计、程序编码、软件测试、运行维护 敏捷开发的核心是迭代开发(iterative development)。敏捷一定是采用迭代开发的方式。迭代开发将一个大任务,分解成多次连续的开发,本质就是逐步改进。一般采用"增量开发"(incremental development)划分迭代。所谓"增量开发",指的是软件的每个版本,都会新增一个用户可以感知的完整功能。 虽然敏捷开发将软件开发分成多个迭代,但是也要求,每次迭代都是一个完整的软件开发周期,必须按照软件工程的方,进行正规的流程管理。也就是说,敏捷开发的每一次迭代都需要一个完整的SDLC。

22、说说对MMU及TLB的理解
23、芯片选型考虑哪些因素?

1.根据功能设计需求、成本、供应商等主要因素初步确定几款合适的芯片。
2.普通I/O口,考虑数量、负载能力,还需要保证裕量,如果有迭代升级,还需要考虑兼容性
3.片上存储和外围存储,保证bootloader和程序image的容量;内存支持,由程序的RAM需求决定
4.主频及时钟,决定芯片的运行效率,响应和处理速度
5.电源及功耗,由板上电源和承载能力决定
6.如果是CPU芯片,考虑多核和多线程并发能力;如果是FPGA芯片,考虑逻辑单元资源数;如果是DSP芯片,考虑浮点计算能力
7.工作环境,如辐射、单粒子和温度范围 8.芯片成本和交付日期,是否可以购买到,以及购买周期与开发周期的平衡 总结,与软件相关的因素:I/O,内存,外存,处理器核和多线程,系统可移植性等

24、有cache的CPU上使用DMA如何保证数据的一致性
25、volatile关键字作用?
26、简述字节对齐?
  1. 数据类型自身的对齐值:char型数据自身对齐值为1字节,short型数据为2字节,int/float型为4字节,double型为8字节。
  2. 结构体或类的自身对齐值:其成员中自身对齐值最大的那个值。
  3. 指定对齐值:#pragma pack (value)时的指定对齐值value。
  4. 数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小者,即有效对齐值=min{自身对齐值,当前指定的pack值}。
27、宏函数和内联函数的区别

内联函数是代码被插入到调用者代码处的函数。如同#define宏,内联函数通过避免被调用的开销来提高执行效率,尤其是它能够通过调用(“过程化集成”)被编译器优化。 宏定义不检查函数参数和返回值,只是展开,相对来说,内联函数会检查参数类型,所以更安全。 内联函数和宏很类似,而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以像调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。

28、虚拟地址怎么转换到物理地址
29、进程A执行,发生一个中断,中断发了一个信号,会让更高优先级的进程B执行,这时候中断结束,应该返回进程A还是进入进程B,并解释理由

返回进程A。操作系统中中断优先级高于普通的进程,中断发生时,将保护进程A的现场并进入中断上下文,此时进程A仍然是执行态;中断结束后,操作系统将恢复进程A的现场并执行剩下的时间片,进程B的优先级虽然提高了,但需要等待A执行结束后下次调度时才可以执行,如果系统中没有其他中断或者更高优先级的进程的情况。

30、如果两个进程,都要去调用一个设备驱动,设备驱动里面定义的变量是在内核态吗?如果进程A访问并改变了这个变量,那么进程B再访问,是不是读到改变之后的值

驱动程序中的变量是在内核态中,因为操作系统只有内核态可以访问到硬件设备,驱动程序从内核态像用户态输出API以便调用和间接访问硬件设备。 进程B访问的是改变后的值,只有在没有考虑并发编程的驱动程序中才可能发生数据的不一致性。内核驱动程序开发必须考虑并发的问题,因为驱动程序将会被一个或者多个进程访问,对于共享的变量,需要加入互斥锁、自旋锁、信号量或者原子操作等同步技术保证数据的一致性。

最后

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

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

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

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

系化!**

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务