嵌师案例分析(04)

感谢您能抽出几分钟时间来参加本次答题,现在我们就马上开始吧!
11.3 案例3、某数据处理模块设

某公司承接了一个数据处理模块的项目,由沈工负责模块的方案设计,沈工的设计方案如图11-53所示。该数据处理模块以PowerPC处理器为核心,设计了存储器、以太网、温度传感器、调试接口等功能电路。


处理器外接FLASH存储器用于存储上电初始化程序和应用程序。处理器通过I2C接口连接测温电路,监控模块的工作温度。以太网、串口、调试离散量等用于软件调试和状态显示。

测温电路选用ADT7461AR芯片,用于测试模块温度。ADT7461AR是一个双通道数字温度计,工作电压3~5V,具有低/超温报警功能,采用I2C接口实现主机对远程/本地温度数据的采集,采集数据存储在高/低两个数据寄存器中,每个寄存器为16位,高寄存器表示整数值,低寄存器表示小数值。

存储模块采用某公司的FLASH存储芯片。支持编程、擦除、复位等操作命令。该FLASH芯片的常用命令序列如表11-20所示。表中的地址和数据皆为十六进制数。



11.3案例3-1、ADT7461AR芯片支持两种测温模式,其中第一种模式为二进制模式,用0表示0度,测温范围为0℃~+127℃;第二种模式为偏移二进制模式,用64表示0℃,测温范围为-55℃~+150℃,温度数据转换关系如表11-21所示,请补充其中空(1)~(2)处的内容,即对应温度的二进制数。
    ____________
11.3案例3-2、ADT7461AR芯片支持两种测温模式,其中第一种模式为二进制模式,用0表示0度,测温范围为0℃~+127℃;第二种模式为偏移二进制模式,用64表示0℃,测温范围为-55℃~+150℃,温度数据转换关系如表11-21所示,请补充其中空(3)~(4)处的内容,即对应温度的二进制数。
    ____________
11.3案例3-3、沈工用C语言实现对FLASH的操作,需按照表11-20中定义的命令序列顺序执行即可。仔细阅读下列代码,请在(1)~(4)处将对应的C语言代码补全。

/*定义宏FLASH_BASE_ADDRESS为FLASH芯片的基地址*/

#define FLASH_WRITE_BYTE(addr,data) xxxxxxxx(此处代码略)

/*Reset Flash*/

Void RestFlash (void)

{

FLASH_WRITE_BYTE(FLASH_BASE_ADDRESS,0xF0);

Return;

}

/*对FLASH的擦除是按扇区进行的,SectorErase函数每次可擦除一个扇区。假设某扇区的偏移地址为offset_addr,下面sectorErase函数体为擦除该扇区的命令序列*/

void SectorErase(int offset_addr)

{

FLASH_WRITE_BYTE (FLASH_BASE_ADDRESS+0x555,0xAA);

FLASH_WRITE_BYTE (FLASH_BASE_ADDRESS+【1】,0x55);

FLASH_WRITE_BYTE (FLASH_BASE_ADDRESS+0x555,【2】);

FLASH_WRITE_BYTE (FLASH_BASE_ADDRESS+0x555,0xAA);

FLASH_WRITE_BYTE (FLASH_BASE_ADDRESS+0x2AA,0x55);

FLASH_WRITE_BYTE (FLASH_BASE_ADDRESS+【3】,【4】);

return;

}


    ____________
11.3案例3-4、该嵌入式系统对处理的性能要求较高,沈工在完成软件设计后,需要对每一个函数的执行性能进行测试,检测其是否满足系统设计的要求。沈工通过PowerPC处理器内部的高精度时钟寄存器(TimeBase)进行计时,该寄存器由高低两个32位的寄存器组成,根据总线频率自动递增,当低32位寄存器递增到0xFFFFFFFF时,向高32位寄存器进位。计数值可以换算成时间值,精确到微秒级。

在功能函数function1()的执行体前后进行时间统计,最后计算出该函数的执行时间值,请在(1)~(2)处将对应的C代码补全。

struct timeBase

{

unsigned int upper;

unsigned int lower;

};

void function1(void)

{

struct timeBase tb0,tb1,tb2;

long value;

/*获取TimeBase寄存器中的计数值*/

TimeBaseGet(&tb0.upper, &tb0.lower);/*函数执行体…*/

/*再次获取TimeBase寄存器中的计数值*/

TimeBaseGet(&tb1.upper,&tb1.lower);

tb2.upper=tb1.upper-tb0.upper;

/*当低32位计数值未反转,则直接进行计算,否则需借用高位进行计算*/

if(tb1.lower>=tb0.lower)

{

tb2.lower=【1】;

}else

{

tb2.upper-=1;

tb2.lower=【2】;

}

/*根据总线频率,将时钟节拍转换为时间值*/

value=CountToUs(tb2);

printf("%s cost time %dus.\n",_function_,value);

}


    ____________
11.3案例4、某数据采集与处理系统设计

某公司承接了一个数据采集与处理系统的项目,由刘工负责系统的方案设计,刘工的设计方案如图11-54所示。该方案是基于PCI总线的多功能处理系统,PCI设备1是以以太网,PCI设备2用于数据采集,PCI设备3、PCI设备4用于和该系统中的其他处理模块进行互联,LAGACY设备1、LAGACY设备2用于处理系统中一些慢速设备。

11.3案例4-1、PCI设备2和主CPU之间采用双口RAM方式交换数据,双口RAM是常见的共享式多端口存储器,其最大特点是存储数据共享。它允许两个独立的CPU或控制器同时异步访问存储单元。既然数据共享,就必须存在访问仲裁控制,否则就会出现错误或冲突。内部仲裁逻辑控制提供以下功能:对同一地址单元访问的时序控制;存储单元数据块的访问权限分配;信令交换逻辑(例如中断信号)等。

两个端口对同一内存操作有4种情况:

A两个端口同时对同一地址单元读出数据。

B两个端口同时对同一地址单元写入数据。

C两个端口不同时对同一地址单元存取数据。

D两个端口同时对同一地址单元,一个写入数据,另一个读出数据。

在上述情况下,两个端口的存取不会出现错误的是____和_____,会出现写入错误的是___,会出现读出错误的是____。

    ____________
11.3案例4-2、PCI设备2和主CPU之间通过双端口存储器进行数据交换。刘工设计了环形队列的实现方式。设备2向环形队列写入数据,主CPU从环形队列读取数据。环形队列是一个首尾相连的FIFO数据结构,采用数组存储,到达尾部时将转回到0位置,该转回是通过取模操作来实现的。因此环形队列逻辑上是将数组元素q[0]与q[MAX-1]连接,形成一个存放队列的环形空间。为了方便读写,还要用数组下标来指明队列的读写位置,其中head指向可以读的位置,tail指向可以写的位置,环形队列如图11-55所示。

使用环形队列时需要判断队列为空还是为满。当tail追上head时,队列为满,当head追上tail时,队列为空。通常判断环形队列为空/为满有两种判断方法。

(1)附加一个标志位tag,当head赶上tail,队列空,则令tag=0,当tail赶上head,队列满,则令tag=1。

(2)限制tail赶上head,即队尾结点与队首结点之间至少留有一个元素的空间。队列空:head==tail,队列满:(tail+1)%MAXN==head。

(1)采用第一种方法(即附加标志实现算法),环形队列定义如下:

typedef struct ringq

{

int head;/*头部,出队列方向*/

int tail;/*尾部,入队列方向*/

int tag;

int size;/*队列总尺寸*/

int space[RINGQ_MAX];/*队列空间*/

}RINGQ;

RINGQ p,*q;

q=&p;

初始化环形队列的C语言代码为:

q->head=q->tail=q->tag=0;

q->size=RINGQ_MAX;


11.3案例4-2(1)、判断队列为空的C语言代码为____。判断队列为满的C语言代码为____。
    ____________
11.3案例4-2(2)、入队操作时,如果队列不满,则入队后更新尾指针的C语言代码尾q->tail=____。出队操作时,如果队列不空,则出队后更新头指针的C语言代码为q->head=____。
    ____________
11.3案例4-2(重复)、PCI设备2和主CPU之间通过双端口存储器进行数据交换。刘工设计了环形队列的实现方式。设备2向环形队列写入数据,主CPU从环形队列读取数据。环形队列是一个首尾相连的FIFO数据结构,采用数组存储,到达尾部时将转回到0位置,该转回是通过取模操作来实现的。因此环形队列逻辑上是将数组元素q[0]与q[MAX-1]连接,形成一个存放队列的环形空间。为了方便读写,还要用数组下标来指明队列的读写位置,其中head指向可以读的位置,tail指向可以写的位置,环形队列如图11-55所示。


使用环形队列时需要判断队列为空还是为满。当tail追上head时,队列为满,当head追上tail时,队列为空。通常判断环形队列为空/为满有两种判断方法。

(1)附加一个标志位tag,当head赶上tail,队列空,则令tag=0,当tail赶上head,队列满,则令tag=1。

(2)限制tail赶上head,即队尾结点与队首结点之间至少留有一个元素的空间。队列空:head==tail,队列满:(tail+1)%MAXN==head。

(1)采用第一种方法(即附加标志实现算法),环形队列定义如下:

typedef struct ringq

{

int head;/*头部,出队列方向*/

int tail;/*尾部,入队列方向*/

int tag;

int size;/*队列总尺寸*/

int space[RINGQ_MAX];/*队列空间*/

}RINGQ;

RINGQ p,*q;

q=&p;

初始化环形队列的C语言代码为:

q->head=q->tail=q->tag=0;

q->size=RINGQ_MAX;

11.3案例4-2(3)、采用第二种方法,使用上述数据结构,初始化环形队列的C语言代码为:

q->head=q->tail=0;

q->size=RINGQ_MAX;

判断队列为空的C语言代码为____。

判断队列为满的C语言代码为____。

    ____________
11.3案例4-2(4)、采用第二种方法,使用上述数据结构,初始化环形队列的C语言代码为:

q->head=q->tail=0;

q->size=RINGQ_MAX;

入队操作时,如果队列不满,则入队后更新尾指针的C语言代码为q->tail=_____。

出队操作时,如果队列不空,则出队后更新头指针的C语言代码为q->head=_____。

    ____________
11.3案例5、某控制系统设计

某公司承接一个控制系统的项目,由王工负责系统的方案设计。王工的设计方案如图11-57所示。该方案是基于VME总线的多机并行处理系统,由主控制模块作为VME总线的主设备,即总线控制器,负责整个系统的控制与管理;3个数据处理模块作为从设备,负责数据处理与计算;1个I/O模块也作为从设备,负责系统与外部接口之间的高速数据通信。同时,为了简化设计,该系统5个模块均采用同一款VME协议芯片,实现内总线和VME总线的连接。


该系统中每个模块的相关信息见表11-22所示。


14题 | 被引用0次

模板修改
使用此模板创建