Download presentation
Presentation is loading. Please wait.
1
嵌入式操作系统 陈香兰 xlanchen@ustc.edu.cn 助教:陈博、李春华 Spring 2009
2
RTEMS 操作系统介绍
3
3 提纲 RTEMS 概述 RTEMS4.0.0 体系结构及模块介绍 RTEMS4.0.0 的启动 Hello 任务的运行 Printf 的实现
4
4 RTEMS 概述 实时多处理器系统 Real Time Executive for Multiprocessor Systems 开源的无版税的实时嵌入操作系统 最早用于美国国防系统 first= 实时导弹系统 =Real Time Executive for Missile Systems then= 实时军用系统 =Real Time Executive for Military Systems , 现在由 OAR 公司负责版本的升级与维护。 OAR 在航空航天、军工、民用等领域都有广泛应用。
5
5 RTEMS 体系结构 版本 4.0.0 APP 静态联编,包括 应用程序、 C 库、 RTEMS RTEMS 相关的所有源代码都在 c 目录下,包括 操作系统、测试包、应用实例、 BSP 包、设备 驱动以及支持库。 总体上 RTEMS 代码由两部分组成 EXEC : RTEMS 操作系统执行体 82, 645 行 LIB : RTEMS 库,包括 libc 、 bsp (包括驱动)以及 libcpu 146, 262 行 EXEC LIB
6
6 RTEMS 的源代码结构 阅读各个层次目录下的 readme 观察主要目录及文件
7
7 EXEC RTEMS 操作系统包括一个核心 score 核心之上有可以支持两种操作系统封装 符合 POSIX 标准的 RTEMS 在最上层是 SAPI EXEC 代码统计信息 SCORE : 52166 行 RTEMS : 16045 行 POSIX : 11345 行 SAPI : 3089 行
8
8 LIB Libbsp libbsp.a Libc Libcpu Libmisc Libnetworking Start BSP 基本功能 BSP 基本驱动 基本 C 库 CPU 库, CPU 相关操作,但与 board 无关 一些工具 网络 启动支持, i386 和 ppc 都不在这
9
9 SCORE 中的模块及其依赖关系 Src : 15 个主要的 handler API 扩展、 user 扩展、 Workspace 、 heap 、 Object 、 Thread 、 threadq 、 Watchdog 、 tod 、 Msg 、 sem 、 mutex 、 Isr 、 interr 、 chain 一些辅助 handler : address 、 sysstate 、 state 、 context 、 priority 等 Mp 相关 Cpu :提供 CPU 相关的一些支持
10
10 API 和 user 扩展 不同的操作系统封装具有不同的操作系统语义 。有时需要在 score 的基础上进行扩展。 score 提供两种扩展: API 扩展和 user 扩展。 API 扩展提供了 3 个可扩展点 Predriver :系统初始化时,所有驱动初始化前 Postdriver :系统初始化时,所有驱动初始化后 Postswitch :根据需要在线程切换后
11
11 User 扩展提供了 8 个扩展点: Thread_create :在线程初始化后执行 Thread_start :在线程启动后 Thread_restart :在线程重启后 Thread_delete :在线程 close 的后面运行 Thread_switch :上下文切换之前 Thread_begin :在线程入口程序运行前 Thread_exitted :在线程入口程序退出后 Fatal :系统出错时
12
12 每次扩展都要提供 API/user 扩展点集的扩展例程 集,组织成一个扩展节点 可以进行多次扩展,所有扩展节点使用链表连接 在一起 _API_extensions_List _User_extensions_List 扩展例程的执行 在每个扩展点,遍历 API/user 扩展链表,对每个扩展 节点,找到这个扩展点的例程并执行
13
13 Score 中的 chain 这是 score 中普遍使用的一种数据结构 类似双向链表 包括一个链表控制结构和若干链表节点 使用 chain 链表的大多数数据结构都将链表节点 数据结构作为第一个元素,以便于通过类型转换 方式维护链表
14
14 Score 的 heap 一种动态内存管理方法 堆 = 一组堆块 所有的空闲堆块组织成一个空闲堆块链表。 分配算法:首次适应算法 分配:分割;回收:合并 初始化 给定内存区域,划分成两个堆块 一个大堆块,基本覆盖全部内存区域 最后 8 个字节为第二个堆块 为整个堆的尾堆块,永远不会分配出去
15
15 Score 的 workspace Workspace 是 score 的可用内存区域。 Score 的各个模块都通过 workspace 的分配 / 回收函 数使用内存。 Workspace 是 score heap 的一个应用实例。 Workspace 的初始化 根据 rtems 静态配置信息,计算出 Workspace 的大小 在系统初始化时,辟出相应的物理内存作为 Workspace
16
16 Score 的对象管理 17 种对象类型 内部线程、 RTEMS 任务、 POSIX 线程 其他 8 种 RTEMS 对象类型: 定时器、信号量、消息队列、分区、区域、端口、周期、扩 展 其他 6 种 POSIX 对象类型: 中断、消息队列、互斥量、信号量、条件变量、键值
17
17 每个对象类型有专门的对象类型信息结构保存该 类对象的基本信息,包括: 类型号 最小和最大 id 最多对象个数 有效对象句柄表 对象名字字符串数组、最大对象名字长度 空闲对象链表 等等
18
18 每个有效对象都有一个 32 位的对象 id 标识 后 16 位:对象索引号 中间 11 位:对象位置信息(本地 or 远程) 高 5 位:对象类型号
19
19 对象数据结构 对象控制结构 链表节点:连接同一种类型的对象。
20
20 Score 的 watchdog Watchdog 实现定时执行功能。 提供两种定时单位: tick 和 second 。使用两个定 时器链表分别维护: _Watchdog_Ticks_chain _Watchdog_Seconds_chain 维护: 只需要考虑最前面的定时器 定时器按到期时间先后排序 后继定时器记录与前驱定时器之间的时间差
21
21 Score 的线程队列 有两种线程队列维护方式 基于 FIFO ,所有线程都在一个队列上 基于优先级: 一共 256 个优先级, 为查找方便 256 个优先级划分为 4 组,每组一个队列,负责 64 个优先级 查找时 高 32 个优先级从队列前方开始搜索 底 32 个优先级从队列后方开始搜索
22
22 Score 的消息队列 两种消息队列: 基于 FIFO 的: 等待消息的线程按照 FIFO 原则排队 基于优先级的: 等待消息的线程按照优先级原则排队 Score 允许紧急消息。 当没有等待线程时: 普通消息插入消息链表的末尾; 紧急消息插入消息队列的前面。
23
23 Score 的信号量 Score 的信号量也有两种类型: (根据等待线程的排队原则) 基于 FIFO 基于优先级
24
24 Score 的互斥锁 Score 的互斥锁有四种 基于 FIFO 基于优先级 基于优先级继承 基于优先级置顶
25
25 Score 的 interr 处理 内部出错处理流程: 1. 填写出错信息 2. 执行 user 扩展中的 fatal 扩展 3. 调用 CPU 相关代码 _CPU_Fatal_halt 停止系统运 行 对于 i386 ,首先关中断,然后执行 hlt 指令
26
26 RTEMS Task INTR Partition , Region Dpmem Clock , Timer Ratemon Signal , Event , MsgQ , Sem
27
27 SAPI INIT Debug Extension Fatal Io
28
28 RTEMS Partition 一种静态分区内存管理机制。 分区中,内存被组织成固定大小的缓冲区。 初始化时,所有的内存被划分成一个个缓冲区,并链 接为空闲链表; 分配时,从空闲链表上获得缓冲区; 释放时,将缓冲区释放到空闲链表上。
29
29 RTEMS Region 一种动态内存管理方法。 区域中的内存按照堆( score heap )的方式动态 管理 区域中的堆块又称为段。 分配时,若内存不够,则申请者可以考虑等待。 释放时,若有等待线程,则要考虑将空闲内存分 配给等待者。
30
30 Libcsupport & newlib Malloc _REENT IO
31
31 RTEMS-4.0.0 的启动 上电?? BSP : start16.s BSP : Start.s BSP : Main.c RTEMS : INIT ……
32
32 Start.s ( pc386 ) 1. 关中断 2. 装载各个段寄存器 1. 装载 Gdt 和 Idt 2. 通过 ljmp 装载全新的 CS ,并且清空指令 cache 等 3. 装载 ss 、 ds 、 es 、 fs 、 gs 3. 重新设置 8259 4. 建立堆栈 5.BSS 段清 0 6. 检查 CPU 信息 7. 调用 boot_card
33
33 Main.c : boot_card 1. 缺省初始化 Cpu_table 2. 复制配置表 3. 调用 bsp_start 4. 调用 rtems_initialize_executive_early 5. 调用 main (一旦从 main 退出执行到这里,就说明系统运行结束) 6. 调用 bsp_cleanup
34
34 Bspstart.c : bsp_start 1. 校正时间 2. 为 printk 进行初始化 3. 空闲内存起始地址初始化 rtemsFreeMemStart 4. 初始化 Cpu_table 5. 对齐空闲内存起始地址 6. 设置 BSP_Configuration 中 workspace 的起始地址参数 7. 空闲内存起始地址指向 workspace 之后 8. 为 console 保留资源 9. 初始化 rtems 的中断管理 10. 初始化 rtems 的异常管理
35
35 RTEMS 第一阶段初始化 rtems_initialize_executive_early 初始化各个模块 在合适的位置执行各项扩展 bsp 的多任务启动前扩展、驱动初始化前扩展、驱动初始化 后扩展 API 扩展的驱动初始化前扩展、驱动初始化后扩展 初始化设备驱动 创建 idle 线程
36
36 Bsp 的 main 1. 调用 rtems_initialize_executive_late 进行第二阶 段的初始化,并进入实际运行阶段 若返回,则说明系统运行已经结束 2. 返回 0
37
37 RTEMS 第二阶段初始化 rtems_initialize_executive_late 1. 启动多任务(从 bsp 上下文切换到线程后继运行) 一旦从多任务返回,则系统运行结束 2.……
38
38 Hello 任务的运行 观察 hello 中 init.c 、 Makefile.in 以及 system.h 涉及 pc386.cfg 等文件; confdef.h RTEMS 应用的启动程序,名为 init 通过配置表的方式传递给 RTEMS 的初始化管理器 rtems_initialization_tasks_table Initialization_tasks[] ={{…, init, …}} rtems_api_configuration_table Configuration_RTEMS_API = {…, Initialization_tasks} rtems_configuration_table Configuration ={…}
39
39 在初始化第一阶段 调用 _RTEMS_API_Initialize 初始化 API 相关内容 调用 _RTEMS_tasks_Manager_initialization 初始化任务管理器 添加 API 扩展 _RTEMS_tasks_API_extensions 包含 _RTEMS_tasks_Initialize_user_tasks 作为 postdriver _API_extensions_Run_postdriver 中被调用
40
40 在 RTEMS 初始化的第二阶段,上下文切换到调 度后继 这个调度后继,永远指向当前最应该运行的任务 在初始化刚刚完成时,通常就是 init 考察 rtems_task_start _Thread_Start _Thread_Ready _Thread_Calculate_heir
41
41 Project 4 在 RTEMS - 4.0.0 中,选择下列任一模块加以分析: 1. 内存管理模块,包括: Heap 内存管理算法 Partition 管理器 理清楚 workspace 、 region 、 malloc 之间的关系 2. 任务管理模块,包括: Score 中的 thread 管理、 thread 队列、优先级管理 Rtems 中的 rtems task 以及它们各自对外的接口 3. 任务间同步机制,包括 Score 和 rtems 中的信号量、互斥信号量以及它们之间的关系 掌握防止优先级翻转的优先级继承、优先级置顶协议 4. 系统初始化 基于 x86 的 rtems 的初始化 了解 hello 任务是如何得到执行的
42
Thanks ! The end.
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.