全部科目 > 嵌入式系统设计师 >
2021年上半年 上午试卷 综合知识
第 35 题
知识点 编译器   结构体   数据结构  
关键词 编译器   存储空间   对齐   结构体   紧缩   数据结构   编译   数据  
章/节 嵌入式操作系统基础知识   嵌入式系统程序设计  
 
 
某驱动程序中设计了以下数据结构:

为了避免由于不同的编译环境对上述数据结构产生不同的编译结果,对上述数据结构通过设置紧缩属性(packed属性),强迫编译器采用字节对齐方式,在该模式下,PkgEuffRx结构体占用() 字节的存储空间。
 
  A.  67
 
  B.  68
 
  C.  35
 
  D.  36




 
 
相关试题     嵌入式操作系统基础知识 

  第39题    2019年下半年  
下列选项中会导致进程从执行态变为就绪态的事件是(39)。

  第63题    2015年下半年  
现有3个同时到达的作业Jl、J2和J3,它们的执行时间分别是T1、T2和T3,且T1<T2<T3。系..

  第21题    2014年下半年  
假设系统采用PV操作实现进程同步与互斥。若n个进程共享两台打印机,那么信号量S的取值范围为(21)。

相关试题     嵌入式系统程序设计 

  第22题    2009年下半年  
操作系统是裸机上的第一层软件,其他系统软件(如(22)等和应用软件都是建立在操作系统基础上的。下图①②③分别表示(23)。

  第65题    2024年上半年  
在某32位系统中,若声明变量char*files[]={"f1","f2","f3","f4"},则files占用内存大小为(42)字节。

  第40题    2023年上半年  
假设以下代码运行环境为32位系统,其中,_attribute_((packed))的作用是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
代码段1..

 
知识点讲解
· 编译器
· 结构体
· 数据结构
 
        编译器
        编译阶段要做的工作是用交叉编译或汇编工具处理源代码,产生目标文件。在嵌入式系统中,宿主机和目标机所采用的处理器芯片通常是不一样的。例如,目标机采用的CPU是DragonBall M68x系列或ARM系列,而宿主机采用的是x86系列。因此,为了把宿主机上编写的高级语言程序编译成可以在目标机上运行的二进制代码,就需要用到交叉编译器。
        与普通PC中的C语言编译器不同,嵌入式系统中的C语言编译器要进行专门的优化,以提高编译效率。一般来说,优秀的嵌入式C编译器所生成的代码,其长度和执行时间仅比用汇编语言编写的代码长5%~20%。编译质量的不同,是区别嵌入式C编译器工具的重要指标。因此,硬件厂商往往会针对自己开发的处理器的特性来定制编译器,既提供对高级语言的支持,又能很好地对目标代码进行优化。
        GNU C/C++(gcc)是目前比较常用的一种交叉编译器,它支持非常多的宿主机/目标机组合。宿主机可以是Unix、AIX、Solaris、Windows、Linux等操作系统,目标机可以是x86、Power PC、MIPS、SPARC、Motorola 68K等各种类型的处理器。
        gcc是一个功能强大的工具集合,包含了预处理器、编译器、汇编器、连接器等组件。它在需要时会去调用这些组件来完成编译任务,而输入文件的类型和传递给gcc的参数决定了它将调用哪些组件。对于一般或初级的开发者,它可以提供简单的使用方式,即只给它提供C源码文件,它将完成预处理、编译、汇编、连接等所有工作,最后生成一个可执行文件。而对于中高级开发者,它提供了足够多的参数,可以让开发者全面控制代码的生成,这对于嵌入式系统软件开发来说是非常重要的。
        gcc识别的文件类型主要包括:C语言文件、C++语言文件、预处理后的C文件、预处理后的C++文件、汇编语言文件、目标文件、静态链接库、动态链接库等。以C程序为例,gcc的编译过程主要分为4个阶段:
        (1)预处理阶段,即完成宏定义和include文件展开等工作;
        (2)根据编译参数进行不同程度的优化,编译成汇编代码;
        (3)用汇编器把上一阶段生成的汇编码进一步生成目标代码;
        (4)用连接器把上一阶段生成的目标代码、其他一些相关的系统目标代码以及系统的库函数连接起来,生成最终的可执行代码。
        用户可以通过设定不同的编译参数,让gcc在编译的不同阶段停止下来,这样可以检查编译器在不同阶段的输出结果。
        在gcc的高级用法上,一般希望通过使用编译器达到两个目的:检查出源程序的错误;生成速度快、代码量小的执行程序。这可以通过设置不同的参数来实现,例如,“-Wall”参数可以发现源程序中隐藏的错误;“-O2”参数可以优化程序的执行速度和代码大小;“-g”参数可以对执行程序进行调试。
 
        结构体
        利用结构体类型可以把一个数据元素的各个不同的数据项聚合为一个整体。结构体类型的声明格式为:
        
        例如,一个复数z=x+yi包含了实部x和虚部y两部分(x和y为实数),可以定义一个表示复数的结构体类型,并用typedef为结构体类型命名为Complex:
        
        在该定义中,Complex是这个结构体类型的名字,re和im是结构的成员。一般情况下,对结构体变量的运算必须通过对其成员进行运算来完成,成员运算符“.”用来访问结构体变量的成员,方式为:
        
        例如,定义结构体变量z,将-4和5分别赋值给一个复数z的实部成员变量和虚部成员变量:
        
        z.re和z.im相当于普通的double型变量。结构体外的变量名和结构体中的成员名相同时不会发生冲突。一个结构体变量的存储空间长度不少于其所有成员所占空间长度之和。
        结构体数据的空间中可能产生填充信息,因为对大多数处理器而言,访问按字或者半字对齐的数据速度更快,当定义结构体时,编译器为了性能优化,可能会将它们按照半字或字对齐。
        例如,下面两个结构体变量structA和structB的成员相同但排列顺序不同,用sizeof计算其所占用存储空间的字节数,sizeof(structA)的值为8,sizeof(structB)的值为12。其存储空间中的填充处理如下图所示。
        
        结构体变量的存储空间
 
        数据结构
        在页式存储管理中,最主要的数据结构有两个。
        .页表:页表给出了任务的逻辑页面号与内存中的物理页面号之间的对应关系。
        .物理页面表:用来描述内存空间中各个物理页面的使用分配状况。在具体实现上,可以采用位示图或空闲页面链表等方法。
        下图是页表的一个例子。在任务的逻辑地址空间当中,总共有4个页面,即页面0、页面1、页面2和页面3。页表描述的是逻辑页面号与物理页面号之间的对应关系,即每一个逻辑页面存放在哪一个物理页面中。页表的下标是逻辑页面号,从0到3。相应的页表项存放的就是该逻辑页面所对应的物理页面号。在本例中,任务的4个逻辑页面分别存放在第1、第4、第3和第7个物理页面中。
        
        页表示例



更多复习资料
请登录电脑版软考在线 www.rkpass.cn

京B2-20210865 | 京ICP备2020040059号-5
京公网安备 11010502032051号 | 营业执照
 Copyright ©2000-2025 All Rights Reserved
软考在线版权所有