⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 get_data.c

📁 完整的OFDM系统,含Matlab仿真代码和DSP源代码下载.平台Tms320C6000.含项目说明文档.绝对高质量的源代码.
💻 C
字号:
//get_data.c
//
// Project Red 2002: High Performance OFDM Modem 
// Against Channel Imperfections
// Auther: Linus Falk

#include "ofdm.h"

#pragma DATA_SECTION(DefaultBuffer,".edata")
unsigned int DefaultBuffer[HostBufferSize]; //junk data buffer

volatile unsigned int HostBuffer1[HostBufferSize]; //buffer 1, +1 for register
volatile unsigned int HostBuffer2[HostBufferSize]; //buffer 2, -----||--------

volatile unsigned int *CurrentHostBuffer; //current buffer used
volatile unsigned int *NextHostBuffer;
static unsigned char word_offset;
static unsigned char bit_offset;

void change_word(void);

/*鋘nu en som kanske funkar, fixar max 32 bitar */
void get_data(unsigned char nr_of_bits, unsigned char *outdata){
	char next_bit_offset = bit_offset + nr_of_bits;
	unsigned int data = 0;
	unsigned int temp_data = 0;
	char start_bits = 0, end_bits = 0;
	
	if(next_bit_offset <= 32){	//can be read in this word
		data = GET_FIELD(CurrentHostBuffer + word_offset, bit_offset, nr_of_bits); //get data
		if(next_bit_offset == 32){	//if this word is read
			change_word();			//change word
		}else{								//bits left in word
			bit_offset = next_bit_offset;	//increase bit offset
		}
	}else{	//split, read from 2 words
		end_bits = next_bit_offset - 32;		//nr of bits to be read in next word
		start_bits = nr_of_bits - end_bits;		//nr of bits left to read in this buffer
		data = GET_FIELD(CurrentHostBuffer + word_offset, bit_offset, start_bits); //get first bits
		change_word();
		temp_data = GET_FIELD(CurrentHostBuffer + word_offset, bit_offset, end_bits); //get last bits
		LOAD_FIELD(&data, temp_data, start_bits, end_bits);
		bit_offset = end_bits;
	}
	*outdata = (unsigned char)data;
}

void change_word(void){
	word_offset++;
	bit_offset=0;
	if(word_offset == HostBufferSize){	//Buffer used up
		//CurrentHostBuffer[HostBufferSize-1] = 0;	//set host registry to 0
		//byt buffer
		if(NextHostBuffer[HostBufferSize-1] == 0xffffffff){ //check if HostBuffer is ready
			CurrentHostBuffer = NextHostBuffer;
			if(NextHostBuffer == HostBuffer1){
				NextHostBuffer = HostBuffer2;
				HostBuffer2[HostBufferSize-1] = 0;
				pci_message_send(FILL_HOSTBUFFER2_MM); //Send fill buffer2 message to host
			}else{
				NextHostBuffer = HostBuffer1;
				HostBuffer1[HostBufferSize-1] = 0;
				pci_message_send(FILL_HOSTBUFFER1_MM); //Send fill buffer1 message to host
			}
		}else{	//no buffer ready
			CurrentHostBuffer = (volatile unsigned int*)DefaultBuffer;
		}
		word_offset = 0;
	}
}


#pragma CODE_SECTION(init_get_data,"SBSRAM_PROG_MEM");
void init_get_data(void){
	CurrentHostBuffer = (volatile unsigned int*) DefaultBuffer;    //At startup set current buffer to DefaultBuffer
	NextHostBuffer = HostBuffer1;
	word_offset = 0;                         //Begining of buffer
	bit_offset = 0;
	//fill HostBufferDummy
	memset(DefaultBuffer,0xC6, HostBufferSize*sizeof(unsigned int)); //Fill buffer dummy
	//fill HostBuffer1
	memset(HostBuffer1,0x00, HostBufferSize*sizeof(unsigned int)); //Fill buffer 1
    //fill HostBuffer2 
    memset(HostBuffer2,0x00, HostBufferSize*sizeof(unsigned int)); //Fill buffer 2
	//pci_message_send(FILL_HOSTBUFFER1_MM); //Send fill buffer1 message to host	
}

/*#pragma CODE_SECTION(init_get_data_dummy,"SBSRAM_PROG_MEM");
void init_get_data_dummy(void){
	 CurrentHostBuffer = HostBuffer1;
     word_offset = 0;
     bit_offset = 0;
     //fill HostBufferDummy
	memset(DefaultBuffer,0xC6, HostBufferSize*(sizeof(unsigned int)+1)); //Fill buffer dummy
	//fill HostBuffer1
	memset(HostBuffer1,0x00, HostBufferSize*(sizeof(unsigned int)+1)); //Fill buffer 1
    //fill HostBuffer2 
    memset(HostBuffer2,0x00, HostBufferSize*(sizeof(unsigned int)+1)); //Fill buffer 2
}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -