FreeRTOS技术文档
- 格式:doc
- 大小:73.00 KB
- 文档页数:5
FreeRTOS的学习成果报告
一. RTOS基本原理:多任务和调度
多任务(Multitasking)
在一个操作系统内部,内核[kernel]是最核心的部件。像Linux那样的操作系统使用的内核,从表面上看(seemingly),允许用户并发(simultaneously)访问 计算机。多个用户似乎(apparently)可以并行(concurrently)执行多个程序。
在操作系统的控制下,每个正在执行的程序就是一个任务[task]。如果一个操作系统能够以这种方法执行多个任务,这就叫做多任务[multitasking].
多任务操作系统的使用可以简化应用程序的设计:
1. 操作系统的多任务和任务间通信的机制允许复杂的应用程序被分成一系列更小的和更多的可以管理的任务。
2. (程序的)划分(partitioning)让软件测试更容易, 团队工作分解(work
breakdown within teams),也有利于代码复用。
3. 复杂的定时和先后顺序的细节 可以从应用程序代码中 删除。(因为)这成为操作系统的职责。
多任务Vs 并发
传统的(conventional)的处理器同时只能执行一个任务。但通过快速的任务切换,一个多任务操作系统可以使它看起来(appear)好像每个任务并行执行一样。这可以下面的示意图来描述(depicted)。它显示了有关(with respect to)时间的3个任务的执行模式。任务名用颜色标注出来,写在左手边。时间从左到右增加,相应的颜色的线条显示该任务在某个特殊时间正在执行。上面的图 演示的是用户所觉察到的并行执行模式,下面的图是实际的多任务执行模式。
----所有可用的任务都好像在执行,但实际上在任何一个时刻都只有一个任务在执行
调度
调度器(scheduler)是内核中负责 决定在某个特殊时间 哪个任务应该执行的部分。内核可以在任务的生命期(lifetime) 挂起(suspend) / 恢复(resume)一个任务许多次。
调度策略(scheduling policy)是调度器用来决定哪个任务在哪个时间点执行的算法。一个(非实时)多用户系统的策略很可能分配(allow)给每个任务一个"公平" (fair)的处理器时间片(proportion of processor time)。用在实时系统/嵌入式系统的策略稍后再描述。
除了被RTOS内核无意的挂起外,一个任务还可以自己挂起自己。如果一个任务想延迟一段固定的时间(也就是sleep),或者等待(也就是 block)某个资源可用(比如一个串口),或者等待一个事件出现(比如一个键按下)。一个阻塞或者睡眠的任务是不能执行的,不会为它分配任何处理时间。
上图中提到的编号:
1) Task1正在运行
2) 内核挂起Task1
3) 恢复任务Task2
4) Task2正在执行,为独占访问(exclusive access),它锁定一个处理器外设
5) 内核 挂起Task2
6) 恢复Task3
7) Task3试图访问同样的处理器外设,发现它被锁定,Task3不能继续,所以自己挂起自己。
8) 内核恢复Task1
………….
9) 接下来(the next time),Task2在9处执行。它完成了对处理器外设的访问,所以解锁它
10) 再下来,Task3在10处执行。它发现 现在可以访问处理器外设了,于是开始执行,直到被内核挂起。
二.FreeRTOS基础
FreeRTOS,它目前实现了一个微内核,并且port到arm7, avr, pic18, coldfire等众多处理器上;目前已经在rtos的市场上占有不少的份额。它当然不是一个与vxworks之类的rtos竞争的操作系统,它的目标在 于低性能小RAM的处理器上。整个系统只有3个文件,外加上port的和处理器相关的两个文件,实现是很简洁的。与ucosii不同,它是free的,ucosii不是free的,虽然它的代码是公开的。FreeRTOS提供的功能包括:
① 任务管理、
② 时间管理、
③ 信号量、
④ 消息队列、
⑤ 内存管理、
⑥ 记忆功能。
FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、 优先级最高的任务先运行。FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。这一点是和ucosii不同的。
另外freertos既可以配置为可抢占内核也可以配置为不可抢占内核。当FreeRTOS被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU使用权,这样可保证系统满足实时性的要求;当FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU的使用权后才能获得运行,这 样可提高CPU的运行效率。
三 .FreeRTOS操作系统的原理与实现
1.任务管理
freertos与ucosii不同,它的任务控制块并不是静态分配的,而是在创建任务的时候动态分配。另外,freertos的优先级是优先级数越大优先级越高,和ucosii正好相反。任务控制块中也没有任务状态的成员变量,这是因为freertos中的任务总是根据他们的状态连入对应的链表,没有必要在任务控制块中维护一个状态。此外freertos对任务的数量没有限制,而且同一个优先级可以有多个任务。
一个任务可以是以下几种状态中的一种:
运行
正在执行的任务就是处于运行状态,它占用了处理器。
就绪
就绪的任务是那些可以执行(没有被阻塞或暂停),但是因为其他相同或更高优先级任务正在运行造成还没有运行的任务。
阻塞
当一个任务等待临时事件或外部事件时它就是处于阻塞状态。例如,任务调用
vTaskDelay() ,它将被阻塞(置为阻塞状态)直到超过延时时间 - 一个临时事件。任务也可以阻塞等待队列和信号事件。阻塞状态的任务一般有一个超时时间,超时后任务将解锁。阻塞的任务不会参与调度。
暂停
暂停状态的任务也不参与调度。任务只有在调用 API 函数 vTaskSuspend() 和
xTaskResume() 时才会进入或者退出暂停状态。它不能指定超时时间。
有效的任务状态转换
先看任务创建
pvTaskCode---任务函数名称
** pcName---任务名字,可选
**ucStackDepth---任务堆栈的深度,即大小
** pvParamenters---参数,即传给任务函数的参数,所有的任务函数原型是void task (void *pvParameters)
** uxPriority—任务优先级
** pxCreatedTask—可选,通过它返回被创建任务的tcb
再看任务删除。
freertos的任务删除分两步完成,第一步在vTaskDelete中完成,FreeRTOS先把要删除的任务从就绪任务链表和事件等待链表中删除,然后把此任务添加到任务删除链表(即那个xTasksWaitingTermination),若删除的任务是当前运行任务,系统就执行任务调度函数.第2步则是在idle任务(空闲任务)任务运行时,检查xTasksWaitingTermination链表,如果有任务在这个表上,释放该任务占用的内存空间,并把该任务从任务删除链表中删除。 调度器的禁止和打开
这是一种同步机制,比关中断要温和点。禁止调度由vTaskSuspendAll实现,打开调度由xTaskResumeAll实现
任务挂起与唤醒
freertos的任务关起与ucosii也不大一样。它把所有挂起的任务加到xSuspendedTaskList中,而且一旦调用vTaskSuspend()函数挂起一个任务,该任务就将从所有它原先连入的链表中删除(包括就绪表,延时表和它等待的事件链表),也就是说,和 ucosii不同,一旦一个任务被挂起,它将取消先前它的延时和对事件的等待。ucosii中是不同的,在ucosii里面一个任务被挂起仅仅是把任务的状态或上一个OS_STAT_SUSPEND并从就绪表中删除,如果先前这个任务正在等待某事件,则并不取消等待。
相反的唤醒就是把任务从xSuspendedTaskList中删除,加到对应的就绪链表中(根据任务的优先级),然后如果唤醒的任务优先级高于当前任务优先级,则调度。
任务调度
freertos支持多个任务具有相同的优先级,因此,当它被配置为可抢占内核时,调度算法既支持基于优先级的调度,也支持时间片轮流调度。任何时候调度器运行时它都选择处于就绪状态下的优先级最高的那个任务;如果有多个任务处于同一优先级,则freertos每个时钟节拍的中断服务程序中,将对这些任务应用换调度算法轮流执行这些任务。
系统用uxTopReadyPriority全局变量记录当前处于就绪态的任务的最高优先级。调度的时候就根据这个uxTopReadyPriority直接找到就绪链表中pxReadyTasksLists[ uxTopReadyPriority ]的任务,进行运行。
一个任务可以通过调用taskYIELD()让出cpu,从而调度令一个任务运行。它的实现如下:
#define taskYIELD() portYIELD()
而portYIELD()是一个体系结构相关的函数,对于不同的mcu需要实现这么一个函数完成调度。