51单片机程序优化内容请教
各位好:
我是个硬件工程师,做了3年多的硬件,现在想学习一些嵌入式方面的内容,所以最近想把大学里面51的内容先重新复习一下,以便后期更好的学习ARM的嵌入式内容。经过几天的复习后,最近也写了几个51的程序。
其中有个程序,是闹钟程序,大概150行的样子,显示函数和按键设置函数还没有添加,但是编译出来生成的HEX文件就已经达到将近8K左右。不知能否优化。(之前在坛子上看到人家几千行的代码编译出来也就8K,几万行的代码编译出来也就20K,我对我的程序冗余很怀疑啊)先上程序代码。程序还有几个功能没有完成,我硬件出身,也是刚接触C51不久,可能会有很多错误,请各位大侠轻拍。最好能提供一下优化的办法,本程序使用了rtx51tny的RTOS,开发环境是:keil C51 uV4.
/**************************************************************************************************************
This is a CLOCK RTOS's programm with rtx51tny.----By Ztudou at 2012/05/24
**************************************************************************************************************/
#include <reg52.h>
#include <rtx51tny.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define INI 0
#define TIME 1
#define DATE 2
#define CLOCK 3
#define DISPLAY 4
#define SETTING 5
#define MUSIC 6
struct time
{
uchar hour;
uchar min;
uchar sec;
};/*定义时间数据结构*/
struct date
{
uchar month;
uchar day;
};/*定义日期数据结构*/
struct time now_time={12,0,0},clock={8,0,0};
struct date now_date={1,1};
uchar LED_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
/*共阳极8段数码管编码*/
bit clockon_flag=0; /*闹钟开关标志位*/
sbit speaker=P3^0; /*闹铃喇叭*/
void inital(void)_task_ INI
{
P2=0xFF;
P1=0xFF;
P0=0xFF;
P3=0xFF;
os_create_task(TIME);
os_create_task(DISPLAY);
os_create_task(SETTING);
os_delete_task(INI);
}/*程序初始化*/
void timeon(void)_task_ TIME
{
while(1)
{
os_wait(K_TMO,100,0);/*等待1秒*/
if(++now_time.sec==60)
{
now_time.sec=0;
now_time.min++;
if(now_time.min==60)
{
now_time.min=0;
now_time.hour++;
if(now_time.hour==24)
{
now_time.hour=0;
os_create_task(DATE);
}
}
}
if((now_time.hour==clock.hour&&now_time.min==clock.min&&now_time.sec==clock.sec)&clockon_flag) /*闹钟时间与闹钟开关判断*/
{
os_create_task(CLOCK); /*开启闹中任务*/
os_create_task(MUSIC); /*开启闹铃任务*/
}
}
}/*时间处理任务*/
void dateon(void)_task_ DATE
{
while(1)
{
now_date.day++;
if((now_date.month==1||now_date.month==3||now_date.month==5||now_date.month==7||
now_date.month==8||now_date.month==10||now_date.month==12)&&now_date.day==32)
{
now_date.day=1;
now_date.month++;
if(now_date.month==13)
{
now_date.month=1;
}
}
else if((now_date.month==4||now_date.month==6||now_date.month==9||now_date.month==11)&&now_date.day==31)
{
now_date.day=1;
now_date.month++;
}
else if(now_date.month==2&&now_date.day==29)
{
now_date.day=1;
now_date.month++;
}
else
{
printf(" date is ERROR\n");
}
os_delete_task(DATE);
}
}/*日期处理任务*/
void CLOCKOFF(void)_task_ CLOCK
{
while(1)
{
os_wait(K_SIG|K_TMO,6000,0); /*闹铃1分钟或者有外部中断输入关闭闹铃*/
os_delete_task(MUSIC);
os_delete_task(CLOCK);
}
}/*闹钟处理任务*/
void MUSICON(void)_task_ MUSIC
{
while(1)
{
speaker=!speaker;
os_wait(K_TMO,50,0);
}
}/*闹铃处理任务*/
void displayon(void)_task_ DISPLAY
{
while(1)
{
}
}/*数码管显示任务*/
void set(void)_task_ SETTING
{
while(1)
{
}
}/*闹钟设置任务*/
[解决办法]
printf(" date is ERROR\n");
屏蔽掉工程中所有的这个函数,你编译一下,在看看大小
[解决办法]
printf是库函数,这个函数功能很强大,单片机里面几乎不用这个函数的。
自己写一个串口发送的代码吧