Chinaunix首页 | 论坛 | 博客
  • 博客访问: 71027
  • 博文数量: 25
  • 博客积分: 880
  • 博客等级: 准尉
  • 技术积分: 245
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-05 10:27
文章分类

全部博文(25)

文章存档

2011年(1)

2009年(2)

2008年(22)

我的朋友

分类: C/C++

2008-07-05 10:55:51

读书笔记:《Embedded C》 by Michael J.Pont Translated by 陈继辉(《C语言嵌入式系统开发》)
第六章:满足实时性的限制条件
1.软件循环延时的缺陷:
软件循环的延时程序举例:
void DELAY_LOOP_Wait(const unsigned int DELAY)
{
 unsigned int x,y;
 for(x=0;x<=DELAY;x++)
  {
   for(y=0;y<=120;y++);
  }
}
(1)软件循环实现的延时不精确,需要采用硬件定时器。软件循环的延时只是适用于对于延时要求不精确的场合。
(2)本程序循环延时的时候,CPU就是在做这个循环,并且CPU被占用而未去执行其他的操作,所以这本身是在浪费CPU的时间,引入嵌入式操作系统可以解决这个问题,实际上是引入多线程机制。
2.创建可移植的硬件延时
不 论什么应用场合,我们总是希望软件有更好的可移植性。对于嵌入式系统中的延时程序而言,相同的代码如果使用不同的硬件环境,就会产生不同的延时时间。针对 此类问题,本书中介绍的代码设计尽可能易移植,在实践中这意味着定时器的初始值“自动”由不同的处理器及振荡器组合所决定,方法是使用项目头文件 (Main.H),以及适当的采用一些C语言的预处理指令。

第七章:创建嵌入式操作系统
1.嵌入式系统常采用超级循环结构(也就是死循环),因为系统一经上电,程序就要执行,而且一直执行,循环执 行,这里特别注意main(),程序入口自然是main(),不过程序在执行完main()之后是不会停止的(尽限在嵌入式应用无操作系统的情况),这样 main()函数里的语句就被循环的执行下去,这会产生灾难性的结果,例如,我在做液晶初始化的时侯,未加入超级循环,结果程序就不停的在重复着初始化界 面,也就是main()一直在执行,采用超级循环结构也就是使得程序永远不要跳出main(),这样也就不会出现main()被一直执行的情 况。
2.超级循环的优点:易于理解,并且实际上没有消耗系统内存和资源。
3.超级循环结构的缺陷:
例如下面的循环:
while(1)
{
 X();
}
这个循环就很难在精确的时间间隔内执行X(),然而在很多的应用场合,我们需要精确的时间间隔,例如:显示器必须每秒刷新四十次,车辆当前的速度必须每0.5s测量一次等.
一种改进是:
while(1)
{
 X();
 Delay_50ms();
}
这个程序只有在假设
(1)知道X()精确的执行时间
(2)持续时间不变
的情况下才是适用的。
实际应用中,确定程序的执行时间比较复杂,这需要假定程序执行的是简单的函数,且不与外界交互,而只是做内部运算。即使在这样严格的条件下,编译器优化设置的变化也可能改变函数的执行速度,这使得时间调节既麻烦又易错。
而第二个条件就更难满足了,嵌入式应用得函数常常要求与外界以复杂得方式交互,这种情况下函数的执行时间将随外界活动的不同而变化,编程者对此很难控制
另外,这个程序还在大大的浪费CPU的时间,效率极低。
4.如何解决超级循环结构的这个缺陷?
采用中断,既周期性的执行函数又不浪费CPU的时间。对于51系列,定时器2的中断是经常采用的。
5.任务:通常用来指周期性执行的函数:对于sEOS,我们通常可以控制单个任务的执行时间,这个过程叫做任务调度。任务将由中断服务例程实现(或被调用):ISR将轮流的被定时器溢出所调用。注意:为满足应用程序的需要,任务会调用其他函数。
6. 时间触发VS事件触发:时间触发也就是以一定的时间间隔触发,并且函数会在预定的时间内启动,事件触发则要依靠中断,事件触发系统架构通常需要提供很多中 断服务程序。时间触发在很多对于安全性要求较高的工业领域用的很多,例如:航天,汽车工业。时间触发被安全性要求较高的系统使用是因为它有很高的可预测 性。
嵌入式程序员有一个共同的错误观念:就是中断事件不会丢失,这并不对,如果多个中断源可能在“随机”的时间间隔出现,中断响应就有可能丢失: 其实,在有几个起作用的中断源的地方,创建能对付所有可能中断组合的正确代码实际上是不可能的。处理这种多个事件同时发生的情况会增加系统的复杂性,也减 少了在所有环境下事件出发嵌入式系统应用的可预测性,相反,对于时间触发,设计者能够保证在同一时间内只处理一个事件,以精心控制的顺序一个一个的进行处 理。
7.合作式调度VS抢占式调度(时间分片式):
所谓合作式调度,意味着任务一旦被启动,则将会一直运行直到被完成,既OS不会打断正 在进行的任务,这就是单任务操作系统的设计方法。所谓抢占式调度,任务1运行一段时间后转到任务2,任务2运行一段时间之后又回到任务1,如此这般。从用 户角度,像是同时运行多个任务。合作式调度可预测性好,简单,不过多任务系统适于复杂应用。我的理解:如果可以用单任务系统,自然是好,不过在众多场合, 多任务系统是必须的。
8.可靠性:
简单、可预测性好、时间触发的特性、合作式调度,这些方法在安全相关的应用中是通常的选择。

阅读(1759) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~