嵌入式面试题(一)

1、linux 上应用程序开发(用户空间)不能使用物理地址这个说法对吧?那么怎么见到有些 c 程序里使用二进制的地址值呢? 物理地址,二进制地址给我绕的有点晕,老师能帮我解答一下么?C 语言编程里也可以操纵寄存器,那这样用 C 编写的应用程序里面也有寄存器地址啊,这样来讲应用程序里不是就有物理地址了么?

解答:物理地址和二进制没有关系,二进制只是表示数据的方式而已。c 语言是可以操作地址, 但是在操作系统中有虚拟地址的概念,你在 linux 下编写的程序操作的地址可不是物理地址,是进程的虚拟地址,如果你写裸机程序, c 语言当然可以操作物理地址啦。


2、老师,你好,请问一下平台设备驱动与字符设备驱动是怎么分的?字符设备驱动我可以这样来写驱动模块编写,设备文件创建,编写应用程序来调用,但平台设备驱动的编写是什么样的流程,该从哪里入手?谢谢!

解答:平台设备其实是只挂接在虚拟总线上的设备,区别于USB\IIC\SPI等实体总线,平台设备并不是与字符设备、块设备和网络设备并列的>概念,通常平台总线用于管理 SOC 上的外设, 如 RTC\LCD\WATCHDOG 等。平台设备驱动是基于 linux 的设备、总线、驱动模型,总线就是 platform bus,设备通常用于管理平台驱动要使用的资源,比如一些寄存器、和中断,总线部分不需要管,因为内核帮我们做了,设备部分需要根据资源注册平台设备,驱动部分主要是注册平台设备驱动,需要实现一些主要的操作,比如probe,probe里面主要是提供获取平台资源,并注册真正的设备(字符设备或者其他形式如混杂设备).


3、空指针相关概念

什么是空指针常量(null pointer constant)?

An integer constant expression with the value 0, or such an expression cast to type void , is called a null pointer constant. 这里告诉我们: 0、 0L、 '\0'、 3 - 3、 0 17 (它们都是―integer constantexpression‖)以及 (void)0等都是空指针常量(注意 (char) 0 不叫空指针常量,只是一个空指针值)。至于系统选取哪种形式作为空指针常量使用,则是实现相关的。一般的 C 系统选择 (void)0 或者 0 的居多(也有个别的选择 0L);至于 C++ 系统,由于存在严格的类型转化的要求,void 不能象 C 中那样自由转换为其它指针类型,所以通常选 0 作为空指针常量,而不选择 (void*)0。

2. 什么是空指针(null pointer)?

If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function. 因此,如果 p 是一个指针变量,则 p = 0;、 p = 0L;、 p = '\0';、 p = 3 - 3;、 p = 0 * 17; 中的任何一种赋值操作之后(对于 C 来说还可以是p=(void*)0;),p都成为一个空指针,由系统保证空指针不指向任何实际的 对象或者函数。反过来说,任何对象或者函数的地址都不可能是空指针。

3. 什么是 NULL?

The macro NULL is defined in “stddef.h” (and other headers) as a null pointer constant. 即 NULL 是一个标准规定的宏定义,用来表示空指针常量。因此,除了上面的各种赋值方式之外,还可以用 p = NULL; 来使 p 成为一个空指针。

4. 空指针(null pointer)指向了内存的什么地方(空指针的内部实现)?

标准并没有对空指针指向内存中的什么地方这一个问题作出规定,也就是说用哪个具体的地址值(0x0 地址还是某一特定地址)表示空指针取决于系统的实现。我们常见的空指针一般指向 0 地址,即空指针的内部用全 0来表示(zero null pointer,零空指针);也有一些系统用一些特殊的地址值或者特殊的方式表示空指针(nonzero null pointer,非零空指针),具 体请参见 C FAQ。幸运的是,在实际编程中不需要了解在我们的系统上空指针到底是一个zero null pointer 还是 nonzero null pointer,我们只需要了解一个指针是否是空指针就可以了——编译器会自动实现其中的转换,为我们屏蔽其中的实现细节。注意:不要把空指针的内部表示等同于整数 0 的对象表示,有时它们是不同的.

5. malloc 函数在分配内存失败时返回 0 还是 NULL?

malloc 函数是标准 C 规定的库函数。在标准中明确规定了在其内存分配失败时返回的是一个 ―null pointer(空指针): If the space cannot be allocated, a null pointer is returned. 对于空指针值,一般的文档(比如 man)中倾向于用 NULL 表示,而没有直接说成 0。但是我们应该清楚:对于指针类型来说,返回 NULL 和 返回 0 是完全等价的,因为 NULL 和 0 都表示 ―null pointer(空指针).

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程心路

Java 动态代理,看这篇就够了

这篇文章需要用到 Java 的反射知识,如果对反射还不清楚的小伙伴,可以先移步到这里 《Java进阶-反射》。

19940
来自专栏Vamei实验室

Python标准库02 时间与日期 (time, datetime包)

Python具有良好的时间和日期管理功能。实际上,计算机只会维护一个挂钟时间(wall clock time),这个时间是从某个固定时间起点到现在的时间间隔。时...

26260
来自专栏阿杜的世界

如何设计接口的测试用例边界值测试组合条件测试

今天在帮同事review代码的时候,发现他的代码遗漏了一些场景的处理,就顺便跟他多聊了些为对这个话题的看法。

11120
来自专栏葡萄城控件技术团队

C#开发人员应该知道的13件事情

本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助。 1. 开发过程 开发过程是错误和缺陷开始的地方。使用工具可以帮助你在发布之后,解决掉...

25190
来自专栏我的技术专栏

Java多线程编程—锁优化

16170
来自专栏PHP在线

十个 PHP 开发者最容易犯的错误

PHP 语言让 WEB 端程序设计变得简单,这也是它能流行起来的原因。但也是因为它的简单,PHP 也慢慢发展成一个相对复杂的语言,层出不穷的框架,各种语言特性和...

40250
来自专栏C语言及其他语言

【编程经验】C语言程序真正的启动函数(文末有福利,第二弹)

又到了小编和大家说到的时间了,闲话少说,直接上正题,今天就讲讲“C语言程序真正的启动函数”。 为什么要用”真正”这个词?因为我们从...

339120
来自专栏Android机动车

设计模式——代理模式

现在有个非常流行的程序叫做面向切面编程(AOP),其核心就是采用了动态代理的方式。怎么用?Java为我们提供了一个便捷的动态代理接口 InvocationHan...

11010
来自专栏程序员宝库

十个 PHP 开发者最容易犯的错误

PHP 语言让 WEB 端程序设计变得简单,这也是它能流行起来的原因。但也是因为它的简单,PHP 也慢慢发展成一个相对复杂的语言,层出不穷的框架,各种语言特性和...

50190
来自专栏决胜机器学习

设计模式专题(五)——工厂方法模式

设计模式专题(五)——工厂方法模式 (原创内容,转载请注明来源,谢谢) 一、概述 1、工厂方法与简单工厂模式区别 工厂方法模式与简单工厂模式不同 简单工厂模...

39790

扫码关注云+社区

领取腾讯云代金券