打印
[程序源码]

求教程序架构,望吐槽

[复制链接]
3194|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
langgao183|  楼主 | 2014-12-13 09:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
个位牛人,我的程序大小在8k以下,芯片8位。实时性一般。
我这样的程序没有架构,没有那么严谨,全局变量满天飞,变量的命名不统一。我想进一步提高自己的编程水平,但却不知如何下手。望指教。
unsigned char LED_Data[3] 
unsigned char KeyMode
unsigned char SysMode

void main(void)
{
  init();
  while(1)
  {
      if(Timer1_10ms ==0)     
      {
          Timer1_10ms = 10;
          Key_Process();
      }
      if(Timer2_4ms ==0)
      {
          Timer_4ms = 4;
          LED_Process();
      }
      if(Timer3_10ms ==0)
      {
          Timer3_10ms = 10;
          TimerEven();
      }

  }
}

void TimerEven(void)
{
  //10ms以上间隔处理的事情,放在这里
   Sys_Process();
   .
   .
   .
   .
  return;
}


void Key_Process(void)
{
   //读取按键
   //按键滤波
   //按键执行
  return;
}

void Sys_Process(void)
{
   //系统故障处理
   //根据温度湿度判断运行模式

  return;
}

//LED.C
void LED_Process(void)
{
   //扫描控制  

   LED_Data[1] = 0;//数码管
   LED_Data[0] = 0;//数码管

   LED_Data[2] = 0;//led灯



  //刷新数据
  if(SysMode ==0)          LED_Data[3] |=0x01; //led1亮
  else if(SysMode ==0)     LED_Data[3] |=0x02; //led2亮
  .........
  

  switch(KeyMode)
  {
      case 0:break;//显示正常数据 环境温度
      case 1:break;//显示调节设定温度
      case 2:break;//显示调节...........
        .
        .
        .
  }

  //闪烁控制

  //送显示

  return;
}

相关帖子

沙发
ayb_ice| | 2014-12-13 10:48 | 只看该作者
还行吧

Timer1_10ms变量的重新赋值可以统一处理,
另外按键处理放在按键扫描里其实不好,除非按键在任何时候功能都统一,但事实并不是这样的,在不同的功能任务下按键的功能是不同的,这需要把按键处理程序放在功能任务中,这样直观,便于维护,而且你放在那个位置不能处理局部变量,只能用全局变量传递信息,放在单个任务中则好处多多

使用特权

评论回复
板凳
NE5532| | 2014-12-13 16:16 | 只看该作者
还可以啊,楼主要提高程序水平,只需要把需求分析和模块化做好就可以了,其实跟搞其他设计的原理是相通的。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
icegoat + 1 程序模块化很重要~
地板
daibumeikuai| | 2014-12-13 21:37 | 只看该作者
比我强多了。

使用特权

评论回复
5
langgao183|  楼主 | 2014-12-15 10:06 | 只看该作者
NE5532 发表于 2014-12-13 16:16
还可以啊,楼主要提高程序水平,只需要把需求分析和模块化做好就可以了,其实跟搞其他设计的原理是相通的。 ...

谢谢指教,模块与模块之间有很多全局变量联系着,这样导致全局变量满天飞。所以请教该如何避免全局变量?

使用特权

评论回复
6
langgao183|  楼主 | 2014-12-15 10:06 | 只看该作者
ayb_ice 发表于 2014-12-13 10:48
还行吧

Timer1_10ms变量的重新赋值可以统一处理,

请教,该如何避免全局变量满天飞的现象

使用特权

评论回复
7
sedatefire| | 2014-12-15 10:38 | 只看该作者
这不就是在召唤我吗
1. 10ms级别内的东西   你干脆直接挂中断吧  但要剥离重要的东西   不要运行时间太久了
2. 目测你要引入事件队列的机制。
3. 全局变量不要extern出去,内部static定义,用函数,开出只读权限就好。
   如果外面一定要写权限,那估计是模块的边界你没有理清楚。做个函数,收进来。
   边界定义清楚的模块,其全局变量,在哪个.c定义,就在哪个.c里面读写。


   

使用特权

评论回复
8
wyq165| | 2014-12-15 11:42 | 只看该作者
刚刚完成了一个项目,对自己的架构也不是很满意,全局变量也很多,总体感觉各模块纠缠过多,说说自己的感受
一直都在注意程序的架构,好的架构,无论是改进功能和维护都是很舒服的。可惜此次结果不尽人意。
发现了几个问题:
首先.因为时间很紧,一个月加一周多的时间。代码编写加测试到成型。而我也没能做好准备,项目需求没有做好。基本是边分析边编写,这就导致了写到最后出现:这个功能不完整,那个业务不严谨,那就得改,就得“缝缝补补”,这样就导致开局的时候还可以,但是到项目后期全局变量运用就不怎么合理。这方面虽然自己注意到了,但是无可奈何。慢工出细活,快也有快的代价。
  所以开始项目之前不能着急进度,要将业务的流程分析透。不管老板多催,该怎样做的还是怎样做。因为老板毕竟不是技术人员,为了控制成本和结果,不会考虑到编程的细节。 后期的“缝缝补补”,会导致原本坐落有致的程序模块纠缠起来。
  其次.全局变量个人觉得是不可少的。关键是要注意怎样定义一个全局变量的用途。功能和用途确定以后,全局变量才不会显得滥用。
  再次.全局变量也要“分组”,将同样属性的变量定义在一起,如将系统参数这类各模块都需要使用的变量,用结构体定义起来,才会显得全局变量多而不乱。
  再次.命名规范之类的,网上有周立功或华为的编程规范,下回来看看。 还有一本书 书名忘了 大概是嵌入式设计模式 之类的书。里面描述一些常用的架构,和总结了一些架构,很实用。

其次.全局变量不可避免也是程序中必须的。没必要苛求零全局。有一种感受


其次.

使用特权

评论回复
9
ayb_ice| | 2014-12-15 11:46 | 只看该作者
langgao183 发表于 2014-12-15 10:06
请教,该如何避免全局变量满天飞的现象

各功能做成模块驱动,对外通过API联系,变量根本不对外开放,外部都不知道有哪些变量

使用特权

评论回复
10
cjseng| | 2014-12-15 11:55 | 只看该作者
随便借楼主的宝地问一句:变量名用拼音写行不行?嘿嘿!
比如,State_Djs,我定义的是倒计时状态,感觉有点怪怪的,有点中西合璧的味道。

使用特权

评论回复
11
排山倒海| | 2014-12-15 12:57 | 只看该作者
留标记关注。

使用特权

评论回复
12
langgao183|  楼主 | 2014-12-15 13:48 | 只看该作者
sedatefire 发表于 2014-12-15 10:38
这不就是在召唤我吗
1. 10ms级别内的东西   你干脆直接挂中断吧  但要剥离重要的东西   不要运行时间太久了 ...

谢斑竹.1、我不喜欢在中断里执行任务,除非需要及时和时间精确的,个个习惯把。                                      
       2、事件队列的机制用的比较少。
       3、这点是我想了很久但是没有实现的,例如;上面提到的keymode,这是按键改变按键模式的,显示的时候根据keymode的不同显示不同数据和不同闪烁时间,这个时候还要来个单独读取keymode的函数吗?这样不是反而增加了函数的代码吗?增加了单片机执行的时间吗?

使用特权

评论回复
13
langgao183|  楼主 | 2014-12-15 13:51 | 只看该作者
cjseng 发表于 2014-12-15 11:55
随便借楼主的宝地问一句:变量名用拼音写行不行?嘿嘿!
比如,State_Djs,我定义的是倒计时状态,感觉有点 ...

我的命名也很乱,没有统一

使用特权

评论回复
14
langgao183|  楼主 | 2014-12-15 13:57 | 只看该作者
wyq165 发表于 2014-12-15 11:42
刚刚完成了一个项目,对自己的架构也不是很满意,全局变量也很多,总体感觉各模块纠缠过多,说说自己的感受 ...

我的情况跟你很类似,全局满天下,后期的增加或者更改功能都是牵一发而动全身,很不好改。

使用特权

评论回复
15
wyq165| | 2014-12-15 14:22 | 只看该作者
langgao183 发表于 2014-12-15 13:57
我的情况跟你很类似,全局满天下,后期的增加或者更改功能都是牵一发而动全身,很不好改。 ...

我觉得就是开始写的时候。
对项目的整体流程和细节掌握得不够,才会乱。

使用特权

评论回复
16
大道至简| | 2014-12-15 15:52 | 只看该作者
全局变量满天飞
全局变量,这样的代码可维护性很差的,软件写大了,自己脑子就浆糊了

使用特权

评论回复
17
langgao183|  楼主 | 2014-12-15 21:28 | 只看该作者
大道至简 发表于 2014-12-15 15:52
全局变量满天飞
全局变量,这样的代码可维护性很差的,软件写大了,自己脑子就浆糊了 ...

望斑竹指教,该如何去避免?能给个例子吗?

使用特权

评论回复
18
cuilaiabc| | 2014-12-15 22:17 | 只看该作者
还可以啦。继续努力。

使用特权

评论回复
19
sedatefire| | 2014-12-16 10:55 | 只看该作者
wyq165 发表于 2014-12-15 11:42
刚刚完成了一个项目,对自己的架构也不是很满意,全局变量也很多,总体感觉各模块纠缠过多,说说自己的感受 ...

点个赞吧

使用特权

评论回复
20
sedatefire| | 2014-12-16 11:02 | 只看该作者
wyq165 发表于 2014-12-15 11:42
刚刚完成了一个项目,对自己的架构也不是很满意,全局变量也很多,总体感觉各模块纠缠过多,说说自己的感受 ...

全局变量是不可避免的,这个结论是正确的。
但要尽量做到,零“跨模块全局变量”,不要extern, just static
跨模块全局变量的多寡,可以衡量软件分层的合理性


使用特权

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

本版积分规则

23

主题

112

帖子

1

粉丝