Ottimizzazioni del codice in 8051
-
12-12-2019 - |
Domanda
Quindi, devo fare questa sfida, che è implementare un sistema di sorveglianza della fotocamera per un microcontrollore 8051.
Queste sono le specifiche:
- .
-
Ogni fotocamera è correlata a un sensore di movimento e ogni volta che rileva un movimento, la registrazione di questa fotocamera sarà tra quelle che saranno registrate e salvate. Se il sensore non cattura alcun movimento per più di 5 secondi, questa fotocamera non verrà registrata più;
-
Se non c'è fotocamera, il videoregistratore deve essere su "Pausa";
-
Se è necessario utilizzare più di una telecamera, un multiplexer (MUX) deve essere utilizzato per selezionare i segnali della fotocamera in modo che ogni telecamera sia registrata durante i 3 secondi. In questo modo, tutte le telecamere attive devono essere registrate durante 3 secondi. Se solo una fotocamera è attiva, il segnale deve essere l'unico nel mux.
Questo ho già realizzato nel codice qui sotto. E ciò che dobbiamo fare ora è ottimizzare la dimensione del codice senza le ottimizzazioni del compilatore. Il codice è da 198 byte ormai, ma sto cercando di ottenere sotto i 180 byte.
è possibile? Ho già provato a fare i calcoli della #Defina, ma il compilatore è già ottimizzato per me.
#include <REG51F.h>
#define TIMEOUT 50
#define TIMEOUT_REC 30
#define FrClk 12000000
#define FreqTimer0_emHz 10
#define VALOR_TH0 ((65536 - (FrClk /(12 * FreqTimer0_emHz ))) >> 8)
#define VALOR_TL0 ((65536 - (FrClk /(12 * FreqTimer0_emHz ))) & 0xFF)
data bit PAUSE_INT;
data bit PAUSE_TMP;
sbit PAUSE = P0^0;
sbit SENSOR1 = P0^1;
sbit SENSOR2 = P0^2;
sbit SENSOR3 = P0^3;
sbit SENSOR4 = P0^4;
sbit MUX0 = P0^5;
sbit MUX1 = P0^6;
data unsigned char CAM[4];
data unsigned char REC;
data unsigned char index;
data unsigned char count;
void timer0_int (void) interrupt 1 using 2 {
for (index = 0; index < 4; index++)
if(CAM[index])
CAM[index]--;
if (!PAUSE_INT && REC)
REC--;
else
{
REC = TIMEOUT_REC;
index = (index + 1) & 0x03;
for (count = 0; !CAM[index] && count < 4; index = (index + 1) & 0x03, count++);
MUX0 = index & 0x1;
MUX1 = index & 0x2;
PAUSE_INT = 0;
}
}
int main(void)
{
PAUSE_TMP = 1;
PAUSE_INT = 0;
index = 0;
//timer0_init
EA = 1;
TR0 = 0;
TMOD = (TMOD & 0xF0) | 0x01;
TH0 = VALOR_TH0;
TL0 = VALOR_TL0;
ET0 = 1;
TR0 = 1;
while(1) {
if (SENSOR1)
{
CAM[0] = TIMEOUT;
}
if (SENSOR2)
{
CAM[1] = TIMEOUT;
}
if (SENSOR3)
{
CAM[2] = TIMEOUT;
}
if (SENSOR4)
{
CAM[3] = TIMEOUT;
}
if (CAM[0] || CAM[1] || CAM[2] || CAM[3])
{
if (PAUSE_TMP)
PAUSE_INT = 1;
PAUSE_TMP = 0;
}
else {
PAUSE_TMP = 1;
}
PAUSE = PAUSE_TMP;
}
}
.Soluzione
Probabilmente dovrai guardare al codice di assemblaggio generato per questo per interrompere gli ultimi byte.Probabilmente è possibile raderti alcuni qui e lì riutilizzando una variabile o combinando operazioni.Il codice risultante non sarà carino o mantenuta - ma potrebbe solo prenderti sotto il tuo cutaggio.
Altri suggerimenti
Penso che una custodia cambio anziché se (sensor1,2,3,4) potrebbe aiutare alcuni.