前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >嵌入式面试题(一)

嵌入式面试题(一)

作者头像
Daotin
发布2018-08-31 11:56:18
7210
发布2018-08-31 11:56:18
举报

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(空指针).

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、linux 上应用程序开发(用户空间)不能使用物理地址这个说法对吧?那么怎么见到有些 c 程序里使用二进制的地址值呢? 物理地址,二进制地址给我绕的有点晕,老师能帮我解答一下么?C 语言编程里也可以操纵寄存器,那这样用 C 编写的应用程序里面也有寄存器地址啊,这样来讲应用程序里不是就有物理地址了么?
  • 2、老师,你好,请问一下平台设备驱动与字符设备驱动是怎么分的?字符设备驱动我可以这样来写驱动模块编写,设备文件创建,编写应用程序来调用,但平台设备驱动的编写是什么样的流程,该从哪里入手?谢谢!
  • 3、空指针相关概念
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档