📄 get_data.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 + -