嵌入式基础知识.docx

上传人:b****5 文档编号:29213303 上传时间:2023-07-21 格式:DOCX 页数:28 大小:33.55KB
下载 相关 举报
嵌入式基础知识.docx_第1页
第1页 / 共28页
嵌入式基础知识.docx_第2页
第2页 / 共28页
嵌入式基础知识.docx_第3页
第3页 / 共28页
嵌入式基础知识.docx_第4页
第4页 / 共28页
嵌入式基础知识.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

嵌入式基础知识.docx

《嵌入式基础知识.docx》由会员分享,可在线阅读,更多相关《嵌入式基础知识.docx(28页珍藏版)》请在冰豆网上搜索。

嵌入式基础知识.docx

嵌入式基础知识

1、指针与引用的区别:

非空区别:

在任何情况下都不能用指向空值的引用,引用必须指向某个对象。

指针可以指向空

合法性区别:

在使用引用之前不需要判断它的合法性,使用指针之前需要判断它的合法性。

防止指向空值的指针。

可修改区别:

指针可以指向不同的对象,引用始终指向初始化时的对象,不可修改。

2、指针和引用的应用范围:

考虑到存在不指向任何对象的可能与需要在不同的时刻指向不同的对象则用指针,否则用引用。

(引用的效率高于指针)。

3、实时系统的定义:

在特定的时间内完成特定的任务。

4、实时系统的特性

实时性,可靠性,交互性,独立性,多路性。

5、变量在内存中的区别:

局部变量存储在栈区

全局变量在静态数据库

Static静态变量在堆区

6、TCP/IP协议的主要层次结构:

应用层传输层网络层数据链路层物理层

7、IP地址的组层:

网络号、主机号两部分组成

8、软件测试的方法:

黑盒:

针对系统功能的测试

白盒:

测试函数功能,够函数的接口

9、static有什么用途?

(请至少说明两种)

1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。

它是一个本地的全局变量。

3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。

那就是,这个函数被限制在声明它的模块的本地范围内使用

10、全局变量和局部变量在内存中是否有区别?

如果有,是什么区别?

全局变量储存在静态数据库,局部变量在堆栈。

11、什么是平衡二叉树?

左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。

12、堆栈溢出一般是由什么原因导致的?

没有回收垃圾资源及层次太深的递归调用。

13、什么函数不能声明为虚函数?

constructor函数不能声明为虚函数。

14、冒泡排序算法的时间复杂度是什么?

时间复杂度是O(n^2)。

15、写出floatx与“零值”比较的if语句。

if(x>0.000001&&x<-0.000001)

16、Internet采用哪种网络协议?

该协议的主要层次结构?

Tcp/Ip协议

主要层次结构为:

应用层/传输层/网络层/数据链路层/物理层。

17、Internet物理地址和IP地址转换采用什么协议?

ARP(AddressResolutionProtocol)(地址解析协议)

18、IP地址的编码分为哪俩部分?

IP地址由两部分组成,网络号和主机号。

不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。

19、不能做switch()的参数类型是:

switch的参数不能为实型。

20、 预处理器标识#error的目的是什么?

#error停止编译并显示错误信息 

21、关键字const有什么含意?

1)只读。

2)使用关键字const也许能产生更紧凑的代码。

3)使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。

22、关键字volatile有什么含意?

并给出三个不同的例子。

优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

1)并行设备的硬件寄存器(如:

状态寄存器)

2)一个中断服务子程序中会访问到的非自动变量(Non-automaticvariables)

3)多线程应用中被几个任务共享的变量

23、 一个参数既可以是const还可以是volatile吗?

是的。

一个例子是只读的状态寄存器。

它是volatile因为它可能被意想不到地改变。

它是const因为程序不应该试图去修改它。

24、mutex和spin_lock的区别

两者在调度机制上略有不同。

对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。

但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。

25、什么是UART?

是一种通用串行数据总线,用于异步通信。

该总线双向通信,可以实现全双工传输和接收。

在嵌入式设计中,UART用来主机与辅助设备通信。

26、SPI是串行外设接口(SerialPeripheralInterface)的缩写。

SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线。

27、I2C总线(I2Cbus,Inter-ICbus)是一个双向的两线连续总线,同步通信方式,提供集成电路(ICs)之间的通信线路。

I2C总线是一种串行扩展技术。

28、open和fopen的区别1)fopen在用户态下就有了缓存,在进行read和write的时候减少了用户态和内核态的切换,而open则每次都需要进行内核态和用户态的切换;表现为,如果顺序访问文件,fopen系列的函数要比直接调用open系列快;如果随机访问文件open要比fopen快。

2)fopen是ANSIC标准中的C语言库函数,返回的是文件结构的指针,文件描述符;open系统调用,返回的是文件句柄。

29、引用作为参数的优点:

1)传递引用给函数与传递指针的效果是一样的。

2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作(注意:

正是因为这点原因,所以返回一个局部变量的引用是不可取的。

因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtimeerror!

3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。

而引用更容易使用,更清晰。

30、什么是容器?

即为存放数据的地方。

分为两类。

序列式容器和关联式容器。

序列式容器:

vector,list,deque等;关联式容器:

内部结构基本上是一颗平衡二叉树。

所谓关联,指每个元素都有兼职和一个实值。

31、 迭代器:

它提供了一种方法,使之能够按照顺序访问某个容器所含的各个元素,但是无需暴露该容器的内部结构。

它将容器和算法分开,好让这二者独立设计。

32、开发中常用到的数据结构有哪些?

数组,链表,树。

也会用到栈(先进后出)和队列(先进先出)。

33、数组和链表的区别:

数组用来处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小;链表是一种常见的数据组织形式,它采用动态分配内存的形式实现。

需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费。

34、进程和线程的差别?

答:

线程是指进程内的一个执行单元,也是进程内的可调度实体.区别:

1)调度:

线程作为调度和分配的基本单位,进程作为拥有资源的基本单位

2)并发性:

不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行

3)拥有资源:

进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.

4)系统开销:

创建撤消进程,系统都要为之分配和回收资源,系统的开销明显大于创建撤消线程

35、所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。

链表又分为单链表、双向链表和循环链表等。

链表有一个“头指针”变量,以head表示,它存放一个地址。

该地址指向一个元素。

链表中每一个元素称为“结点”,每个结点都应包括两个部分:

一为用户需要用的实际数据,二为下一个结点的地址。

因此,head指向第一个元素:

第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。

36、链表的基本操作

37、关键字static的作用是什么?

在C语言中,关键字static有三个明显的作用:

1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。

它是一个本地的全局变量。

3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。

那就是,这个函数被限制在声明它的模块的本地范围内使用。

38、.h头文件中的ifndef/define/endif 的作用?

防止该头文件被重复引用。

39、#include与#include“file.h”的区别?

答:

前者是从StandardLibrary的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。

40、局部变量能否和全局变量重名?

答:

能,局部会屏蔽全局。

要用全局变量,需要使用”:

:

”局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。

对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

41、如何引用一个已经定义过的全局变量?

可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定将那个变量写错了,那么在编译期间会报错,如果用extern方式引用时,假定犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

42、do……while和while……do有什么区别?

答、前一个循环一遍再判断,后一个判断以后再循环。

43、statac全局变量、局部变量、函数与普通全局变量、局部变量、函数static全局变量与普通的全局变量有什么区别?

static局部变量和普通局部变量有什么区别?

static函数与普通函数有什么区别?

答、全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。

全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。

这两者在存储方式上并无不同。

这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。

而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。

由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。

把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

static函数与普通函数作用域不同。

仅在本文件。

只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。

对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件static全局变量与普通的全局变量有什么区别:

static全局变量只初使化一次,防止在其他文件单元中被引用;static局部变量和普通局部变量有什么区别:

static局部变量只被初始化一次,下一次依据上一次结果值;static函数与普通函数有什么区别:

static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

44、程序的内存分配答:

一个由C/C++编译的程序占用的内存分为以下几个部分

1)栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。

其操作方式类似于数据结构中的栈。

2)堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。

注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3)全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

程序结束后由系统释放。

4)文字常量区—常量字符串就是放在这里的。

程序结束后由系统释放。

5)程序代码区—存放函数体的二进制代码。

45、解释堆和栈的区别答:

堆(heap)和栈(stack)的区别

(1)申请方式stack:

由系统自动分配;heap:

需要程序员自己申请,并指明大小

(2)申请后系统的响应栈:

只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。

堆:

首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。

(3)申请大小的限制栈:

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

堆:

堆是向高地址扩展的数据结构,是不连续的内存区域。

(4)申请效率的比较:

栈:

由系统自动分配,速度较快。

堆:

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

(5)堆和栈中的存储内容栈:

在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。

注意静态变量是不入栈的。

当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。

堆:

一般是在堆的头部用一个字节存放堆的大小。

堆中的具体内容由程序员安排。

(6)存取效率的比较

46、什么是预编译,何时需要预编译?

预编译又称为预处理,是做些代码文本的替换工作。

处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预备工作的阶段。

47、三种基本的数据模型按照数据结构类型的不同,将数据模型划分为层次模型、网状模型和关系模型

48、结构与联合有和区别?

答:

(1).结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员(所有成员共用一块地址空间),而结构的所有成员都存在(不同成员的存放地址不同)。

(2).对于联合的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值是互不影响的。

49、在Linux系统中,以文件方式访问设备。

50、Linux内核引导时,从文件/etc/fstab中读取要加载的文件系统。

51、Linux文件系统中每个文件用i字节来标识。

52、全部磁盘块由四个部分组成,分别为引导块、i字节表块、专用块、数据储存块。

53、链接分为:

硬链接和符号链接。

54、超级块包含了i字节表和空闲块表等重要的文件系统信息。

55、某文件的权限为:

drw-r--r--,用数值形式表示该权限,则该八进制数为:

644,该文件属性是目录。

56、前台起动的进程使用ctrl+c终止。

57、静态路由设定后,若网络拓扑结构发生变化,需由系统管理员修改路由的设置。

58、网络管理的重要任务是:

控制和监控。

59、安装Linux系统对硬盘分区时,必须有两种分区类型:

文件系统分区和交换分区。

60、编写的Shell程序运行前必须赋予该脚本文件执行权限。

61、系统管理的任务之一是能够在分布式环境中实现对程序和数据的安全保护、备份、恢复和更新。

62、系统交换分区是作为系统虚拟储存器的一块区域。

63、内核分为进程管理系统、文件管理系统、I/O管理系统和内存管理系统等四个子系统。

64、内核配置是系统管理员在改变系统配置硬件时要进行的重要操作。

65、在安装Linux系统中,使用netconfig程序对网络进行配置,该安装程序会一步步提示用户输入主机名、域名、域名服务器、IP地址、网关地址和子网掩码等必要信息。

66、唯一标识每一个用户的是用户ID和用户名。

67、RIP协议是最为普遍的一种内部协议,一般称为动态路由选择协议。

68、在Linux系统中所有内容都被表示为文件,组织文件的各种方法称为文件系统。

69、DHCP可以实现动态IP地址分配。

70、系统网络管理员的管理对象是服务器、用户和服务器的进程以及系统的各种资源。

71、网络管理通常由检测、传输和管理三部分组成,其中管理部分是整个网络管理的中心。

72、当想删除本系统用不上的设备驱动程序时必须编译内核,当内核不支持系统上的设备驱动程序时,必须对内核升级。

73、Ping命令可以测试网络中本机系统是否能到达一台远程主机,所以常常用于测试网络的连通性。

74、vi编辑器具有两种工作模式:

命令模式和输入模式。

75、可以用ls–al命令来观察文件的权限,每个文件的权限都用10位表示,并分为四段,其中第一段占1位,表示文件类型,第二段占3位,表示文件所有者对该文件的权限。

76、DNS实际上是分布在internet上的主机信息的数据库,其作用是实现IP地址和主机名之间的转换。

77、Apache是实现WWW服务器功能的应用程序,即通常所说的“浏览web服务器”,在服务器端web服务器的就是apache应用程序。

78、在Linux系统上做备份可以有两种类型:

系统备份和用户备份。

其中前者是指对操作系统的备份,后者是指对应用程序和用户文件的备份。

79、CD-ROM标准的文件系统类型是iso9660。

80、当lilo.conf配置完毕后,使之生效,应运行的命令及参数是lilo。

81、在使用ls命令时,用八进制形式显示非打印字符应使用参数–b。

82、Linux使用支持Windows9.x/2000长文件名的文件系统的类型是vfat。

83、设定限制用户使用磁盘空间的命令是quota。

84、在Linux系统中,用来存放系统所需要的配置文件和子目录的目录是/etc。

85、.硬连接只能建立对文件链接。

符号链接可以跨不同文件系统创建。

86、结束后台进程的命令是kill。

87、用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

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

88、用变量a给出下面的定义

1) 一个整型数)inta;//Aninteger 

2)一个指向整型数的指针int*a;//Apointertoaninteger 

3)一个指向指针的指针,它指向的指针是指向一个整型数int**a;//Apointertoapointertoaninteger

4)一个有10个整型数的数组inta[10];//Anarrayof10integers

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

 int*a[10]

6) 一个指向有10个整型数数组的指针 int(*a)[10]

7) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数 int(*max_function)(inta)

8)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数 

 int(*a[10])(int)

89、typedef与define的区别

typedef是C语言中用来声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的的类型定义关键字。

#define是预处理指令,是宏定义。

90、##和#的作用

    预处理器运算符##是连接符号,由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。

但它不可以是第一个或者最后一个子串。

所谓的子串(token)就是指编译器能够识别的最小语法单元。

如果替换文本中的参数与##相邻,则该参数将被实际参数替换,##与前后的空白将被删除,并对替换后的结果重新扫描。

 形成一个新的标号,如果这样产生的记号无效,或者结果依赖于##运算顺序,则结果没有定义。

    #definepaste(front,back)front##back

    宏调用paste(name,_xiaobai)的结果为name_xiaobai

    #符是把传递过来的参数当成字符串进行替代

    #definedprint(expr)printf(#expr"=%d\n",expr)

    int a=20,b=10;

    dprint(a/b);

    打印出:

 a/b=2

91、嵌入式系统中断服务子程序(ISR)

    中断是嵌入式系统中重要的组成部分,导致了很多编译开发商提供一种扩展—让标准C支持中断。

具体代表是,产生了一个新的关键字__interrupt。

下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。

 

 

__interruptdoublecompute_area(doubleradius)

{

    doublearea=PI*radius*radius;

    printf("Area=%f",area);

    returnarea;

}

    中断程序的特点:

    A、ISR不能返回一个值。

    B、ISR不能传递参数。

    C、在许多的处理器/编译器中,浮点一般都是不可重入的。

有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。

此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。

    D、printf()经常有重入和性能上的问题。

92、嵌入式C语言开发中的位操作

    A、将寄存器指定位(第n位)置为1

    GPXX |=(1<

    GPXX|= (1<<7)|(1<<4)|(1<<0);//第0、4、7位置1,其他保留

    B、将寄存器指定位(第n位)置为0

    GPXX &=~(1<

    将寄存器的第n位清0,而又不影响其它位的现有状态。

    GPXX &=~(1<<4 )

    C、嵌入式开发位操作实例

    unsignedinti=0x00ff1234;

    //i|=(0x1<<13);//bit13置1

    //i|=(0xF<<4);//bit4-bit7置1

    //i&=~(1<<17);//清除bit17

    //i&=~(0x1f<<12);//清除bit12开始的5位

    

    //取出bit3-bit8

    //i&=(0x3F<<3);//保留bit3-bit8,其他位清零

    //i>>=3;//右移3位

 

    //给寄存器的bit7-bit17赋值937

    //i&=~(0x7FF<<7);//bit7-bit17清零

    //i|=(937<<7);//bit7-bit17赋值

 

    //将寄存器bit7-bit17的值加17

   // unsignedinta=i

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1