问答题 阅读以下关于某嵌入式系统设计方案的叙述。
[说明]
某公司承接了开发周期为6个月的某机载嵌入式系统软件的研制任务。该机载嵌入式系统硬件由数据处理模块、大容量模块、信号处理模块、FC网络交换模块和电源模块组成,如图1-1所示。数据处理模块和大容量模块的处理器为PowerPC7447,数据处理模块主要对机载数据进行处理,完成数据融合;大容量模块主要存储系统数据,同时也有数据处理的能力;信号处理模块的处理器为专用的数字信号处理器DSP,完成雷达数据处理,并将处理后的数据发送给数据处理模块;FC网络交换模块为已开发的模块,本次不需要开发软件,主要负责系统的数据交换;电源模块主要负责给其他模块供电,电源模块上没有软件。
PowerPC7447和DSP是32位处理器,内存按字节编址。PowerPC7447以大端方式( big_endian)存储数据,DSP以小端方式(little endian)存储数据。
问答题 在数据处理模块1中,需要使用A/D变换器对外部电源模块的电压进行检测。当前数据处理模块中的A/p变换器为10位,当A/D变换器的输入模拟电压最大为5.115V时,A/D输出为3FFH。
通过配置A/D变换器的中断寄存器及比较寄存器(比较寄存器的值是用来和A/D转换结果进行比较),可以将A/D变换器配置为输入电压大于一定值时产生中断,也可以配置为输入电压小于一定值时产生中断,通过此种方式向系统报警。
请回答以下三个问题。
(1)此A/D变换器的量化间隔为多少mV?(量化间隔为A/D变换器最低有效位1位所代表的模拟电压值)
(2)如果规定下限阈值为4.092V,要使用中断检测这个电压,此时A/D变换器的比较寄存器应配置为多少?
(3)如果采用查询方式实现电源电压超限报警功能,程序如何判断A/D变换器完成了单次数据转换?
【正确答案】(1)SmV
(2)Ox332,或818
(3)通过查询状态寄存器的对应状态位判断
【答案解析】[解析] 本题考查嵌入式系统设计基础知识和软件工程知识的应用,要开发完成一项嵌入式系统是一个较为复杂工程,涉及软件和硬件基础知识。
A/D变换器的量化间隔为A/D变换器最低有效位所代表的是模拟电压值,当前A/D变换器的模拟电压最大为5.115V,表示A/D输出的最大值为3FFH,因此,A/D变换器的量化间隔为5.115V/3FFH=5mV。
根据A/D变换器的量化间隔,可以根据需要控制的模拟电压来计算出对应的数字值。按照题意,如果当前的阈值为4.092V,则可以计算出要产生中断时候配置的A/D变换器的比较寄存器的值为4.092V/5mV.即818或者Ox332。
一般嵌入式系统设计中,对于外部A/D变化报警事件的处理,可以采用查询方式,也可以采用中断方式。当采用查询方式来检查电源电压是否超过一定阈值或者低于一定阈值的事件时,需要首先设置A/D变换的比较寄存器的阈值,然后开启对应的控制字,最后应用程序通过不断查询状态寄存器中对应的标志位来判断是否有对应的事件发生。
问答题 李工负责该系统软件的研发。在软件策划过程中,为了加快软件的开发,确保进度,李工将软件分解为若干软件配置项,每个软件配置项指定一人开发。每个配置项的开发过程包括:软件需求分析、软件概要设计、软件详细设计、软件编码、软件单元测试和部件级测试六个阶段。李工的做法符合软件工程的要求吗?为什么?
【正确答案】李工的安排不合理。
软件开发和软件测试不能为同一个人。
一般情况下,每个软件配置项的软件需求分析、软件设计与编码、软件测试的人员需要分开,不能由一人全部完成,以确保软件的质量。
【答案解析】[解析] 按软件工程的要求,开发过程分为软件策划、软件需求分析、软件概要设计、软件详细设计、软件编码、软件测试(单元级、部件级、系统级)、验收交付等阶段。一般情况下,软件可以分解为若干软件配置项,由不同的人员完成,但对于同一软件配置项,软件开发和软件测试必须不能为同一个人,即不允许自己测试自己开发的软件;对于重要的软件,每个软件配置项的软件需求分析、软件设计与编码、软件测试的人员需要分开,不能由一人全部完成,以确保软件的质量。
因此,李工的安排不合理,必须在软件策划中,将各阶段的人员分开,否则,软件开发计划和软件配置管理计划在评审时将不能通过。
问答题 田工负责编写信号处理模块与数据处理模块的通信程序,约定好的数据组织方式如表1-1所示。
表1-1网络数据结构
数据域A(1字节) 数据域B(4字节) 数据域C(2字节) 数据域D(16字节)
以下是信号处理模块端的一段程序:
unsigned int msgid=Ox01;//表示从信号处理模块发送到数据处理模块2的消息ID
typedef struct FCSND—Data_struct {
unsigned char A;
unsigned int B;
unsigned short C;
unsigned char D[16];
} FCSND DATA;
FCSND_DATA sendData;
…·
…·
FillfcData( &sendData); //将待发送数据赋值到sendData数据结构中
sendfc((msgid, &sendData, sizeof (FCSND_DATA)); //发送数据以下是数据处理模块2端的一段程序:
unsigned int msgid=Ox00; //接收到的消息ID
typedef struct FCRCV_Data _struct {
unsigned char A;
unsigned int B;
unsigned short C;
unsigned char D[16];
} FCRCV_DATA;
FCRCV_DATA recvData;
…·
…·
recvfc( (msgid,&recvData,sizeof (FCRCV_DATA)); //接收数据
请问以上程序是否存在问题?如果存在问题,请分析原因。
【正确答案】有问题。
(1)数据结构定义有边界对齐问题;
(2)接收和发送端的处理程序没有对大小端转换进行处理。
【答案解析】[解析] 本题中,田工在发送和接收消息时采用的数据类型为FCSND- DATA和FCRCV_DATA,数据类型中有字符型、整型、短整型、字符数组;而发送端为信号处理模块,其处理器为专用的数字信号处理器DSP。接收端为数据处理模块,其处理器为PowerPC7447。在嵌入式系统中,C语言的编译器在专用的信号处理器DSP和PowerPC7447很可能不同,不同的编译器对数据有边界的对齐处理会有不同的方式,不一定采用表1-1规定的组织方式。可能的情况是:
(1)两者都不是表1-1规定的内存组织方式;
(2)信号处理模块数据可能与数据处理模块的内存组织方式不同。
解决办法为在数据结构设计中只用字符型和字符数组,不同其他类型数据。
另外,题干中已经明确:PowerPC7447和DSP是32位处理器,内存按字节编址。PowerPC7447以大端方式(big_endian)存储数据,DSP以小端方式(little_endian)存储数据。因此,需要对大小端转换进行处理,在发送端或接收端都可以,而本题明显没进行大小端转换处理。