题
所以,我必须做这个挑战,这是为8051微控制器实施相机监控系统。
这些是规格:
-
每个相机与移动传感器相关,并且每次检测到移动时,该相机的记录将在将被注册和保存的那些相机之间。如果传感器不会捕获任何移动超过5秒,则不会再记录此相机;
-
如果没有相机,则视频录像机必须在“暂停”上;
-
如果开启了多个摄像机,则必须使用多路复用器(MUX)以在某种方式选择相机信号,从而在3秒钟内记录每个相机。这样,必须在3秒钟内记录所有活动摄像头。如果只是一个相机处于活动状态,则信号必须是MUX中唯一的信号。
此我已经在下面的代码中完成。我们现在要做的是在没有编译器优化的情况下优化代码的大小。代码现在是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;
}
}
.解决方案
您可能需要查看生成的装配代码,以便将最后几个字节拧出。通过重用变量或组合操作,可以在此处刮掉一些少数人。生成的代码不会是漂亮的或可维护 - 但它可能会让你低于你的截止值。
其他提示
我认为切换案例而不是IF(Sensor1,2,3,4)可以帮助一些。
不隶属于 StackOverflow