嵌入式开发面试题解答

1.malloc/free和new/delete异同点

内存图:

相同点:

        malloc和new都是开辟堆内存空间,free和delete 都是释放堆内存空间

不同点:

(1)malloc和free是函数,new/delete是操作符

(2)malloc开辟空间的时候需要手动计算空间大小,new开辟空间时自动计算空间的大小

(3)malloc函数返回值类型为void*,使用时需要强制类型转换,new后面跟的是空间的类型,不需要强制类型转换

(4)malloc函数开辟空间的时候没有对空间进行初始化的工作,new开辟空间的时候可以对该空间进行初始化赋值操作

(5)malloc函数只能用于基本的数据类型,不能用于自定义类型(结构体除外),new不仅可以用于基本的数据类型,也可以用于自定义类型。

2.sizeof和strlen的区别 

(1)sizeof是运算符,strlen是函数

(2)sizeof可以用类型函数作为参数,strlen找你计算char*,它必须以“/0”结尾作为它的一个计算结束标志

(3)sizeof是编译的时候计算,计算的是内存的大小;strlen是运行期间去计算,表示的是字符串长度,不是内存大小

3.struct和union的区别

(1)联合体成员公用同一块地址空间,所以联合体变量字节大小等于成员中字节最大的

(2)对不同成员赋值会影响其它成员读值的结果

4.数组名和指针的区别

(1)指针保存的是地址,数组保存的是数据

(2)数组的名字表示的是整个数组的首地址,也是数组第一个成员的首地址

(3)指针通过地址间接的访问数据,数组通过下标的偏移来访问数据

(4)指针是指针地址值,存储的字节大小,数组计算的是数组的整个空间,也就是所有数据所占的这个内存大小 

 5.数组清空的方法

(1)bzero函数

(2)memset函数

6.同步IO和异步IO的区别

(1)在同步IO中,当一个IO执行时,应用程序必须等待直到此IO执行完。

(2)在异步IO中,IO操作和应用程序可以同时运行,提高系统性能,提高IO流量

(3)在同步IO中,线程启动一个IO操作,然后就立即进入等待状态,直到IO操作完成后才能醒来继续执行,而异步文件IO中,线程发送一个IO请求到内核,然后继续处理其它的事情。内核完成IO请求后将会通知线程IO完成操作

 7.局部变量能否和全局变量重名

编译的时候能通过,实际输出的时候根据就近原则,优先输出局部变量的值。它的本质是因为生命周期和作用域不同,如果想要输出全局变量的值,输出语句要在局部变量的作用域外,这样调用不到局部变量就可以去调用全局变量的值。

8.红黑树 

红黑树就是一个自平衡的二叉查找树,树上的每一个节点都遵循:

(1)每一个节点都有红色或黑色

(2)树的根始终是黑色的、红色节点不能有红色父节点或红色子节点

(2)从节点到NULL节点的每条路径上都有相同数量的黑色节点

9. 用预处理指令#define声明一个常数,用于表明一年中有多少秒?(忽略闰年问题)

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 

需要注意的是

1.由于宏定义是预处理指令,而非语句,所以在进行宏定义时,不能以分号结束。

2.预处理只会执行简单的替换,不会计算表达式的值,所以要注意括号的使用,直接写出是如何计算出一年中有多少秒,而不是计算出实际的值。

3.意识到这个表达式将使一个16位机的整型数溢出,因此要用到长整型符号L,告诉编译器这个常数是的长整型数。  
4. UL:表示无符号长整型

10.写一个标准宏MIN,这个宏输入两个参数并返回较大的一个;

#define MIN(x,y) ((x) > (y) ? (x) : (y))

宏定义的注意两点:

1、数据类型是否有溢出的风险(如一年有多少个秒的宏);

2、带参宏的每个参数都要用括号括起来。

11.串口和并口的区别?

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口(SerialInterface)是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。并口是8位并排排一起传输。

并口一般指并行接口。并行接口,指采用并行传输方式来传输数据的接口标准。数据的宽度可以从1~128位或者更宽,最常用的是8位,可通过接口一次传送8个数据位。

12.用变量a给出下面的定义

a)一个整型数

int a;

b)一个指向整型数的指针 ,它指向的指针是指向一个整型数

int *a;

c)一个指向指针的的指针,

int **a;

d)一个有10个整型数的数组

int a[10];

e)一个有 10 个指针的数组,该指针是指向一个整型数的。

int *a[10];

f)一个指向有 10个整型数数组的指针

int (*a)[10];

13.关键字 extern, static的作用分别是什么?

extren:

extern放在变量和函数声明之前,表示该变量或者函数在别的文件中已经定义,提示编译器在编译时要从别的文件中寻找。

static:

(1)在修饰变量的时候,static 修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
(2)static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以。
(3)static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。static 修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,都在全局数据区分配内存。初始化的时候自动初始化为 0。

14.C语言中堆和栈的区别?

1、存储内容不同

栈:在函数调用时,栈中存放的是函数中各个参数(局部变量)。栈底下是函数调用后的下一条指令。

堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。

2、管理方式上不同

栈:由系统自动分配空间,同时系统自动释放空间。例如,声明在函数中一个局部变量“int b“。系统自动在栈中为b开辟空间,当对应的生存周期结束后栈空间自动释放。

堆:需要程序员手动申请并且手动释放,并指明大小。在C语言中malloc函数申请,释放free函数,在C++中new和delete实现。

3、空间大小不同

栈:获取空间较小。在Windows下,一般大小是1M或2M,当剩余栈空间不足时,分配失败overflow。

堆:获得空间根据系统的有效虚拟内存有关,比较灵活,比较大。

4、能否产生碎片不同

栈:不会产生碎片,空间连续。

堆:采用的是链表的存储方式,会产生碎片。

5、生长方向不同

栈:向低地址扩展的数据结构,是一块连续的内存的区域。

堆:向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。

6、分配方式不同

栈:有2种分配方式——静态分配和动态分配。静态由编译器完成,例如局部变量;动态由alloca函数实现,并且编译器会进行释放。

堆:都是动态分配的,没有静态分配的堆。

7、分配效率不同

栈:由系统自动分配,速度较快。但程序员是无法控制的。

堆:由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来方便。

15.简述linux设备驱动中使用中断的步骤?

1.在设备树中添加中断设备节点信息

如:

key_int_node {
compatible = "key3";
interrupt-parent = <&gpx1>;
interrupts = <2 4>;
};

2.获取中断号

//根据路径获取设备树中的节点
struct device_node *of_find_node_by_path(const char *path);
参数:
参数1:
const char *path:设备树中节点路径
返回值:
获取到的节点

3.request_irq,申请中断

4.free_irq,释放中断

16.Linux设备驱动程序中,中断下半部分机制?

tasklet、软中断、工作队列

17.如何将一个字符设备驱动改造为platform驱动,并说明匹配过程?

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
嵌入式驱动面试题总汇是一个收集整理了网友们在面试中遇到的问题的资源。在面试中,很多人在回答与驱动相关的问题时可能会感到困难,因此这个总汇可以帮助他们更好地准备面试。 以下是一些面试问题的示例: 1. 在使用insmod命令加载一个驱动模块时,会执行模块中的哪个函数?rmmod命令又会执行哪个函数?在设计驱动时,这两个函数需要注意哪些方面? 2. 你有遇到过在卸载驱动时出现异常的情况吗?如果有,是什么问题导致的? 3. 在驱动中,为什么需要并发和互斥的控制?你可以举个例子来说明吗? 并发指的是多个执行单元同时并行执行,而并发执行单元对共享资源的访问可能会导致竞态条件。在驱动中,我们需要确保对共享资源的访问是安全的,并发和互斥的控制是为了避免竞态条件的发生。 例如,在一个多线程的驱动中,多个线程可能会同时访问同一个共享资源,如果没有合适的并发和互斥的控制,就会导致数据的不一致性或者竞争条件,从而影响系统的稳定性和可靠性。因此,我们需要使用锁或者信号量等机制来实现对共享资源的并发和互斥的控制。这样可以确保每个线程在访问共享资源时按照特定的顺序进行,避免了竞态条件的发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [嵌入式Linux设备驱动面试题汇总](https://blog.csdn.net/chbgoon/article/details/122936954)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春风从不入睡、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值