软件结构

[复制链接]
5506|24
 楼主| ldy216 发表于 2008-1-22 16:33 | 显示全部楼层 |阅读模式
  我经过多年单片机实践经验得出:所有的逻辑可以由三大结构组成,<br />1,立即事件:就是程序必须以最快速的方式查询到,当发生什么问题,马上做什么事,一般程序较少使用这一事件,用户应当尽量避免这一事件,<br />2,中断事件:就是当中断产生后判断到发生什么事,不能在中断里做而必须到外面做的事件。<br />3,定时事件,当每过多少时间必须要做的事。<br /><br />加上程序的其它结构,构成完整的程序结构。<br />写成代码就是:<br /><br />包含文件<br />各种定义(端口,常量,位变量,数值变量,函数等)<br />void&nbsp;main(void)<br />{<br />&nbsp;&nbsp;各种初始化(特殊功能寄存器,晶振,特殊功能,定时器,AD等)<br />&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Immediate_Event();&nbsp;&nbsp;//立即事件<br />&nbsp;&nbsp;&nbsp;&nbsp;Int_Event();  //中断事件<br />&nbsp;&nbsp;&nbsp;&nbsp;Timer_Event();&nbsp;&nbsp;&nbsp;//定时事件<br />&nbsp;&nbsp;&nbsp;&nbsp;//WDT_Timer();<br />&nbsp;&nbsp;}<br />}<br />中断函数<br />功能函数<br />//End&nbsp;of&nbsp;the&nbsp;file
happystar 发表于 2008-1-22 19:33 | 显示全部楼层

谢谢LZ,可以写详细点吗

“&nbsp;&nbsp;&nbsp;Immediate_Event();&nbsp;&nbsp;//立即事件<br />&nbsp;&nbsp;&nbsp;&nbsp;Int_Event();  //中断事件<br />&nbsp;&nbsp;&nbsp;&nbsp;Timer_Event();&nbsp;&nbsp;&nbsp;//定时事件”<br />这几个时间是通过判断标志位吗?建议LZ把分别把这3种事件写出框架来,多谢!<br />
sz_kd 发表于 2008-1-22 20:35 | 显示全部楼层

同意LS说的

  
yewuyi 发表于 2008-1-23 20:05 | 显示全部楼层

估计是个热贴~~

  
mohanwei 发表于 2008-1-23 20:25 | 显示全部楼层

具体事情具体分析了,没有什么十全十美的软件架构

在单片机领域。<br /><br />“多年经验”,可能只是某一行业某一方向的多年经验……
 楼主| ldy216 发表于 2008-1-25 12:09 | 显示全部楼层

例子程序让大家看

发几个小程序供参考,产品的 <br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/20081/200812512945335.rar'>https://bbs.21ic.com/upfiles/img/20081/200812512945335.rar</a>
 楼主| ldy216 发表于 2008-1-25 12:21 | 显示全部楼层

重要申明

  第一、我发的都是某些产品的完整程序代码(不含头文件),大家不要乱散播,仅供参考。<br />  第二、这里只是粗略的讲一下,其实还有很多相关性问题,比如软件与硬件的配合问题,协议问题等。有兴趣的朋友不妨跟我讨论一下。<br />  因为最近比较闲,所以狂发贴,之前从没发过。
dld2 发表于 2008-1-25 12:41 | 显示全部楼层

如果认真说

你的立即事件没有意义。并不因为它排在前面,就能得到优先执行。
 楼主| ldy216 发表于 2008-1-25 13:19 | 显示全部楼层

立即事件是有用的

  立即事件是有用的<br />  比如你的RF以250Kbit传输数据,用UART57600bit向上位机传输数据,很明显速度不匹配,也不知道那个时候有数据来,RF和UART的缓冲区也可能大小不一样。<br />  第一步,建立RF接收缓冲<br />  第二步,用立即事件发射数据,这样不必死等,否则程序必然存在在一个各地方死等。<br />&nbsp;&nbsp;&nbsp;&nbsp;发人小测试程序过来 <br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/20081/2008125131938573.rar'>https://bbs.21ic.com/upfiles/img/20081/2008125131938573.rar</a>
simon21ic 发表于 2008-1-25 20:42 | 显示全部楼层

不是很明白

分成3个事件其实很好理解,很多人裸奔可能也差不多<br />但着3个事件的先后处理顺序是否有讲究?<br />靠前面的优势可能只是while(1)的跳转语句
HWM 发表于 2008-1-26 10:33 | 显示全部楼层

“多年单片机实践经验”?有多少年了?看不出啊,呵呵。

  
john_LIGHT 发表于 2008-1-26 11:16 | 显示全部楼层

在一个圆环里,每个点都是均等的

并不是你写起来好象靠前,它的优先级就高。<br /><br />阅读公开源码的RTOS,看看人家是如何进行调度的再说吧……
 楼主| ldy216 发表于 2008-1-29 10:41 | 显示全部楼层

这里没讨论优先级问题

  补充,前面没讨论优先级问题。<br />  优先级可以通过以下方式实现:<br />  一是通过中断优先级设置,在低优先级中断里面再产生中断,遇到没有中断优先级的CPU(比如PIC的很多型号),可以在你认为的低优先级里面,再次人为打开全局中断,让高优先级中断可以再发生,并注意保存与恢复中断现场。这种方式是最可靠的;<br />  二是任务优先级,可以在外部查询事件Int_Event里面,执行完你认为最优先的一级并返回,再次查询时执行第二优先级并返回,依此类推。这样也可以实现软件优先级,效果不错的。<br />  不过,在这种结构的支配下,一般的项目并不需要建立软件优先级,因为这种结构本身是基于多任务,面像对象的机制建立的,主程序只有十几条指令,循环非常快,(敌不动,我不动,敌一动我立即对付)。所以建立优先级没必要。<br />  除非当你遇到一个问题,比如上位机发来一条指令,让你计算一个问题,比如MD5验证,大概要运算100ms,这是一个复杂的运算问题。那么下位机主程序<br />在Int_Event()里面查询到这一事件后,一般人会立即去计算MD5,表面上看起来其他中断还能发生,但是细想一下,那些本来应该每隔1毫秒运算的事件,等这MD5运算完毕,他们应该执行过100次才对,实际上1次没执行,这显然会得到不好甚至错误的结果,解决这一问题的根本方法是任务分离技术。<br />  任务分离,就是将一个复杂的任务分成很多个子步骤,使每一个子任务的调度时间在我们的允许范围内,如果不符合可以呈树状形式展开再分,直到符合要求。实际上,我们产品的初始化过程,往往就需要这样做,这样做的好处就是,当软件上电电路稳定之后,立即可以进入主循环,不需要为了进行一系列初始化而单独写个初始化过程,使上位机通讯处于盲目状态,或称为软件的空子,软件最好不要留空子(软件的某一个时间段不能执行某些合法操作,因为软件长时间滞留在一个地方,比如大循环,多重循环)。举个例子,比如QQ等软件,如果我来做,软件介面可以马上出现,因为那些初始化过程对用户来说,只是后台问题,当用户看到鼠标繁忙时间比较长时,那么会感觉郁闷。<br /><br />  任务分离举例,比如大循环(for(i=0;i&lt100;i++),你可以用一个变量Index,每过一定时间比如1毫秒,Index++,执行这个for循环里面的内容,并将For循环里面的所有i变量替换成Index,这样一来原本可能要用5毫秒运算的问题,现在分成100份,每份平均50us,每过1毫秒执行一个单步花50us,100毫秒之后任务解决完毕,在执行这一任务期间,其他主程序任务也会及时得到执行。显然通过这种方法,CPU利用率显著下降。注意任务分离最重要的是把握好度,任务块的大小,每过多少时间去执行任务块,如果任务非常紧急,那么必须把子任务块安排在立即事件(Immediate_Event())里面做。这个问题也回答了有些朋友说立即事件没有用的问题。<br />  <br /><br /><br />  <br /><br />
lxlfriend 发表于 2008-1-31 14:53 | 显示全部楼层

软件结构

好帖子,期待更多高人的看法
gooog 发表于 2008-1-31 16:19 | 显示全部楼层

ldy216说的方法是一般裸奔的通用方法

  
高勇 发表于 2008-2-1 11:05 | 显示全部楼层

好方法

好方法。
hsw_21 发表于 2008-2-1 22:00 | 显示全部楼层

软件中的艺术,值得讨论和研究!

  
xwj 发表于 2008-2-1 22:27 | 显示全部楼层

呵呵,LZ顶楼的结构,岂不是优先级都是一样的了?

明显是举例不当啊<br /><br />按我的想法,类似的分类应该是这样的:<br />1,立即事件:必须得马上处理得,不然就会丢失<br />--中断中立即处理<br /><br />2,中断可延迟事件:中断触发,但容许下次触发前任意时间处理得<br />--中断后做标志,释放优先权,主循环中查询到标志再处理<br /><br />3,定时事件:当每过多少时间必须要做的事。但也分立即处理和延迟处理的,并入1、2类中<br /><br />4,慢速处理、可有可无可快可慢的,放主循环中<br />--不过通常是NOP或Sleep,因为一般程序都是时间处理类的,要有事才会忙活啊<br />--定时间隔处理的同样也是事件处理,肯定是并入1、2类中的<br />
aweyfan 发表于 2008-2-2 09:09 | 显示全部楼层

立即事件 应当放到中断中执行

  
1314lys 发表于 2008-2-2 16:04 | 显示全部楼层

学习!

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

193

帖子

1

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