本帖最后由 xyz549040622 于 2012-4-15 08:52 编辑
【有点乱,以后直接截图上传清晰】
20120410群课笔记.rar
(21.56 KB)
直播开始。从今天开始讲RTOS的基础知识,课本为《嵌入式系统的实时概念》这本书。
John Lee(1513562323) 20:08:52
书在群共享第9页,倒数第3个:
John Lee<j.y.lee@yeah.net>
20:28:11
所谓外部事件,简单的说,就系统需要处理的输入,这些输入大部分是外部输入。
John Lee<j.y.lee@yeah.net>
20:29:07
这些输入,在裸奔的系统中,很多是靠循环的查询方式完成的。
John Lee<j.y.lee@yeah.net>
20:30:11
例如:
while (串口输入中断标志 == 0);
// 等待串口输入
John Lee<j.y.lee@yeah.net>
20:30:49
这个while循环,直到串口有输入时,才会结束。
John Lee<j.y.lee@yeah.net>
20:32:14
在RTOS环境中,除非万不得已,不要这样做。
John Lee<j.y.lee@yeah.net>
20:33:02
这个万不得已,有两个含义。
John Lee<j.y.lee@yeah.net>
20:34:00
1、硬件限制。
2、复杂度和运行开销权衡。
John Lee<j.y.lee@yeah.net>
20:34:47
这两个例外情况,以后会讲到的。
John Lee<j.y.lee@yeah.net>
20:35:50
一般来说,在RTOS环境中,外部事件,都需要做成“中断”输入的。
John Lee<j.y.lee@yeah.net>
20:36:56
“中断”,提供了高级任务抢占低级任务的机会。
John Lee<j.y.lee@yeah.net>
20:38:36
应用系统设计,就可以根据事件的紧急程度,利用“中断”,让能够处理紧急事件的任务,优先执行。
John?Lee<j.y.lee@yeah.net>??20:42:02
这个在下面有解释:
John Lee<j.y.lee@yeah.net>
20:43:36
只是有一点可能有些歧义:“通信是可预测的”,我觉得应该是“事件是可以预测的”。
John Lee<j.y.lee@yeah.net>
20:45:07
如果把通信理解为广义上的,所有的信息传递(包括IO等)都算“通信”,也可以。
John?Lee<j.y.lee@yeah.net>??20:46:16
然后还有一点,可能需要澄清一下。
John Lee<j.y.lee@yeah.net>
20:48:08
纯粹的处理单个事件的系统,虽然也可以称为“实时”系统,但在我们看来,这种属于裸奔就可以处理的
John Lee<j.y.lee@yeah.net>
20:48:40
与RTOS基本没有关系。
John Lee<j.y.lee@yeah.net>
20:50:49
下面几篇,说的是实时性的特点,都是些一般概念,很好理解的,大家可以自己看看。
John Lee<j.y.lee@yeah.net>
20:53:45
总之来说,“实时性”,在每个嵌入式系统中(包括所有裸奔的单片机),都是有要求的。
John Lee<j.y.lee@yeah.net>
20:55:46
但很多时候,大家(做项目时)很少谈及这个问题(有意无意地忽略了),是因为大多数系统的实时性要求较低,普通的实现都基本满足
John Lee<j.y.lee@yeah.net>
20:58:37
第2章的内容是讲嵌入式开发的一般知识,主要是开发平台方面的。
John Lee<j.y.lee@yeah.net>
20:59:21
这个与RTOS的直接关系不大
John Lee<j.y.lee@yeah.net>
21:01:09
但这些内容,从本质上说,还是很重要的,你现在可能用不着这些内容,但以后迟早会用得着的。
John Lee<j.y.lee@yeah.net>
21:03:10
第3章,到3.4之前,也是一般知识。
John Lee<j.y.lee@yeah.net>
21:05:27
其实,这些都是自然而然的过程。
John Lee<j.y.lee@yeah.net>
21:05:55
大家可能自己写程序时,都是按照这个规则来做的。
John Lee<j.y.lee@yeah.net>
21:07:53
应用程序最后初始化,是因为它的初始化过程,可能会使用到RTOS的某些功能,即,对RTOS有依赖性。
John Lee<j.y.lee@yeah.net>
21:10:01
RTOS内部,也分了很多部件模块,其中,也有一些有依赖关系,所以,需要某些模块先初始化,某些后初始化。
John Lee<j.y.lee@yeah.net>
21:12:15
下面是第4章。
John Lee<j.y.lee@yeah.net>
21:13:30
前面的也都是些一般性概念,大家随便看看即可,我们从4.3开始。
John Lee<j.y.lee@yeah.net>
21:15:31
RTOS的基础部件,包括调度器,同步对象,和一些服务。
John Lee<j.y.lee@yeah.net>
21:16:45
某些RTOS在介绍时,说基本内核只有几百字节等等,这些都是忽悠大家的。
John Lee<j.y.lee@yeah.net>
21:17:24
光内核,是无法使用的。
John Lee<j.y.lee@yeah.net>
21:18:24
基本的中断服务,也是必须的
John Lee<j.y.lee@yeah.net>
21:19:08
同步对象,严格说来,不是必须的。
John Lee<j.y.lee@yeah.net>
21:19:55
但一个没有同步对象的应用系统,也没啥实用价值
John Lee<j.y.lee@yeah.net>
21:20:45
裸奔也就行了。
John Lee<j.y.lee@yeah.net>
21:21:37
一个稍微实用一点的应用系统,至少应该包含一种同步对象。
John Lee<j.y.lee@yeah.net>
21:22:56
我的意思是,如果某位编出来的基于RTOS的应用程序中,没有使用到任何同步对象,那么这个系统,用裸奔可能更简单一些。
John Lee<j.y.lee@yeah.net>
21:26:27
调度器,是RTOS的核心。
John Lee<j.y.lee@yeah.net>
21:28:44
它使用定义好的调度算法,根据中断服务和同步原语提供的信息,决定哪些任务运行处于什么样的状态(运行、就绪、阻塞等等)。
John Lee<j.y.lee@yeah.net>
21:29:45
所谓的可调度实体,通常就是指的“任务”。
John Lee<j.y.lee@yeah.net>
21:30:41
而且rtos系统中,通常都不止一个任务。
John Lee<j.y.lee@yeah.net>
21:31:09
那么究竟需要多少任务呢?
John Lee<j.y.lee@yeah.net>
21:32:11
任务多了,资源(特别是ram)消耗太大,任务少了,可能某些事件来不及处理。
John Lee<j.y.lee@yeah.net>
21:33:20
这个需要仔细设计,好像目前市面上没有关于这方面的书。
John Lee<j.y.lee@yeah.net>
21:34:14
任务的功能设计和划分。
John Lee<j.y.lee@yeah.net>
21:35:55
关于这些,我也只是有些经验积累而已,还没有时间提升到理论层面,所以,也暂时不好给大家讲这方面的内容。
John Lee<j.y.lee@yeah.net>
21:36:47
但我是希望和大家共同讨论这些问题的。
John Lee<j.y.lee@yeah.net>
21:37:15
作为经验之谈而已。
John Lee<j.y.lee@yeah.net>
21:38:24
关于任务的设计,如果有理论,最好了,我们就直接讲理论,放之四海。
John Lee<j.y.lee@yeah.net>
21:38:46
没有理论,我们就只能讲经验。
John Lee<j.y.lee@yeah.net>
21:38:59
但讲经验,需要通过实例。
John Lee<j.y.lee@yeah.net>
21:41:50
所以,分析一些相对复杂的系统,就事论事,把它能够比较好的纳入RTOS应用,大家就可以从中吸取经验。
John Lee<j.y.lee@yeah.net>
21:43:23
接着说调度器
John Lee<j.y.lee@yeah.net>
21:43:51
调度器的基本操作之一是所谓的“任务切换”。
John Lee<j.y.lee@yeah.net>
21:44:22
任务切换,是通过上下文切换完成的。
John Lee<j.y.lee@yeah.net>
21:45:00
上下文,是指“任务”运行时的必要信息。
John Lee<j.y.lee@yeah.net>
21:45:59
把这些必要信息,保存到某处,就相当于对当前任务做了一个“快照”。
John Lee<j.y.lee@yeah.net>
21:46:41
一般也可以把上下文称为“现场”
John Lee<j.y.lee@yeah.net>
21:48:14
一般的CPU,上下文包括:所有的CPU寄存器,栈指针。
John Lee<j.y.lee@yeah.net>
21:49:17
保存的地方,一般在任务控制块(TCB)中,或者任务栈中。
John Lee<j.y.lee@yeah.net>
21:49:59
在TCB中,有一个很小的优势:位置固定。
John Lee<j.y.lee@yeah.net>
21:50:49
而在任务栈中,必须保存到任务栈顶。
John Lee<j.y.lee@yeah.net>
21:51:39
但任务栈顶,这个位置并不固定,所以,还需要保存一个此位置的“指针”到TCB中。
John Lee<j.y.lee@yeah.net>
21:53:25
TCB一般被认为是固定的。
John Lee<j.y.lee@yeah.net>
21:55:11
调度器,保存当前任务的上下文,然后再装载需要执行的任务的上下文,这个过程,就是任务切换。
John Lee<j.y.lee@yeah.net>
21:57:33
当然也有动态分配的。
John Lee<j.y.lee@yeah.net>
21:58:00
但我个人意见是:不用动态分配
|