Вопрос

Итак, я должен сделать этот вызов, который должен реализовать систему наблюдения камеры для микроконтроллера 8051.

Это спецификации:

  1. Каждая камера связана с датчиком движения, и каждый раз, когда он обнаруживает движение, запись этой камеры будет среди тех, которые будут зарегистрированы и сохранены. Если датчик не захватывает никакого движения более 5 секунд, эта камера больше не будет записана;

  2. Если нет включения камеры, видеорегистратор должен быть в «паузе»;

  3. Если включено более одной камеры, необходимо использовать мультиплексор (MUX), чтобы выбрать сигналы камеры таким образом, чтобы каждый камера записана в течение 3 секунд. Таким образом, все активные камеры должны быть записаны в течение 3 секунд. Если только одна камера активна, это сигнал, должен быть единственным в MUX.

  4. Это уже достигнуто в коде ниже. И что нам нужно сделать, - это оптимизировать размер кода без оптимизации компилятора. Код - 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) может помочь некоторым.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top