嵌入式实时操作系统复习
操作系统的基本功能操作系统的基本功能1、任务管理,2、内存管理,3、文件管理,4、CPU 管理 5、I/O 口设备管理。 操作系统基本特征操作系统基本特征1、多任务操作系统,2、多级中断机制,3、优先级调度机制。 任务的定义任务的定义程序的动态表现,在操作系统中体现为线程,是程序的一次执行过程。 任务的状态任务的状态有1、睡眠态,2、就绪态,3、运行态,4、阻塞态,5、挂起态。 调度算法调度算法根据系统资源的资源分配策略所规定的资源分配算法。有“短作业优先算法”“轮转法” 事件事件实时操作系统运行过程中发生的重要事件 事件处理对象事件处理对象 1、信号量,2、互斥信号量,3、事件标志组,4 、邮箱,5、消息队列。 信号量定义信号量定义资源是具体的显示东西,把它数字化后,操作系统就便于管理这些资源。 信号量的用法信号量的用法1、建立,2、请求,3、释放。 互斥信号量互斥信号量 是一种特殊的信号量,该信号不仅是只用于互斥资源的访问,还在于信号量管理需要 解决的优先级反转问题。。 互斥信号量管理互斥信号量管理 取值 0 或 1,只能有一个任务访问的独占资源,应采用信号来管理,为了保证系 统的定时性拒绝优先级反转,对互斥信号量的管理,采用优先级继承机制。 时钟时钟 是一种特定的周期性中断,起“心脏”作用。时钟节拍是周期性中断 ,对应的中断服务程序成 为时钟滴答服务。 中断中断在任务的执行过程中,当出现异常情况或特殊请求时,停止任务的执行,转而对这些异常或特 殊进行处理,处理结束后返回当前任务的中断处。 Uc/osUc/os 内存管理方法内存管理方法 Uc/os 采用内存控制块管理内存,内存控制块记录了“内存分区地址,分区内存 块的大小和数量,空闲块数量信息”。 内存管理含有内存管理含有 “内存分区的创建,分配,释放,使用和等待系统调用时间标志节点,.” 事件标志组管理的主要数据结构事件标志组管理的主要数据结构 包括“事件标志组,XX 实体,XX 列表,XX 节点链表。” 用户调用两个函数创建任务,不允许用户进行修改,被称为系统服务。用户的程序以函数的形式由用 户编写,为用户函数。和操作系统的服务划分了界限。Uc/os 采用抢占式任务调度算法,所有信息保 存在 TCB 中。 任务就绪组是任务就绪组是 为了查找高级优先级的任务与正在运行任务的优先级进行比较,以确定是否进行切 换。 事件控制块(事件控制块(ECBECB))是核心的数据结构,被频繁访问,定义出现在操作系统的头文件 ucos.h 中承 载了任务的相关信息。 Typedef struct os event { INT8U OSEventType; Void*OSEventPtr; INT16U OS PRIO OS PRIO /*事件控制块的类型*/ /*指向下一个 ECB 或消息队列的指针*/ OSEventCnt;/*信号量计数值,对除信号量意外其他事件无效*/ OSEventGrp;/*事件等待组*/ OSEventGbl[OS EVENT TBL SIZE];/*等待事件的任务表*/ INT8U*OSEventName; } OS EVENT; /*事件名称*/ 移植步骤1、使用开发软件 MDK4.70,为 uc/os 操作系统建立一个目录,将系统的代码复制到该目 录下,要有一个子目录。 2、在该目录下创建工程。 3、建立主程序 main.c。 4、对 os_cpu.h 说明,根据硬件修改 os_cpu.h。 5、修改 os_cpu.c。 6、编译,下载,运行 信号量函数列表 NameDescription OsSemCreat OsSemSet OsSemDel OsSemPend OsSemAccept OsSemPendAbort OsSemPost OsSemQuery 内存管理函数 Name OS MemInit OsMemCreate、OsSemCreat OsMemGet 创建一个信号量 设置信号量值 删除一个信号量 等待一个信号量 无等待请求信号 放弃等待信号量 发出一个信号量 查询一个信号量 Description 创建一个内存分区 分配一个内存块,创建一个信号量 释放一个内存块 OsMemPut,OsSemPend OsMemQuery,OsSemQuery OsMemNameSet OsMemNameGet 等待一个信号量, 查询一个内存分区状态,一个信号量 设定一个内存分区名称 获取一个内存分区名称 编程题例子编程题例子 一、 include “sys.h“ include “usart.h“ include “delay.h“ include “led.h“ include “includes.h“ define START_TASK_PRIO10 //设置任务优先级,开始任务的优先级设置为最低 define START_STK_SIZE64//设置任务堆栈大小 OS_STK START_TASK_STK[START_STK_SIZE];// 任务堆栈 void start_taskvoid *pdata;//任务函数 define LED0_TASK_PRIO7 //设置任务优先级 define LED0_STK_SIZE64//设置任务堆栈大小 OS_STK LED0_TASK_STK[LED0_STK_SIZE];//任务堆栈 void led0_taskvoid *pdata;//LED0 任务 define LED1_TASK_PRIO6 //设置任务优先级 define LED1_STK_SIZE64//设置任务堆栈大小 OS_STK LED1_TASK_STK[LED1_STK_SIZE];//任务堆栈 void led1_taskvoid *pdata;//LED1 任务 int mainvoid { Stm32_Clock_Init9; //系统时钟设置 delay_init72;//延时初始化 LED_Init;//初始化与 LED 连接的硬件接口 OSInit; OSTaskCreatestart_task,void *0,OS_STK *// 创建起始任务 OSStart; } //开始任务 void start_taskvoid *pdata { OS_CPU_SR cpu_sr0; pdata pdata; OS_ENTER_CRITICAL;//进入临界区无法被中断打断 OSTaskCreateled0_task,void *0,OS_STK* OSTaskCreateled1_task,void *0,OS_STK* OSTaskSuspendSTART_TASK_PRIO; // 挂起起始任务. OS_EXIT_CRITICAL;//退出临界区可以被中断打断 } void led0_taskvoid *pdata//LED0 任务 { while1 { LED00; de