2012-05-21 8 views
1

그래서 저는 8051 마이크로 컨트롤러 용 카메라 감시 시스템을 구현해야하는이 과제를 수행해야합니다. 코드 최적화 8051

은 사양이다 :

  1. 각 카메라는 움직임 감지기에 관련되고,이 카메라의 녹화가 등록되어 저장 될 것들 것마다 그것은 운동을 검출한다. 센서가 5 초 이상 움직임을 포착하지 않으면이 카메라는 더 이상 기록되지 않습니다.

  2. 카메라가 켜져 있지 않으면 비디오 레코더가 "일시 중지"상태 여야합니다.

  3. 하나 이상의 카메라가 켜져있는 경우 각 카메라가 3 초 동안 기록되도록 멀티플렉서 (mux)를 사용하여 카메라 신호를 선택해야합니다. 이렇게하면 3 초 동안 모든 활성 카메라를 녹화해야합니다. 하나의 카메라 만 활성화되어 있으면 신호가 멀티 플렉스의 유일한 신호이어야합니다.

이 코드는 이미 아래 코드에서 수행했습니다. 그리고 지금해야 할 일은 컴파일러 최적화없이 코드의 크기를 최적화하는 것입니다. 코드는 지금까지 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; 
    } 


} 
+0

다음 코드를 확인하십시오. http://home.hccnet.nl/h.g.muller/max-src2.html. –

+0

루프 대신에 카운트 다운을하고 0과 비교하면 8051에 DJNZ가 있기 때문에 몇 바이트를 절약 할 수 있습니다 ((I = S, I

답변

1

마지막으로 몇 바이트를 짜내려면 생성 된 어셈블리 코드를 살펴 봐야 할 것입니다. 변수를 재사용하거나 연산을 결합하여 여기저기서 몇 가지 면도를 할 수 있습니다. 결과 코드는 예쁘지 않거나 유지 보수가되지 않을 수도 있습니다.하지만 코드가 잘리지 않을 수도 있습니다.

0

대신 스위치 케이스 (sensor1,2,3,4)가 도움이 될 수 있다고 생각합니다.