8051中的代码优化

时间:2012-05-21 21:42:51

标签: c microcontroller 8051 keil

所以,我必须做这个挑战,即为8051微控制器实现摄像监视系统。

这些是规格:

  1. 每个摄像机都与一个运动传感器相关,每次检测到一个运动时,该摄像机的记录将被注册并保存。如果传感器没有捕获任何移动超过5秒,则不再记录此摄像机;

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

  3. 如果打开了多个摄像机,则必须使用多路复用器(多路复用器)以某种方式选择摄像机信号,以便在3秒内记录每个摄像机。这样,必须在3秒内记录所有活动摄像机。如果只有一台摄像机处于活动状态,则它的信号必须是多路复用器中的唯一信号。

  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;
        }
    
    
    }
    

2 个答案:

答案 0 :(得分:1)

您可能需要查看生成的汇编代码,以便从中抽出最后几个字节。通过重用变量或组合操作,可能可以在这里和那里刮几个。生成的代码不会很好 - 或者可维护 - 但它可能会让你低于截止值。

答案 1 :(得分:0)

我认为切换案例而不是if(sensor1,2,3,4)可以帮助一些人。