某公司承接了一个数据处理模块的项目,由沈工负责模块的方案设计,沈工的设计方案如图11-53所示。该数据处理模块以PowerPC处理器为核心,设计了存储器、以太网、温度传感器、调试接口等功能电路。
处理器外接FLASH存储器用于存储上电初始化程序和应用程序。处理器通过I2C接口连接测温电路,监控模块的工作温度。以太网、串口、调试离散量等用于软件调试和状态显示。
测温电路选用ADT7461AR芯片,用于测试模块温度。ADT7461AR是一个双通道数字温度计,工作电压3~5V,具有低/超温报警功能,采用I2C接口实现主机对远程/本地温度数据的采集,采集数据存储在高/低两个数据寄存器中,每个寄存器为16位,高寄存器表示整数值,低寄存器表示小数值。
存储模块采用某公司的FLASH存储芯片。支持编程、擦除、复位等操作命令。该FLASH芯片的常用命令序列如表11-20所示。表中的地址和数据皆为十六进制数。
/*定义宏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;
}
在功能函数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-54所示。该方案是基于PCI总线的多功能处理系统,PCI设备1是以以太网,PCI设备2用于数据采集,PCI设备3、PCI设备4用于和该系统中的其他处理模块进行互联,LAGACY设备1、LAGACY设备2用于处理系统中一些慢速设备。
两个端口对同一内存操作有4种情况:
A两个端口同时对同一地址单元读出数据。
B两个端口同时对同一地址单元写入数据。
C两个端口不同时对同一地址单元存取数据。
D两个端口同时对同一地址单元,一个写入数据,另一个读出数据。
在上述情况下,两个端口的存取不会出现错误的是____和_____,会出现写入错误的是___,会出现读出错误的是____。
使用环形队列时需要判断队列为空还是为满。当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;
使用环形队列时需要判断队列为空还是为满。当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;
q->head=q->tail=0;
q->size=RINGQ_MAX;
判断队列为空的C语言代码为____。
判断队列为满的C语言代码为____。
q->head=q->tail=0;
q->size=RINGQ_MAX;
入队操作时,如果队列不满,则入队后更新尾指针的C语言代码为q->tail=_____。
出队操作时,如果队列不空,则出队后更新头指针的C语言代码为q->head=_____。
某公司承接一个控制系统的项目,由王工负责系统的方案设计。王工的设计方案如图11-57所示。该方案是基于VME总线的多机并行处理系统,由主控制模块作为VME总线的主设备,即总线控制器,负责整个系统的控制与管理;3个数据处理模块作为从设备,负责数据处理与计算;1个I/O模块也作为从设备,负责系统与外部接口之间的高速数据通信。同时,为了简化设计,该系统5个模块均采用同一款VME协议芯片,实现内总线和VME总线的连接。
该系统中每个模块的相关信息见表11-22所示。
14题 | 被引用0次