2012-05-21 61 views
1

因此,我必须面对这个挑战,即为8051微控制器实现摄像头监控系统。8051中的代码优化

这些规格:

  1. 每个摄像机涉及一种运动传感器,并且每次检测到运动,这种照相机的记录将是将被注册并保存的文档中。如果传感器在5秒钟内没有捕捉任何动作,则不会再记录此摄像机;

  2. 如果没有摄像头,录像机必须处于“暂停”状态;

  3. 如果打开多个相机,必须使用多路复用器(mux)来选择相机信号,以便在3秒内记录每个相机。这样,所有活动的摄像机必须在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,您可能会喜欢这些想法,例如'#define F(I,S,N)for(I = S; I

+0

将您的循环调整为倒计数而不是向上并比较为零将节省几个字节,因为8051具有DJNZ如果不是零则减量和跳转)指令。 –

回答

1

您可能需要查看生成的汇编代码,以便将最后几个字节拧出。通过重新使用变量或组合操作,可能在这里和那里修改一些。由此产生的代码不会很漂亮 - 或可维护 - 但它可能会让你低于你的截止点。

0

我认为一个开关的情况下,而不是if(sensor1,2,3,4)可以帮助一些。