2015-04-16 11 views
5

Ho un sistema incorporato (MCU senza OS) che l'utente finale dovrebbe essere in grado di definire il livello del sistema (scala: 0-100) per un anno. A titolo di esempio (ora x giorno matrice):Come memorizzare in modo efficiente le informazioni di un'attività sul calendario di un anno

 | 1st Jan | 2nd Jan | 3rd Jan | .. | 31 Dec | 
00:30 | 40 (%) | 40  | 45  | .. | 50 | 
01:48 | 48  | 47  | 55  | .. | 33 | 
02:26 | 64  | 64  | 60  | .. | 68 | 
..  | ..  | ..  | ..  | .. | .. | 
22:15 | 79  | 82  | 89  | .. | 100 | 
23:37 | 100  | 100  | 97  | .. | 100 | 

Quello che ho pensato è quello di memorizzare i dati come: time [in minutes], sysLevel quindi sarebbe qualcosa di simile per la tabella di cui sopra:

typedef struct{ 
    uint16_t minute; //scale: 0 - 1440 min 
    uint8_t level; //scale 0 - 100 (%) 
}timeLevel_t; //3 byte 

poi negozio ogni giorno come

timeLevel_t firstJan[24] = { .. }; //it stores level changes, the array length doesn't have to be 24 
timeLevel_t secJan[17] = { .. }; 
timeLevel_t thirdJan[20] = { .. }; 
... 

(io recuperare i dati da un file CSV che potrebbe essere fuori argomento da considerare ora su questa questione).

Il sistema si aspetterebbe di avere una definizione di attività all'ora nel caso peggiore, in modo che timeLevel_t (3 byte) definizione per 24 ore sarebbe 72 byte di dati al giorno, quindi i dati per 365 giorni sarebbero dati di 26280 byte .

Suggerireste un algoritmo più efficiente in memoria per memorizzare le informazioni per un anno di calendario (il programma lo aggiornerà ogni anno in modo che considererebbe il 29 febbraio)?

Inoltre? Sarebbe meglio creare una matrice bidimensionale per memorizzare le informazioni del giorno su 1D e timeLevel_t sull'altra dimensione?

+0

Mi sembra che la fonte dei dati (si parla di un file CSV) sia una parte molto importante della progettazione del sistema. Penso che sia necessario essere più specifici su dove vengono archiviati i dati (flash/ram/unità di rete) e su come i dati vengono acceduti. – user3386109

+0

0-1440 richiede 11 bit e 0-100 richiede 7 bit, quindi sono necessari 18 bit per ciascuna voce. Forse puoi ridurlo a 16 bit abbassando la risoluzione a 2 minuti e 2 punti percentuali? Puoi anche impacchettare quattro voci da 18 bit in 9 byte, ma complicherà un po 'il codice. –

+0

Memorizzo le informazioni sulla memoria interna dell'MCU (oltre 2,62 kB) e aggiorna i dati tramite la rete (potrebbe essere aggiornato blocco per blocco (mesi)). Penso che la fonte ideale di dati dovrebbe essere considerata per non perdere il focus della domanda (è una volta un processo annuale). – Angs

risposta

0

È necessario memorizzare ulteriori informazioni, ad esempio # giorni/mese, oppure assumere 31 ciascuno e sprecare un paio di byte.

Tutto dipende dai punti di dolore. È possibile impacchettare più byte per non sprecare bit, a scapito della complessità del codice e del tempo di elaborazione.

Se lo spazio di archiviazione è assoluto, è possibile memorizzare tutto in un unico enorme array 1D e utilizzare i bit aggiuntivi per altre cose. Ad esempio, il bit 11 potrebbe indicare "next day", bit 12 "next month" e quindi è possibile eseguire la scansione dell'array e trovare qualsiasi giorno dell'anno. E avresti un intero altro 4 bit per vari imbrogli.

Descrivi di più i problemi, per favore.

Problemi correlati