阅读下列说兑明和图、表,回答下列问题,将解答填入答题纸的对应栏内。 【说明】 某车载导航系统的结构如图1一1所示,由导航处理系统和显示系统两部分组成。导航处理系统安装在某型车的设备区,显示系统安装在某型车的前方,便于驾驶员观看和操作。

admin2013-01-19  45

问题 阅读下列说兑明和图、表,回答下列问题,将解答填入答题纸的对应栏内。
    【说明】
    某车载导航系统的结构如图1一1所示,由导航处理系统和显示系统两部分组成。导航处理系统安装在某型车的设备区,显示系统安装在某型车的前方,便于驾驶员观看和操作。
   
    导航处理系统由主处理机模块、电子盘模块、信号处理模块和电源模块组成,主处理机模块执行电了地图功能、导航控制功能等,生成的导航显示画面通过信号线在LCD液晶彩色显示屏显示给驾驶员;信号处理模块处理外部采集数据,将处理后的数据通过内部总线传输给主处理机模块;电子盘模块存储电子地图数据及导航数据。
    显示系统由LCD液晶彩色显示屏、面板键盘(门定义键盘)和电源模块组成,主要是显示导航画面,也可通过面板键盘进行导航控制。
主处理机模块与信号处理模块间通过双端口存储器进行数据交换。李工设计时,将双端口存储器空间划分为两个缓冲区,两个缓冲区分别交替地接收信号处理机传输来的最新数据,然后按数据块方式提供给用户程序使用。
    假设每个缓冲区的大小为512 KB,将512 KB数据写入当前空闲缓冲区接口服务为Write Buffer,将当前有效的512 KB数据读出缓冲区的接口服务为Read Buffer,假设双端口存储器中不提供硬件信号量,两个缓冲区间的互斥操作由软件标记实现,软件对双端口存储器的单次操作(读写一个字的操作)为原子操作。
    下面是用C语言设计的一组对双缓冲区的管理程序代码,请填补该程序代码中的空缺,将答案填写在答题纸上。
    int*BufferFlag[2];    /*0表示无有效数据,0xff表示有新数据  */
    int*Mutex[2];    /*软件锁,0表示末锁定,0xff表示锁定  */
    int  Read_Buffer(int id,char *data);    /*  从缓冲区读数据,用于数据处理模块,id表示缓冲的序列号,0表示缓冲区1,1表示缓冲区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)  {
        //等待信号处理模块产生新的数据并存入数据缓冲Data中;
        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;
        }
      }
      renurn(0);
    }

选项

答案(1)!(*Mutex[0])或者*Mutex[0]==0x00或者*Mutex[0]==0 (2)*Mutex[0]=0x00或者*Mutex[0]=0 (3)len=Read Buffert(1,Data)

解析 本题考查嵌入式系统中的C程序设计,要求考生正确使用软件锁。
    在本题中主处理机模块与信号处理模块间通过双端口存储器进行数据交换。由信号处理模块发送数据,主处理机模块接收数据。
    在本题中给出了很多假设条件,如将双端口存储器空间划分为两个缓冲区,两个缓冲区分别交替地接收信号处理机传输来的最新数据;再如假设双端口存储器中不提供硬件信号量,两个缓冲区间的互斥操作由软件标记实现,软件对双端口存储器的单次操作(读写一个字的操作)为原了操作。同时本题也给出了软件程序的架构,BufferFlag为缓冲区有无新数据的标志,Mutex为软件锁。
    在数据处理模块端的初始化程序INIT PPC()中,、BufferFlag和Mutex被分配在缓冲区的前端,并被初始化为无数据和未锁定。
    信号处理模块写数据程序DSP_Write_Data()中,初始化与数据处理模块端类似,同样以BufferFlag表示与数据处理模块端的对应的标志,即两端操作的是相同的地址空间;同样.Mutex也表示与数据处理模块端的对应的软件锁,即两端操作的是相同的地址空间。信号处理模块写数据程序DSP_Write_Data()是一个无限循环程序,在等待信号处理模块产生新的数据,之后就将数据写入双缓冲Data中。具体过程如下:
    1)循环等待新数据;
    2)如果缓冲区0未被锁定,则:
    (1)缓冲区0加锁;
    (2)写数据到缓冲区0;
    (3)标记缓冲区0未有数据:
    (4)缓冲区0解锁。
    3)如果缓冲区0已被锁定,则对缓冲区1重复上述步骤。
    在数据处理模块端读数据程序PPC_Read_Data()首先判断双缓冲有无数据,如果缓冲区0有数据,再判断缓冲区0是否加锁,如果未加锁,则先加锁,再读数据,再解锁。对缓冲区1同样如此处理。
转载请注明原文地址:https://jikaoti.com/ti/YOI7FFFM
0

最新回复(0)