程序结构

[复制链接]
1719|10
 楼主| ousj 发表于 2013-10-5 17:38 | 显示全部楼层 |阅读模式
void main(void)
{
       init();//各种初始化
       if(!wake_flag)sleep();//休眠
       ;---------------
       while(wake_flag) //初始化mode是0
       {
              display(); //显示
              --------; // 其他任务
              keyscan();//键盘扫描(不同的键码有不同的mode,没有按键就是mode=0)
              timeout_sleep();//没有按键,超时则休眠
              judge_mode();  //判断mode
              whiele(mode1)
              {
                      display(); //显示
                      --------; // 其他任务
                      keyscan();
                      //键盘扫描(不同的键码有不同的mode,没有按键就是mode=0)
                      timeout_sleep();//没有按键,超时则休眠
              }
              whiele(mode2)
              {
                      display(); //显示
                      --------; // 其他任务
                      keyscan();
                      //键盘扫描(不同的键码有不同的mode,没有按键就是mode=0)
                      timeout_sleep();//没有按键,超时则休眠
              }

             ----有100多个mode         
       }
}



这种程序结构不算是超级循环吧?我理解的超级循环是就一个大大循环,而没有小循环。像这个程序结构中,有100多个小循环呢---------

这个还不算,其他任务当中也有小循环,小循环也有显示,也有其他任务,也有按键扫描----------当然,就3,4层小循环而已

这样的程序结构真是-----最起码我认为很不好!这个不要以为是我杜撰的,这样的程序结构,有些公司里面就有!因为我公司就是一个例子,而且我也在接手-----有点想哭
morrisk 发表于 2013-10-5 17:38 | 显示全部楼层
没什么好与不好,看具体项目的要求了
zyf部长 发表于 2013-10-5 17:40 | 显示全部楼层
程序框架当然有优劣之分,呵呵

大多数项目都要考虑扩展、升级、移植等一系列问题
项目之初,架构程序时就应考虑上述问题。。。
小小猫咪 发表于 2013-10-5 17:40 | 显示全部楼层
这个结构不好,1. 在一个函数内的代码太长("有100多个mode"),这还是main函数;2. 太多“display(); keyscan();”了, 占用代码空间,如果是动态LED数码管显示,一般采用定时中断扫描;这个结构不好,1. 在一个函数内的代码太长("有100多个mode"),这还是main函数;2. 太多“display(); keyscan();”了, 占用代码空间,如果是动态LED数码管显示,一般采用定时中断扫描;
kangzj 发表于 2013-10-5 17:41 | 显示全部楼层
系统只在上电后休眠?一旦触发就再也不睡了?那还休眠个啥啊
houcs 发表于 2013-10-5 17:41 | 显示全部楼层
显示和键盘扫描放到后台去处理(定时中断),主程序只要根据相应模式做相应事就可以了,参考一下多级菜单架构!
liuzaiy 发表于 2013-10-5 17:42 | 显示全部楼层
如果不在呼程序空间的话,这样子的结构也许更好一些,因为这样子程序方便控制,而且变量少,控制容易,非常推荐这种结构。想想就知道了,那么多的MODE,如果单单一个大循环,那需要控制多少变量,多少流程,而且容易出错!这种结构比一个大循环好多了,唯一的缺点是:可能程序增大十几倍。
yinxiangh 发表于 2013-10-5 17:42 | 显示全部楼层
这种方式也可以看作效率低下的顺序状态(机), 状态变量 mode. mode100 至少要经过 100 次判断,才能运行。建议参照状态机划分状态, 合理分配任务, 同时简化框架:

  while(wake_flag) //初始化mode是0
       {
             judge_mode();  //判断mode
             display(); //显示
              LaunchTasks(mode);  // --------; // 其他任务
              keyscan();//键盘扫描(不同的键码有不同的mode,没有按键就是mode=0)
              timeout_sleep();//没有按键,超时则休眠
        }

LaunchTasks 可以使用 switch case, 也可以使用效率更高的函数指针数组。
pangb 发表于 2013-10-5 17:43 | 显示全部楼层
有人解释一下whiele(mode1)是做什么的吗,好像是函数还是写错了;
 楼主| ousj 发表于 2013-10-5 17:43 | 显示全部楼层
好吧,我再搞一遍吧
sysdriver 发表于 2013-10-8 22:14 | 显示全部楼层
呵呵,这是我很久之前写过的帖子了。

现在看来,当时眼界太小了,这样的结构也许更好,不同的项目有不同的结构。其实程序也没占用多大,因为都是子函数。使用变量少,方便管理。大循环中包含小循环,有时候效率也许会更高,因为只需要在小范围的循环。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

712

主题

7557

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部