Оптимизация кода в 8051
-
12-12-2019 - |
Вопрос
Итак, я должен сделать этот вызов, который должен реализовать систему наблюдения камеры для микроконтроллера 8051.
Это спецификации:
-
Каждая камера связана с датчиком движения, и каждый раз, когда он обнаруживает движение, запись этой камеры будет среди тех, которые будут зарегистрированы и сохранены. Если датчик не захватывает никакого движения более 5 секунд, эта камера больше не будет записана;
-
Если нет включения камеры, видеорегистратор должен быть в «паузе»;
-
Если включено более одной камеры, необходимо использовать мультиплексор (MUX), чтобы выбрать сигналы камеры таким образом, чтобы каждый камера записана в течение 3 секунд. Таким образом, все активные камеры должны быть записаны в течение 3 секунд. Если только одна камера активна, это сигнал, должен быть единственным в MUX.
Это уже достигнуто в коде ниже. И что нам нужно сделать, - это оптимизировать размер кода без оптимизации компилятора. Код - 198 байт, но я пытаюсь получить ниже 180 байтов.
Это возможно? Я уже пытался выполнить расчеты #define, но компилятор уже оптимизируют это для меня.
#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;
}
}
.Решение
Вам, вероятно, придется посмотреть на сгенерированный код сборки для этого, чтобы снять последние несколько байтов.Вероятно, можно побриться здесь, и там, повторно используя переменную или объединяющую операции.Полученный код не будет красивым - или поддерживаться - но он просто может заставить вас ниже вашего отсечения.
Другие советы
Я думаю, что коммутатор, а не если (датчик1,2,3,4) может помочь некоторым.