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

📄 put_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"

volatile unsigned int LoadHostBuffer1[HostBufferSize]; //buffer 1, +1 for register
volatile unsigned int LoadHostBuffer2[HostBufferSize]; //buffer 2, -----||--------
volatile unsigned int *CurrentLoadHostBuffer; //current buffer used
static unsigned char word_offset;
static unsigned char bit_offset;

void put_change_word(void);

//function to write data bitwise to host
void put_data(unsigned char nr_of_bits, unsigned int indata){
	unsigned int data = 0;
	unsigned int temp_data = 0;
	char start_bits = 0;
	char end_bits = 0;
	char next_bit_offset = bit_offset + nr_of_bits;
	
	if(next_bit_offset <= 32){	//can be written in this word
		data = (unsigned int)indata;
		LOAD_FIELD(CurrentLoadHostBuffer + word_offset, data,bit_offset, nr_of_bits); //load data
		if(next_bit_offset == 32){	//if this word is written
			put_change_word();			//change word
		}else{								//bits left to write in word
			bit_offset = next_bit_offset;	//increase bit offset
		}
	}else{	//split, write to 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(&indata,0,start_bits);
		LOAD_FIELD(CurrentLoadHostBuffer + word_offset, data,bit_offset, start_bits); //load data
		put_change_word();
		temp_data = GET_FIELD(&indata, start_bits, end_bits); //get last bits
		
		LOAD_FIELD(CurrentLoadHostBuffer + word_offset, temp_data, 0, end_bits);
		bit_offset = end_bits;
	}
}

void put_change_word(void){
	word_offset++;
	bit_offset=0;
	if(word_offset == HostBufferSize){	//Buffer used up
		//CurrentLoadHostBuffer[HostBufferSize-1] = 0;	//set host registry to 0
		//byt buffer
		if(CurrentLoadHostBuffer == LoadHostBuffer1){
			CurrentLoadHostBuffer = LoadHostBuffer2;
			pci_message_send(FILL_HOSTBUFFER1_MM); //Send fill buffer1 message to host
		}else{
			CurrentLoadHostBuffer = LoadHostBuffer1;
			pci_message_send(FILL_HOSTBUFFER2_MM); //Send fill buffer2 message to host
		}
		word_offset = 0;
	}
}


#pragma CODE_SECTION(init_put_data,"SBSRAM_PROG_MEM");
void init_put_data(void){
	CurrentLoadHostBuffer = LoadHostBuffer1;    //At startup set current buffer to HostBuffer1
	word_offset = 0;                         //Begining of buffer
	bit_offset = 0;
	memset(LoadHostBuffer1,0x00, HostBufferSize*sizeof(unsigned int)); //Fill buffer 1
    memset(LoadHostBuffer2,0x00, HostBufferSize*sizeof(unsigned int)); //Fill buffer 2
	//fill HostBuffer1
	//pci_message_sync_send(FILL_HOSTBUFFER1_MM);//send mailbox message to host
	//fill HostBuffer2
	//pci_message_sync_send(FILL_HOSTBUFFER2_MM);//send mailbox message to host
}

/*#pragma CODE_SECTION(init_put_data_dummy,"SBSRAM_PROG_MEM");
void init_put_data_dummy(void){
	 CurrentLoadHostBuffer = LoadHostBuffer1;
     word_offset = 0;
     bit_offset = 0;
     memset(LoadHostBuffer1,0x00, HostBufferSize*sizeof(unsigned int)); //Fill buffer 1
     memset(LoadHostBuffer2,0x00, HostBufferSize*sizeof(unsigned int)); //Fill buffer 2
}*/

⌨️ 快捷键说明

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