Presentation is loading. Please wait.

Presentation is loading. Please wait.

嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.

Similar presentations


Presentation on theme: "嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009."— Presentation transcript:

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.


Download ppt "嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009."

Similar presentations


Ads by Google