Here's my implementation, in case someone needs something similar or in 
case someone wants to review and criticize.

On the ARM Side:

/////////////////////////////////////////////////////////////////////
// Ring buffer.
//

// Communication with PRU  is through a ring buffer in the
// PRU shared memory area.
// shared_ram[0] to shared_ram[127] is the buffer data.
// shared_ram[128] is the start (read) pointer.
// shared_ram[129] is the end (write) pointer.
//
// Messages are 32 bit unsigned ints.
// 
// Read these:
// * http://en.wikipedia.org/wiki/Circular_buffer#Use_a_Fill_Count
// * 
https://groups.google.com/forum/#!category-topic/beagleboard/F9JI8_vQ-mE

static volatile unsigned int* shared_ram = NULL;
void* p;
prussdrv_map_prumem(PRUSS0_SHARED_DATARAM, &p);
shared_ram = (volatile unsigned int*)p;

unsigned int buffer_size;
volatile unsigned int *buffer_start;
volatile unsigned int *buffer_end;

void buffer_init(){
   buffer_size = 128;
   buffer_start = &(shared_ram[128]); // value inited to 0 in pru
   buffer_end = &(shared_ram[129]); // value inited to 0 in pru
}

static inline int buffer_is_empty(){
   return (*buffer_start == *buffer_end);
}

static inline void buffer_read(unsigned int* message){
   *message = shared_ram[*buffer_start & (buffer_size-1)];

   // Don't write buffer start before reading message (mem barrier)
   // 
http://stackoverflow.com/questions/982129/what-does-sync-synchronize-do
   // https://en.wikipedia.org/wiki/Memory_ordering#Compiler_memory_barrier
   __sync_synchronize();

   // Increment buffer start, wrap around size
   *buffer_start = (*buffer_start+1) & (2*buffer_size - 1);
}

void main(){
   buffer_init();
   unsigned int message;
   while(!buffer_is_empty()){
      buffer_read(&message);
   }
}



On the PRU side:
/////////////////////////////////////////////////////////////////////
// RING BUFFER
//

// Communication with ARM processor is througn a ring buffer in the
// PRU shared memory area.
// shared_ram[0] to shared_ram[127] is the buffer data.
// shared_ram[128] is the start (read) pointer.
// shared_ram[129] is the end (write) pointer.
//
// Messages are 32 bit unsigned ints.
// 
// Read these:
// * http://en.wikipedia.org/wiki/Circular_buffer#Use_a_Fill_Count
// * 
https://groups.google.com/forum/#!category-topic/beagleboard/F9JI8_vQ-mE

volatile unsigned int* shared_ram = (volatile unsigned int *)0x10000;  

unsigned int buffer_size;
volatile unsigned int *buffer_start;
volatile unsigned int *buffer_end;

void init_buffer(){
   // data in shared_ram[0] to shared_ram[127]
   buffer_size = 128; 
   buffer_start = &(shared_ram[128]);
   buffer_end = &(shared_ram[129]);
   *buffer_start = 0;
   *buffer_end = 0;
}

inline void buffer_write(unsigned int message){
   shared_ram[*buffer_end & (buffer_size-1)] = message;
   unsigned int is_full = (*buffer_end == (*buffer_start^buffer_size)); // 
^ is orex
   if(is_full){
      // Increment buffer start, wrap around size
      *buffer_start = (*buffer_start+1) & (2*buffer_size - 1);
   }
   // Increment buffer end, wrap around size
   *buffer_end = (*buffer_end+1) & (2*buffer_size - 1);
}

void main(){
   buffer_init();
   buffer_write(0xff0000ff);
   buffer_write(0x11335577);
   //...
}
 




-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to