Просмотр исходного кода

Buffers: use 2 bytes per sample instead of 5.

fbt free memory usage report before/after:

    Free heap size: 60952
    Free heap size: 73344
antirez 3 лет назад
Родитель
Сommit
b1ce345805
2 измененных файлов с 10 добавлено и 11 удалено
  1. 6 8
      app_buffer.c
  2. 4 3
      app_buffer.h

+ 6 - 8
app_buffer.c

@@ -29,8 +29,7 @@ void raw_samples_reset(RawSamplesBuffer *s) {
     s->total = RAW_SAMPLES_NUM;
     s->idx = 0;
     s->short_pulse_dur = 0;
-    memset(s->level,0,sizeof(s->level));
-    memset(s->dur,0,sizeof(s->dur));
+    memset(s->samples,0,sizeof(s->samples));
     furi_mutex_release(s->mutex);
 }
 
@@ -43,8 +42,8 @@ void raw_samples_center(RawSamplesBuffer *s, uint32_t offset) {
 /* Add the specified sample in the circular buffer. */
 void raw_samples_add(RawSamplesBuffer *s, bool level, uint32_t dur) {
     furi_mutex_acquire(s->mutex,FuriWaitForever);
-    s->level[s->idx] = level;
-    s->dur[s->idx] = dur;
+    s->samples[s->idx].level = level;
+    s->samples[s->idx].dur = dur;
     s->idx = (s->idx+1) % RAW_SAMPLES_NUM;
     furi_mutex_release(s->mutex);
 }
@@ -55,8 +54,8 @@ void raw_samples_get(RawSamplesBuffer *s, uint32_t idx, bool *level, uint32_t *d
 {
     furi_mutex_acquire(s->mutex,FuriWaitForever);
     idx = (s->idx + idx) % RAW_SAMPLES_NUM;
-    *level = s->level[idx];
-    *dur = s->dur[idx];
+    *level = s->samples[idx].level;
+    *dur = s->samples[idx].dur;
     furi_mutex_release(s->mutex);
 }
 
@@ -66,8 +65,7 @@ void raw_samples_copy(RawSamplesBuffer *dst, RawSamplesBuffer *src) {
     furi_mutex_acquire(dst->mutex,FuriWaitForever);
     dst->idx = src->idx;
     dst->short_pulse_dur = src->short_pulse_dur;
-    memcpy(dst->level,src->level,sizeof(dst->level));
-    memcpy(dst->dur,src->dur,sizeof(dst->dur));
+    memcpy(dst->samples,src->samples,sizeof(dst->samples));
     furi_mutex_release(src->mutex);
     furi_mutex_release(dst->mutex);
 }

+ 4 - 3
app_buffer.h

@@ -7,11 +7,12 @@
 #define RAW_SAMPLES_NUM 2048 /* Use a power of two: we take the modulo
                                 of the index quite often to normalize inside
                                 the range, and division is slow. */
-
 typedef struct RawSamplesBuffer {
     FuriMutex *mutex;
-    uint8_t level[RAW_SAMPLES_NUM];
-    uint32_t dur[RAW_SAMPLES_NUM];
+    struct {
+        uint16_t level:1;
+        uint16_t dur:15;
+    } samples[RAW_SAMPLES_NUM];
     uint32_t idx;   /* Current idx (next to write). */
     uint32_t total; /* Total samples: same as RAW_SAMPLES_NUM, we provide
                        this field for a cleaner interface with the user, but