嵌入式实时操作系统复习
操作系统的基本功能操作系统的基本功能: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_task(void *pdata);//任务函数 #define LED0_TASK_PRIO7 //设置任务优先级 #define LED0_STK_SIZE64//设置任务堆栈大小 OS_STK LED0_TASK_STK[LED0_STK_SIZE];//任务堆栈 void led0_task(void *pdata);//LED0 任务 #define LED1_TASK_PRIO6 //设置任务优先级 #define LED1_STK_SIZE64//设置任务堆栈大小 OS_STK LED1_TASK_STK[LED1_STK_SIZE];//任务堆栈 void led1_task(void *pdata);//LED1 任务 int main(void) { Stm32_Clock_Init(9); //系统时钟设置 delay_init(72);//延时初始化 LED_Init();//初始化与 LED 连接的硬件接口 OSInit(); OSTaskCreate(start_task,(void *)0,(OS_STK *)// 创建起始任务 OSStart(); } //开始任务 void start_task(void *pdata) { OS_CPU_SR cpu_sr=0; pdata = pdata; OS_ENTER_CRITICAL();//进入临界区(无法被中断打断) OSTaskCreate(led0_task,(void *)0,(OS_STK*) OSTaskCreate(led1_task,(void *)0,(OS_STK*) OSTaskSuspend(START_TASK_PRIO); // 挂起起始任务. OS_EXIT_CRITICAL();//退出临界区(可以被中断打断) } void led0_task(void *pdata)//LED0 任务 { while(1) { LED0=0; de