导航处理系统由主处理机模块、电子盘模块、信号处理模块和电源模块组成,主处理机模块执行电子地图功能、导航控制功能等,生成的导航显示画面通过信号线在LCD液晶彩色显示屏显示给驾驶员;信号处理模块处理外部采集数据,将处理后的数据通过内部总线传输给主处理机模块;电子盘模块存储电子地图数据及导航数据。
显示系统由LCD液晶彩色显示屏、面板键盘(自定义键盘)和电源模块组成,主要是显示导航画面,也可通过面板键盘进行导航控制。
假设每个缓冲区的大小512KB,将512KB数据写入当前空闲缓冲区接口服务为Write_Buffer,将当前有效的512KB数据读出缓冲区的接口服务为Read_Buffer,假设双端口存储器中不提供硬件信号量,两个缓冲区间的互斥操作由软件标记实现,软件对双端口存储器的单次操作(读写一个字的操作)为原子操作。
下面是用C语言设计的一个组对双缓冲区的管理程序代码,请填补该程序代码中的空缺。
——————————————————————————
int *BufferFlag[2]; /*0表示无有效数据,0xff表示有新数据*/
int *Mutex[2]; /*软件锁,0表示未锁定,0xff表示锁定*/
int Read_Buffer(int id, char *data); /*从缓冲区读数据,用于数据处理模块,id表示缓冲区2,data为存放读取数据的缓冲,返回值表示读取到有效数据的长度*/
void Write_Buffer(int id, char *data); /*向缓冲区写数据,用于信号处理模块,id表示缓冲的序列号,0表示缓冲区1,1表示缓冲区2,data为待写入数据的缓冲*/
int INIT_PPC(){/*数据处理模块端的初始化,缓冲区起始地址为0xffffc000*/
BufferFlag=(int *) 0xffffc000;
Mutex=(int *) 0xffffc010;
*BufferFlag[0]=0;
*BufferFlag[1]=0;
*Mutex[0]=0;
*Mutex[1]=0;
return (0);
}
int PPC_Read_Data(char *Data){ /*数据处理模块读数据程序段*/
int len=0;
if ((!(*BufferFlag[0]))&&(!(*BufferFlag[1]))){
return(0); /*无新数据*/
}
if (*BufferFlag[0]){
if(___(1)___){
*Mutex[0]=0xff;
len=Read_Buffer(0,Data);
*BufferFlag[0]=0x00;
___(2)____;
}
}
else {
if(*BufferFlag[1]){
if(!(*Mutex[1])){
*Mutex[1]=0xff;
___(3)___;
*BufferFlag[1]=0x00;
*Mutex[1]=0x00;
}
}
}
Return (len);
}
int DSP_Write_Data(){
/*信号处理模块写数据程序段,初始化与数据处理模块端类似,同样以BufferFlag表示与数据处理模块端的对应的标志,即两端操作的是相同的地址空间;同样Mutex也表示与数据处理模块端的对应的软件锁,即两端操作的是相同的地址空间。这里就略去双口在DSP上的起始地址说明和初始化部分。*/
char Data[1024*512];
while(1){
if(!(*Mutex[0])){
*Mutex[0]=0xff;\
Write_Buffer(0,Data);
*BufferFlag[0]=0xff;
*Mutex[0]=0x00;
}
else if (!(*Mutex[1])){
*Mutex[1]=0xff;
Write_Buffer(1,Data);
*BufferFlag[1]=0xff;
*Mutex[1]=0x00;
}
}
return (0);
}
PowerPC7447和DSP是32位处理器,内存按字节编址。PowerPC7447以大端方式(big_endian)存储数据,DSP以小端方式(little_endian)存储数据。
通过配置A/D转换器的中断寄存器及比较寄存器(比较寄存器的值是用来和A/D转换结果进行比较),可以将A/D转换器配置为输入电压大于一定值时产生中断,也可以配置为输入电压小于一定值时产生中断,通过此种方式向系统报警。
此A/D转换器的量化间隔为多少毫伏?(量化间隔为A/D转换器最低有效位1位所代表的模拟电压值)。
通过配置A/D转换器的中断寄存器及比较寄存器(比较寄存器的值是用来和A/D转换结果进行比较),可以将A/D转换器配置为输入电压大于一定值时产生中断,也可以配置为输入电压小于一定值时产生中断,通过此种方式向系统报警。
如果规定下限阈值为4.092V,要使用中断检测这个电压,此时A/D转换器的比较寄存器应配置为多少?
通过配置A/D转换器的中断寄存器及比较寄存器(比较寄存器的值是用来和A/D转换结果进行比较),可以将A/D转换器配置为输入电压大于一定值时产生中断,也可以配置为输入电压小于一定值时产生中断,通过此种方式向系统报警。
如果采用查询方式实现电源电压超限报警功能,程序如何判断A/D转换器完成了单次数据转换?
当采用查询方式来检查电源电压是否超过一定阈值或者低于一定阈值的时间时,需要
___的___的___,____的____,____通过不断查询____中对应的___来判断是否____。
以下是信号处理模块端的一段程序:
unsigned int msgid=0x01;//表示从信号处理模块发送到数据处理模块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 =0x00;//接收到的消息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));//接收数据
请问以上程序是否存在问题?如果存在问题,请分析原因。
20题 | 被引用0次