嵌入式实时系统FreeRTOS培训课件

上传人:youn****329 文档编号:130050997 上传时间:2020-04-24 格式:PPT 页数:152 大小:3.29MB
返回 下载 相关 举报
嵌入式实时系统FreeRTOS培训课件_第1页
第1页 / 共152页
嵌入式实时系统FreeRTOS培训课件_第2页
第2页 / 共152页
嵌入式实时系统FreeRTOS培训课件_第3页
第3页 / 共152页
嵌入式实时系统FreeRTOS培训课件_第4页
第4页 / 共152页
嵌入式实时系统FreeRTOS培训课件_第5页
第5页 / 共152页
点击查看更多>>
资源描述

《嵌入式实时系统FreeRTOS培训课件》由会员分享,可在线阅读,更多相关《嵌入式实时系统FreeRTOS培训课件(152页珍藏版)》请在金锄头文库上搜索。

1、嵌入式实时系统 FreeRTOS 1 FreeRTOS简介 FreeRTOS是一个嵌入式系统使用的开源实时系统 FreeRTOS小巧 简单 易用 能支持许多不同硬件架构以及交叉编译器 此系统可以免费进行商业应用 被大量公司与科研公司用于嵌入式产品的开发 支持的处理器架构 ARM7 ARM9 COLTEX m3 AVR PIC等 1 FreeRTOS简介 实时 RT 软实时 按照任务的优先级 尽可能快地完成操作即可 硬实时 硬实时要求在规定的时间内必须完成操作 1 FreeRTOS简介 系统基本架构其代码可以分解为三个主要区块 任务通讯硬件接口 任务 大约50 的FreeRTOS的核心代码 1

2、FreeRTOS简介 通讯 大约40 的FreeRTOS核心代码是用来处理通讯的 任务和中断使用队列互相发送数据 并且使用信号灯和互斥来发送临界资源的使用情况 硬件接口 大约有6 的FreeRTOS的核心代码 在硬件无关的FreeRTOS内核与硬件相关的代码间扮演着垫片的角色 2 任务简介 2 1任务函数任务是由C语言函数实现的 任务函数其必须返回void 而且带有一个void指针参数 其函数原型参见程序清单1 voidATaskFunction void pvParameters 程序清单1任务函数原型 2 1任务函数 注意事项 FreeRTOS任务不允许以任何方式从实现函数中返回 它们绝不

3、能有一条 return 语句 也不能执行到函数末尾 如果一个任务不再需要 可以显式地将其删除 voidvTaskDelete xTaskHandlepxTaskToDelete 2 1任务函数 创建任务 创建任务使用FreeRTOS的API函数xTaskCreate 程序清单2 2 1任务函数 参数介绍 pvTaskCode一个指向任务的实现函数的指针 效果上仅仅是函数名 pcName具有描述性的任务名 这个参数不会被FreeRTOS使用 其只是单纯地用于辅助调试 usStackDepth当任务创建时 内核会分为每个任务分配属于任务自己的唯一状态 usStackDepth值用于告诉内核为它分配

4、多大的栈空间 这个值指定的是栈空间可以保存多少个字 word 而不是多少个字节 byte 比如说 如果是32位宽的栈空间 传入的usStackDepth值为100 则将会分配400字节的栈空间 100 4bytes 参数 pvParameters任务函数接受一个指向void的指针 void pvParameters的值即是传递到任务中的值 uxPriority指定任务执行的优先级 优先级的取值范围可以从最低优先级0到最高优先级 configMAX PRIORITIES 1 configMAX PRIORITIES是一个由用户定义的常量 pxCreatedTask用于传出任务的句柄 这个句柄将在

5、API调用中对该创建出来的任务进行引用 比如改变任务优先级 或者删除任务 如果应用程序中不会用到这个任务的句柄 则pxCreatedTask可以被设为NULL 返回值有两个可能的返回值 1 pdTRUE表明任务创建成功 2 errCOULD NOT ALLOCATE REQUIRED MEMORY由于内存堆空间不足 FreeRTOS无法分配足够的空间来保存任务结构数据和任务栈 因此无法创建任务 第五章将提供更多有关内存管理方面的信息 2 1任务函数 例1 创建任务本例演示了创建并启动两个任务的必要步骤 两个任务内容 周期性地打印输出字符串 两者在创建时指定了相同的优先级 任务一 周期性输出 T

6、ask1isrunning r n 任务二 周期性输出 Task2isrunning r n main 函数 简单地创建这两个任务 然后启动调度器 运行结果 图一 2 1任务函数 任务分配分析 图2中看到两个任务在同时运行 事实上这两个任务由于优先级相同 而且在一个处理器上运行 其实是在交替运行 真实的执行流程所图3所示 2 1任务函数图二 2 1任务函数 上例中main 函数在启动调度器之前先完成两个任务的创建 当然也可以从一个任务中创建另一个任务 我们可以先在main 中创建任务1 然后在任务1中创建任务2 这样需要在任务一中添加以下语句 xTaskCreate vTask2 Task2

7、1000 NULL 1 NULL 2 1任务函数 关于使用xTaskCreate 时任务函数的参数问题例1中的两个任务几乎完全相同 唯一的区别就是打印输出的字符串 这种重复性可以通过创建同一个任务代码的两个实例来去除 这时任务参数就可以用来传递各自打印输出的字符串 我们仍然调用两次xTaskCreate 但其pvParameters 第四个 参数变为了两个不同的指针 两个指针分别指向各自需要打印输出的文本 2 2任务调度 任务的调度方法 通过对任务设置优先级进行优先级抢占式调度 每个任务都赋予了一个优先级 每个任务都可以存在于一个或多个状态 在任何时候都只有一个任务可以处于运行状态 调度器总是

8、在所有处于就绪态的任务中选择具有最高优先级的任务来执行 2 2任务调度 优先级 xTaskCreate API函数的参数uxPriority 即第五个参数 为创建的任务赋予了一个初始优先级 常量configMAX PRIORITIES在 FreeRTOSConfig h文件中 的值 即是系统最多可具有的优先级数目 0到 configMAX PRIORITES 1 函数优先级可以调用vTaskPrioritySet API函数进行修改 2 2任务调度 关于优先级为零的任务介绍 当创建的任务都处于阻塞态时 很多时候都会有这种情况出现 这种状态下所有的任务都不可运行 但处理器总是需要代码来执行 所以

9、至少要有一个任务处于运行态 为了保证这一点 当调用vTaskStartScheduler 时 调度器会自动创建一个空闲任务 非常短小的循环 空闲任务拥有最低优先级 优先级0 这样不会妨碍具有更高优先级的应用任务进入运行态 2 2任务调度 图中任务一 Task1 任务二 Task2 都设置有定时阻塞 任务二的优先级高于任务一的优先级 在两个任务都被阻塞的时候 空闲任务 idle 开始执行 图三 2 2任务调度 空闲任务钩子函数 通过空闲任务钩子函数 或称回调 hook orcall back 可以直接在空闲任务中添加应用程序相关的功能 空闲任务钩子函数会被空闲任务每循环一次就自动调用一次 空闲任

10、务钩子函数有很多用途 如在没有任何应用功能需要处理的时候 将系统配置到省电模式 2 2任务调度 定义一个空闲任务钩子函数 voidvApplicationIdleHook void FreeRTOSConfig h中的配置常configUSE IDLE HOOK必须定义为1 这样空闲任务钩子函数才会被调用 2 2任务调度 空闲任务钩子函数必须遵从以下规则 1 绝不能阻塞或挂起 空闲任务的目的就是希望在所有任务阻塞时仍能有任务运行 一旦钩子函数阻塞或挂起 将不再有任务运行 2 如果应用程序用到了vTaskDelete 函数 则空闲钩子函数必须能够尽快返回 因为在任务被删除后 vTaskDelet

11、e 空闲任务负责回收内核资源 如果空闲任务一直运行在钩子函数中 则无法进行回收工作 2 2任务调度 任务优先级的改变API函数vTaskPriofitySet 可以用于在调度器启动后改变任何任务的优先级 voidvTaskPrioritySet xTaskHandlepxTask unsignedportBASE TYPEuxNewPriority 参数 pxTask被修改优先级的任务句柄 即目标任务 uxNewPriority目标任务将被设置到哪个优先级上 如果设置的值超过了最大可用优先级 configMAX PRIORITIES 1 则会被自动封顶为最大值 2 2任务调度 根据优先级的具体

12、调度方法 调度器保证总是在所有可运行的任务中选择具有最高优先级的任务 并使其进入运行态 如果被选中的优先级上具有不止一个任务 调度器会让这些任务轮流执行 如图二 2 2任务调度 时间片的概念图二中的两个任务优先级相同 所以每个任务都执行一个 时间片 任务在时间片起始时刻进入运行态 在时间片结束时刻又退出运行态 图2中t1与t2之间的时段就等于一个时间片 要能够选择下一个运行的任务 调度器需要在每个时间片的结束时刻运行自己本身 一个称为心跳 tick 中断的周期性中断用于此目的 时间片的长度是可以设定的 2 2任务调度 此图中的任务一与任务二与图2中的是一样的 此图中标出了调度器在时间片之间的调

13、度过程 图4 2 2任务调度 任务状态在简要介绍了优先级调度后 我们需要了解与调度相关的各种任务的状态 1 运行态 运行中的任务状态 2 阻塞状态如果一个任务正在等待某个事件 则称这个任务处于 阻塞态 blocked 挂起状态 3 挂起 suspended 处于挂起状态的任务对调度器而言是不可见的 让一个任务进入挂起状态的唯一办法就是调用vTaskSuspend API函数 4 就绪状态如果任务处于非运行状态 但既没有阻塞也没有挂起 则这个任务处于就绪 ready 准备或就绪 状态 2 2任务调度 完整的状态转移图图5 3 队列 独立的任务之间很可能会通过相互通信以提供有用的系统功能 Free

14、RTOS中所有的通信与同步机制都是基于队列实现的 特性 1 数据存储2 队列可以保存有限个具有确定长度的数据单元3 可被多任务存取4 队列是具有自己独立权限的内核对象 并不属于或赋予任何任务 所有任务都可以向同一队列写入和读出 3 队列 5 读队列时阻塞当某个任务试图读一个队列时 其可以指定一个阻塞超时时间 在这段时间中 如果队列为空 该任务将保持阻塞状态以等待队列数据有效 6 写队列时阻塞同读队列一样 任务也可以在写队列时指定一个阻塞超时时间 这个时间是当被写队列已满时 任务进入阻塞态以等待队列空间有效的最长时间 3 队列 创建队列 xQueueHandlexQueueCreate unsi

15、gnedportBASE TYPEuxQueueLength unsignedportBASE TYPEuxItemSize 参数 uxQueueLength队列能够存储的最大单元数目 即队列深度 uxItemSize队列中数据单元的长度 以字节为单位 返回值 NULL表示没有足够的堆空间分配给队列而导致创建失败 非NULL值表示队列创建成功 此返回值应当保存下来 以作为操作此队列的句柄 3 队列 向列中写数据xQueueSendToBack 与xQueueSendToFront API函数portBASE TYPExQueueSendToFront xQueueHandlexQueue co

16、nstvoid pvItemToQueue portTickTypexTicksToWait 将数据发送到队列尾部 3 队列 参数说明xQueue目标队列的句柄 这个句柄即是调用xQueueCreate 创建该队列时的返回值 pvItemToQueue发送数据的指针 其指向将要复制到目标队列中的数据单元 xTicksToWait阻塞超时时间 如果在发送时队列已满 这个时间即是任务处于阻塞态等待队列空间有效的最长等待时间 3 队列 返回值有两个可能的返回值 1 pdPASS数据被成功发送到队列中 2 errQUEUE FULL如果由于队列已满而无法将数据写入 则将返回 3 队列 ortBASE TYPExQueueSendToBack xQueueHandlexQueue constvoid pvItemToQueue portTickTypexTicksToWait 将数据发送到队列首部其参数和返回值与前者相似 这里不再介绍 3 队列 xQueueReceive 与xQueuePeek API函数xQueueReceive 用于从队列中接收 读取 数据单元 接收到的单元同时会从队列中删

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号