We use a custom made PCI bus based interface card to input this data. The interface card has four ports, one of which is unused. These ports are 16 bits wide data ports with separate control lines. Three of the ports are configured to accept the data on an independent external clock. The interface card has total 64/128 KB total memory, which is equally distributed among the 4 ports. Three ports are configured for streaming mode operation, where the 16/32 KB memory for a port is divided into two halves, such that when one half is full, an interrupt is generated for the host computer's CPU for transferring this data into the memory of the computer. While this transfer continues from one half of the data, the external data continues to fill the other half of the memory for each port. This process continues endlessly.
The user level software programs are expected to process the data at this rate on the average. This low level program receives the data from all the three channels and stores them in separate local buffers. For every block of data corresponding to the half of port memory (8 KB/16 KB, depending on the port memory size), the PC time is noted. This time corresponds to the end of the block of data just arrived, and can also be thought of as the time corresponding to the beginning of the next data block. This time will be used for time stamping of data by the next level software referred to as `acq' in Figure 26.3.
The low level program makes no effort to look inside the data buffers and synchronize three streams into one logical stream.
The data collector stores a good fraction of a second's worth of data in three separate circular buffers. Hence it is highly unlikely that the higher level program `acq' (even if it is temporarily busy elsewhere) will be unable to drain out this data before the buffers overflow.