首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >8051中的代码优化

8051中的代码优化
EN

Stack Overflow用户
提问于 2012-05-21 21:42:50
回答 2查看 658关注 0票数 1

所以,我必须完成这个挑战,那就是实现一个8051单片机的摄像头监控系统。

这些规格如下:

  1. 每台相机都与一个运动传感器相关,每次它检测到一个运动时,该相机的记录都将被注册和保存。如果传感器不能捕捉到超过5秒的任何运动,这台相机将不再被记录;
  2. ,如果没有摄像头,录音机必须处于“暂停”状态;
  3. ,如果有多个摄像头,则必须使用一个多路复用器(mux)以一种方式选择相机信号,以便在3秒内记录每台摄像机。这样,所有的活动相机都必须在3秒内被记录下来。如果只有一台摄像机处于活动状态,它的信号必须是穆克斯中唯一的信号。

我已经在下面的代码中完成了这一点。我们现在要做的是在没有编译器优化的情况下优化代码的大小。到目前为止,代码是198字节,但我正试图将其降到180字节以下。

有可能吗?我已经尝试过做#define的计算,但是编译器已经为我优化了它。

代码语言:javascript
复制
#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;
    }


}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-22 04:05:56

您可能需要查看生成的程序集代码,以便从其中提取出最后几个字节。通过重用变量或组合操作,可能会到处刮胡子。生成的代码将不是很漂亮--或者是可维护的--但是它可能会使您低于截止值。

票数 1
EN

Stack Overflow用户

发布于 2012-05-21 22:01:50

我认为一个开关的情况,而不是如果(感觉1,2,3,4)可以帮助一些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10693053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档