嵌入式软件开发面试题(二)

1. DMA有什么作用?
DMA是“直接存储器存取”的缩写,它可以让电脑内部的某些硬件子系统绕过CPU,独立地直接读写系统存储器。在同等的CPU负担下,它是一种快速的数据传送方式,提高了访问效率,缩短了访问时间,降低了CPU资源的消耗。
2. RISC和CISC的区别?
RISC是精简指令集,CISC是复杂指令集。
前者处理的是等长指令集,可同时执行多条指令,速度较快且性能稳定,并且制造工艺简单,成本低。
后者处理的是不等长指令集,需对指令进行分割,所以速度比较慢。前者更具有优势。
3. Linux中断的原理和开发方法?
中断过程分为两部分:上半部和下半部。
上半部主要完成处理那些占用时间较短的过程。如果中断处理过程比较耗时,那么就将这些耗时的代码提取出来,交给下半部去执行,这样中断处理函数就会快进快出。
4. 静态局部变量,静态全局变量,及全局变量的区别?
普通全局变量的作用域是整个源程序,源程序中的源文件都可以使用。
静态全局变量只能作用于定义它的文件里,不能作用到同一程序的其它文件里。
静态局部变量具有局部作用域,只被初始化一次,直到程序运行结束都一直存在。
5. 什么是野指针?产生的原因是什么?出现的情况有哪些?如何处理?
野指针:它是指那些指向位置随机的,错误的指针。
产生原因:1)创建指针时未对其初始化,导致其指向一个随机位置。2)释放指针指向的内存后没有置空。
(1)指针变量声明时没有被初始化,可以在声明时初始化,可以是具体的地址值,也可以让它指向NULL
(2)指针P被释放或删除后,未置空。指针指向的内存空间被释放后,指针应该指向空。
(3)指针操作超越了变量的作用范围。在变量的作用域结束前,释放掉变量的地址空间,并且让指针指向空。
6. volatile关键字的作用?
变量以volatile为关键字,即表明这个变量可能会被意想不到地改变,之后编译器就不会去假设这个变量的值了。也就是说,优化器在用到这个变量时,每次都必须小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
7. 结构体的字节对齐
char为1字节,short为2字节,int/float为4字节,double为8字节。
结构体的大小与成员的数据类型,定义顺序有关,是最长成员字节数的整数倍。
8. C语言中,static关键字的作用?
static用于定义静态变量:
(1)在函数体内,被声明为静态的变量,在函数被调用过程中,保持原值不变;
(2)在模块内(但在函数体外),被声明为静态的变量,只允许模块内所用函数访问,它是一个本地的局部变量;
(3)在模块内,声明为静态的函数,只能被模块内其它函数调用。
9. TCP三次握手过程?为何需要三次?第三次握手可以省去吗?
A:(1)客户端发送SYN包到服务器,进入SYN_SEND 状态,等待服务器确认。
(2)服务器收到SYN包后,先确认,然后回发送一个SYN+ACK包,之后进入SYN_REC 状态。
(3)客户端收到SYN+ACK包后,发送ACK包确认,之后客户端和服务器进入TCP连接成功状态。
B:原因:三次握手主要是为了确认双方的发送能力和接收能力是否正常,指定自己的初始化序列号,为后面的传输做准备。
C:不可省,因为第三次握手可以预防发送死锁。
若为两次握手,在服务器发起第二次握手后,客户端没有收到的情况下,当服务器开始传送数据包后,客户端不会反应,导致服务器以为丢包而源源不断地发送数据报,造成死锁。
10. TCP的四次挥手过程?
注:三次握手是建立连接,四次挥手是释放连接。
(1)客户端发送一个FIN包,中断客户端和服务端的数据传送,客户端进入FIN_wait_1状态
(2)服务端收到FIN包后,发送一个ACK给客户端,服务端进入CLOSE_wait状态
(3)服务端发送一个FIN,关闭服务端到客户端的数据传送,服务端进入LAST_ack状态
(4)客户端收到FIN后,进入TIME_wait状态,接着发送一个ACK给服务端,服务端确认后,进入CLOSED状态。

嵌入式软件开发面试,可能会涉及以下几个方面的问题: 1. 嵌入式系统的特点和应用领域:嵌入式系统是指具有特定功能和任务的计算机系统,常常被用于控制和监控设备,如汽车、家电、工业设备等。面试官可能会问到嵌入式系统的特点,如实时性、功耗要求、资源受限等,以及常见的应用领域。 2. C语言的位操作:嵌入式系统经常需要对特定的寄存器或内存位置进行位操作。你可以引用的代码示例来说明如何使用位操作宏定义来设置和清除特定的位。 3. 嵌入式系统的绝对地址访问:有时候,嵌入式系统需要直接访问特定的内存地址来进行数据操作。你可以引用的代码示例来说明如何使用指针来访问绝对地址,并操作其的数据。 4. 中断处理:中断嵌入式系统重要的组成部分,用于响应外部事件并进行相应的处理。你可以讨论中断的基本概念和作用,并提到在一些编译开发商提供的扩展,可以使用关键字__interrupt来定义中断服务子程序(ISR)。你可以引用的代码示例来说明如何使用__interrupt关键字定义一个中断服务子程序。 5. 预处理指令的使用:在嵌入式软件开发,预处理指令是常见的工具。你可以引用的代码示例来说明如何使用预处理指令#define来声明一个常数,并使用它来表示1年的秒数。 总结起来,在嵌入式软件开发面试,除了基本的软件开发知识外,还需要了解嵌入式系统的特点、C语言的位操作、绝对地址访问、中断处理以及预处理指令的使用等方面的知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值