打印

软件结构

[复制链接]
4146|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ldy216|  楼主 | 2008-1-22 16:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  我经过多年单片机实践经验得出:所有的逻辑可以由三大结构组成,
1,立即事件:就是程序必须以最快速的方式查询到,当发生什么问题,马上做什么事,一般程序较少使用这一事件,用户应当尽量避免这一事件,
2,中断事件:就是当中断产生后判断到发生什么事,不能在中断里做而必须到外面做的事件。
3,定时事件,当每过多少时间必须要做的事。

加上程序的其它结构,构成完整的程序结构。
写成代码就是:

包含文件
各种定义(端口,常量,位变量,数值变量,函数等)
void main(void)
{
  各种初始化(特殊功能寄存器,晶振,特殊功能,定时器,AD等)
  while(1)
  {
    Immediate_Event();  //立即事件
    Int_Event();  //中断事件
    Timer_Event();   //定时事件
    //WDT_Timer();
  }
}
中断函数
功能函数
//End of the file

相关帖子

沙发
happystar| | 2008-1-22 19:33 | 只看该作者

谢谢LZ,可以写详细点吗

“   Immediate_Event();  //立即事件
    Int_Event();  //中断事件
    Timer_Event();   //定时事件”
这几个时间是通过判断标志位吗?建议LZ把分别把这3种事件写出框架来,多谢!

使用特权

评论回复
板凳
sz_kd| | 2008-1-22 20:35 | 只看该作者

同意LS说的

使用特权

评论回复
地板
yewuyi| | 2008-1-23 20:05 | 只看该作者

估计是个热贴~~

使用特权

评论回复
5
mohanwei| | 2008-1-23 20:25 | 只看该作者

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

在单片机领域。

“多年经验”,可能只是某一行业某一方向的多年经验……

使用特权

评论回复
6
ldy216|  楼主 | 2008-1-25 12:09 | 只看该作者

例子程序让大家看

发几个小程序供参考,产品的
相关链接:https://bbs.21ic.com/upfiles/img/20081/200812512945335.rar

使用特权

评论回复
7
ldy216|  楼主 | 2008-1-25 12:21 | 只看该作者

重要申明

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

使用特权

评论回复
8
dld2| | 2008-1-25 12:41 | 只看该作者

如果认真说

你的立即事件没有意义。并不因为它排在前面,就能得到优先执行。

使用特权

评论回复
9
ldy216|  楼主 | 2008-1-25 13:19 | 只看该作者

立即事件是有用的

  立即事件是有用的
  比如你的RF以250Kbit传输数据,用UART57600bit向上位机传输数据,很明显速度不匹配,也不知道那个时候有数据来,RF和UART的缓冲区也可能大小不一样。
  第一步,建立RF接收缓冲
  第二步,用立即事件发射数据,这样不必死等,否则程序必然存在在一个各地方死等。
    发人小测试程序过来
相关链接:https://bbs.21ic.com/upfiles/img/20081/2008125131938573.rar

使用特权

评论回复
10
simon21ic| | 2008-1-25 20:42 | 只看该作者

不是很明白

分成3个事件其实很好理解,很多人裸奔可能也差不多
但着3个事件的先后处理顺序是否有讲究?
靠前面的优势可能只是while(1)的跳转语句

使用特权

评论回复
11
HWM| | 2008-1-26 10:33 | 只看该作者

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

使用特权

评论回复
12
john_LIGHT| | 2008-1-26 11:16 | 只看该作者

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

并不是你写起来好象靠前,它的优先级就高。

阅读公开源码的RTOS,看看人家是如何进行调度的再说吧……

使用特权

评论回复
13
ldy216|  楼主 | 2008-1-29 10:41 | 只看该作者

这里没讨论优先级问题

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

  任务分离举例,比如大循环(for(i=0;i<100;i++),你可以用一个变量Index,每过一定时间比如1毫秒,Index++,执行这个for循环里面的内容,并将For循环里面的所有i变量替换成Index,这样一来原本可能要用5毫秒运算的问题,现在分成100份,每份平均50us,每过1毫秒执行一个单步花50us,100毫秒之后任务解决完毕,在执行这一任务期间,其他主程序任务也会及时得到执行。显然通过这种方法,CPU利用率显著下降。注意任务分离最重要的是把握好度,任务块的大小,每过多少时间去执行任务块,如果任务非常紧急,那么必须把子任务块安排在立即事件(Immediate_Event())里面做。这个问题也回答了有些朋友说立即事件没有用的问题。
  


  

使用特权

评论回复
14
lxlfriend| | 2008-1-31 14:53 | 只看该作者

软件结构

好帖子,期待更多高人的看法

使用特权

评论回复
15
gooog| | 2008-1-31 16:19 | 只看该作者

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

使用特权

评论回复
16
高勇| | 2008-2-1 11:05 | 只看该作者

好方法

好方法。

使用特权

评论回复
17
hsw_21| | 2008-2-1 22:00 | 只看该作者

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

使用特权

评论回复
18
xwj| | 2008-2-1 22:27 | 只看该作者

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

明显是举例不当啊

按我的想法,类似的分类应该是这样的:
1,立即事件:必须得马上处理得,不然就会丢失
--中断中立即处理

2,中断可延迟事件:中断触发,但容许下次触发前任意时间处理得
--中断后做标志,释放优先权,主循环中查询到标志再处理

3,定时事件:当每过多少时间必须要做的事。但也分立即处理和延迟处理的,并入1、2类中

4,慢速处理、可有可无可快可慢的,放主循环中
--不过通常是NOP或Sleep,因为一般程序都是时间处理类的,要有事才会忙活啊
--定时间隔处理的同样也是事件处理,肯定是并入1、2类中的

使用特权

评论回复
19
aweyfan| | 2008-2-2 09:09 | 只看该作者

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

使用特权

评论回复
20
1314lys| | 2008-2-2 16:04 | 只看该作者

学习!

使用特权

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

本版积分规则

21

主题

124

帖子

1

粉丝