打印

做单片机很多年, 还是在制作着庞大的 main()

[复制链接]
5157|41
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AIRWILL|  楼主 | 2007-8-14 13:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  曾经, 学校时, 很多程序的工作都只用一个 main() 完成所有任务.
  
  现在, 工程上, 已经有了很多多的项目经验. 虽然, 项目里已经有了 10 多个源文件, 总有效代码行长度也有好几千行, #include 也一大堆了, 却还是在默默地用着这个习惯, main() 的长度还是占据着重量级的长度!

  各位弟兄姐妹, 不知道可有跟我一样习惯的, 这样的习惯应不应该?

相关下载

相关帖子

沙发
dadodo| | 2007-8-14 13:21 | 只看该作者

俺没有

main()最多几十行

使用特权

评论回复
板凳
dcp| | 2007-8-14 13:30 | 只看该作者

这样不累吗?

main()通常是从 N各个功能.C 调用n个执行程序

我有个同学和你差不多,程序的变量用拼音开头的,而且也没有什么格式,他的程序只能自已明白:)

使用特权

评论回复
地板
shkliu| | 2007-8-14 13:51 | 只看该作者

这样不好,不利于以后的阅读,最好分成模块级别。

个人意见。

使用特权

评论回复
5
ayb_ice| | 2007-8-14 13:52 | 只看该作者

我的项目main函数始终是3个switch语句...

使用特权

评论回复
6
gjg191| | 2007-8-14 14:22 | 只看该作者

dd

不管怎么 都要把注释做好,要不自己过段时间看不懂拉

使用特权

评论回复
7
tc9148| | 2007-8-14 18:21 | 只看该作者

ayb_ice

 ayb_ice 发表于 2007-8-14 13:52 侃单片机 ←返回版面    

5楼: 我的项目main函数始终是3个switch语句... 


-----------
不理解你的这句话“3个switch语句”。我是新手。

使用特权

评论回复
8
dcp| | 2007-8-14 19:03 | 只看该作者

也就是三个状态机了

使用特权

评论回复
9
高建明| | 2007-8-14 20:32 | 只看该作者

Re

我的只有一个函数SYSTEM_state();还有一个清狗CLR_watchdog();
^_^

使用特权

评论回复
10
ETUAL| | 2007-8-14 21:32 | 只看该作者

改改吧,这样不好的

使用特权

评论回复
11
simon21ic| | 2007-8-15 02:55 | 只看该作者

6行,把要做的事放到do_work()里去,嘎嘎

void main(){
    sys_init();
    while(1){
        do_work();
    }
}

使用特权

评论回复
12
fsaok| | 2007-8-15 07:56 | 只看该作者

尽量小

一般是

main()
{
     init();

     while(1)
     {

         pro1();        
         pro2();
         ...
         clr_dog();
         pcon |= 0x01;
     }
}

其中pro1();...根据实际情况去写,比如prokey(),

这样看起来很清晰,

系统处理键盘,处理LED显示,处理串口数据,...,处理狗,然后,休息。

至于怎么样去处理,那是另外的模块事情

使用特权

评论回复
13
救火车| | 2007-8-15 09:20 | 只看该作者

不同意11楼的写法。

void main(){
    sys_init();
    while(1){
        do_work();
    }
}
主程序写成do_work();白白浪费了一次函数调用。在每次循环中都要进栈出栈操作。浪费了堆栈和操作的时间。而且没有任何意义。

使用特权

评论回复
14
lixun00| | 2007-8-15 09:38 | 只看该作者

个人觉得:呵呵,程序的可读性和结构合理必然要已牺牲时

空间为代价,看实际情况。但在main里写几百行代码,觉得不应该。

使用特权

评论回复
15
wowow| | 2007-8-15 10:06 | 只看该作者

我觉得没啥啊

我现在做的MSP430的,main.c有2525行,main.h有446行,而main()只占了260行,不算多了吧。其它还有底层操作的bsp.c/adc.c/ExFlash.c/common.c/lcd.c,也算是模块化了吧。

如果程序复杂,main()函数必然也会长一些,能省点stack就省吧。

使用特权

评论回复
16
computer00| | 2007-8-15 10:17 | 只看该作者

偶不喜欢约束自己,嘿嘿,想怎么干就怎么干。

使用特权

评论回复
17
winloop| | 2007-8-15 11:25 | 只看该作者

我的main()

void main(void){    
    OUT1=0;
    SW485=0;    
    AUXR=0xff;//关闭xram,打开ALE
    COMMAND=SEL_62256;

    //ClearingHistoryDataArea();
    bTimer0=0;
    bResponsed=0;
    bPreOffline=0;
    bEnReportBzqinfo=1;
    bTelRequest=0;
    uSetting=1;
    uKeyValue=0;
    HostCommand=0;
    DeviceType=0;//默认查询调度屏状态
    
    A4953=1;
    bGpsValid=0;
    bRegistered=0;

    uRing=0;
    uConnectingStep=0;
    uBzqPollingBill=0;

    BaojingType=0;
    iSettingDelay=iDelayNow=0;
    iDeviceQueryDelay=100;

    //memset(GPSFrame+4,0x00,28);
    memset(&sUart0,0x00,sizeof(sUart0));
    memset(&sDeviceMem,0x00,sizeof(sDeviceMem));
    memset(&sBUF_16C2550B_UARTA,0x00,sizeof(sBUF_16C2550B_UARTA));
    memset(&sBUF_16C2550B_UARTB,0x00,sizeof(sBUF_16C2550B_UARTB));
    memset(&sReportingHistoryData,0x00,sizeof(sReportingHistoryData));
    memset(&sNowInformInfo,0x00,sizeof(sNowInformInfo));
    memset(&sHistoryInformInfo,0x00,sizeof(sHistoryInformInfo));

    InitInformInfo();
    InitRunningParameters();
    ResumeFlashMemPointer();
   
    COMMAND=SEL_2550A;
    Init_16C2550B(BAUD9600_2550B);//设备通道
    COMMAND=SEL_2550B;
    Init_16C2550B(BAUD4800_2550B);//GPS通道
    
    uCommandBackup=SEL_62256;
    COMMAND=SEL_62256;
    
    TMOD=0x21;     //T0为16位定时器,T1做波特率发生器
    
    ET0=1;
    TR0=1;
    
    TH1=0xf4;      //4800bps based 11.0592M crystal/6T
    TL1=0xf4;
    TR1=1;
    
    SCON=0x50;     //(MSB)SM0,SM1,SM2,REN,TB8,RB8,TI,RI(LSB)
    ES=1;
    
    IT0=1;//下降沿儿触发
    EX0=1;
    
    B4052=0;
    A4052=1;
    EA=1;
    SettingParameters();
        
    PCON&=0x7f;    //屏蔽波特率加倍位
    TH1=0xfa;      //9600bps based 11.0592M crystal/6T
    TL1=0xfa;

    while(1){
        DOG=!DOG;
        GPS_Query();
        Device_Query();
        BaojingDetect();
        RingOverDetect();
        PreOfflineDetect();
        PerformOnlineStatus();
        OnlineReportingData();
    }
}

使用特权

评论回复
18
cuittao| | 2007-8-15 13:02 | 只看该作者

聊一下

To LS:
    这样的方式令人头痛,用个函数,简单明了,何乐而不为?

To ayb_ice:  
    怯怯地问下,是3个 switch 是什么内容?谢谢!

使用特权

评论回复
19
ayb_ice| | 2007-8-15 13:11 | 只看该作者

不在乎多少语句...

关键是容易看懂,易修改,易维护...
我的3个switch语句可以看成是任何任务的3个状态...

使用特权

评论回复
20
yewuyi| | 2007-8-15 14:06 | 只看该作者

一般不会太长……

上电后做完初始化,然后处理安排一下任务就可以**了……

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

556

主题

17724

帖子

884

粉丝