Browse Source

try new ringbuffer

optixx 14 years ago
parent
commit
5a439f56bb
3 changed files with 54 additions and 43 deletions
  1. 10 30
      avr/usbload/inflate.c
  2. 43 13
      avr/usbload/ringbuffer.c
  3. 1 0
      avr/usbload/ringbuffer.h

+ 10 - 30
avr/usbload/inflate.c

@@ -27,41 +27,32 @@
 #include "ringbuffer.h"
 
 char inflate_done = 0;
-char *mem;
 char *mem_ref;
 
-int addr = 0;
 int addr_ref = 0;
 
+int cnt_hit = 0;
+int cnt = 0;
+
 
 void inflate_init() 
 {
     neginf_init(0);
-    mem = (char*)malloc(2<<15);
     mem_ref = (char*)malloc(2<<15);
     addr_ref = 0;
-    addr = 0;
     rb_init();
 }
 
 void inflate_flush() 
 {    
-    while(!rb_isempty()){
 
-        mem[addr++] = rb_get();
-        printf("final fill addr=0x%06x size=%i\n",addr,rb_free());
-    }
-    printf("write out.smc\n");
+    rb_flush();
     FILE *file;
-    file = fopen("out.smc","w");
-    fwrite(mem,2<<15,1,file);
-    fclose(file); 
-
     printf("write out_ref.smc\n");
     file = fopen("out_ref.smc","w");
     fwrite(mem_ref,2<<15,1,file);
     fclose(file);
-
+    printf("cnt=%i cnt_hit=%i\n",cnt,cnt_hit);
 }
 
 void neginf_cb_completed()
@@ -71,32 +62,21 @@ void neginf_cb_completed()
 
 void neginf_cb_seq_byte(nbyte byte)
 {
-
     mem_ref[addr_ref++] = byte; 
-
-
-    if (rb_isfull())
-        mem[addr++] = rb_get();
-    
-    printf("addr=%x byte=%i size=%i\n",addr,byte, rb_free());
     rb_put(byte);
-    //assert(!rb_isfull());
 }
 
 void neginf_cb_copy(nsize from, nsize to, nint length)
 {
     int i;
-
-    printf("neginf_cb_copy addr=0x%06x from=0x%06x to=0x%06x len=%i\n",addr,from, to, length);
-
+    cnt++;
+    if ((to - from) < ( 1024 * 2 ) ){
+        cnt_hit++;
+    }
+    printf("neginf_cb_copy from=0x%06x to=0x%06x dist=%i len=%i\n",from, to, (to - from), length);
     for (i=0; i<length;i++){
         mem_ref[to+i] = mem_ref[from+i];
     }
-
-    for (i=0; i<length;i++){ 
-        mem[to+i] = mem_ref[from+i];
-    }
-    addr = to + length;
     addr_ref = to + length;
 }
 

+ 43 - 13
avr/usbload/ringbuffer.c

@@ -10,42 +10,66 @@ t-> o
 b-> x
 */
 
-#include "ringbuffer.h"
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
 
+#include "ringbuffer.h"
 
 
+#define ringbuffer_size     2048
+#define memory_size         65536
 
-static char buf[ringbuffer_size];
-int rb_count;
 
 #define t &buf[ringbuffer_size - 1]
 #define b &buf[0]
 
+char buf[ringbuffer_size];
+int rb_count;
+char *memory;
+int pos_mem;
+int pos_head;
+
+
 //char *t = &buf[ringbuffer_size - 1];
 //char *b = &buf[0];
 
 char *r; // position from where we can read (if rb_count > 0)
 char *w; // next free position (if rb_count < ringbuffer_size))
 
-void rb_init(void)
+void rb_init()
 {
-  r = b;
-  w = b;
-  rb_count = 0;
-  memset(buf,0,ringbuffer_size);
+    r = b;
+    w = b;
+    rb_count = 0;
+    memory = (char*)malloc(memory_size);
+    pos_mem = 0;
+    pos_head = 0;
+}
+
+void rb_flush(){
+    FILE *file;
+
+    while(!rb_isempty()){
+        memory[pos_mem++] = rb_get();
+    }
+    printf("write out.smc\n");
+    file = fopen("out.smc","w");
+    fwrite(memory,memory_size,1,file);
+    fclose(file);
 }
 
 char rb_get(void)
 {
   rb_count--;
-  if (r > t) r = b;
+  if (r > t)
+    r = b;
   return *r++;
 }
 
 
 char rb_read(void)
 {
-
   if (r > t) r = b;
   return *r++;
 }
@@ -53,10 +77,16 @@ char rb_read(void)
 
 void rb_put(char el)
 {
+  pos_head++;
   rb_count++;
+
+  if ( rb_count > ringbuffer_size)
+    memory[pos_mem++]=el;
+
+  printf("rb_count=%i pos_head=0x%06x add_mem=0x%06x\n",rb_count, pos_head,pos_mem);
+
   if (w > t){
-    w = b;
-    printf("wrap around\n");
-   }
+        w = b;
+  }
   *w++ = el;
 }

+ 1 - 0
avr/usbload/ringbuffer.h

@@ -14,5 +14,6 @@ extern int rb_count;
 void rb_init(void);
 void rb_put(char el);
 char rb_get(void);
+void rb_flush(void);
 
 #endif