操作系统的基本功能: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/os内存管理方法:Uc/os采用内存控制块管理内存,内存控制块记录了“内存分区地址,分区内存块的大小和数量,空闲块数量信息”。
内存管理含有: “内存分区的创建,分配,释放,使用和等待系统调用时间标志节点,.”事件标志组管理的主要数据结构: 包括“事件标志组,(XX实体,XX列表,XX节点链表)。
”用户调用两个函数创建任务,不允许用户进行修改,被称为系统服务。
用户的程序以函数的形式由用户编写,为用户函数。
和操作系统的服务划分了界限。
Uc/os采用抢占式任务调度算法,所有信息保存在TCB中。
任务就绪组是: 为了查找高级优先级的任务与正在运行任务的优先级进行比较,以确定是否进行切换。
事件控制块(ECB):是核心的数据结构,被频繁访问,定义出现在操作系统的头文件ucos.h中承载了任务的相关信息。
Typedef struct os event{INT8U OSEventType; /*事件控制块的类型*/Void *OSEventPtr; /*指向下一个ECB或消息队列的指针*/INT16U OSEventCnt; /*信号量计数值,对除信号量意外其他事件无效*/OS PRIO O SEventGrp; /*事件等待组*/OS PRIO O SEventGbl[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、编译,下载,运行信号量函数列表:编程题例子一、#include "sys.h" #include "usart.h" #include "delay.h"#include "led.h"#include "includes.h"#define START_TASK_PRIO 10 //设置任务优先级,开始任务的优先级设置为最低#define START_STK_SIZE 64//设置任务堆栈大小OS_STK START_TASK_STK[START_STK_SIZE];//任务堆栈void start_task(void *pdata);//任务函数#define LED0_TASK_PRIO 7 //设置任务优先级#define LED0_STK_SIZE 64//设置任务堆栈大小OS_STK LED0_TASK_STK[LED0_STK_SIZE];//任务堆栈void led0_task(void *pdata);//LED0任务#define LED1_TASK_PRIO 6 //设置任务优先级#define LED1_STK_SIZE 64//设置任务堆栈大小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*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务OSStart();}//开始任务void start_task(void *pdata){OS_CPU_SR cpu_sr=0;pdata = pdata;OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)OSTaskCreate(led0_task,(void*)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO); OSTaskCreate(led1_task,(void*)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO); OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)}void led0_task(void *pdata)//LED0任务{while(1){LED0=0;delay_ms(80);LED0=1;delay_ms(920);};}void led1_task(void *pdata)//LED1任务{while(1){LED1=0;delay_ms(300);LED1=1;delay_ms(300);};}二、#include "sys.h"#include "usart.h"#include "delay.h"#include "led.h"#include "includes.h"OS_EVENT *myMBox;#define START_TASK_PRIO 10 //设置任务优先级,开始任务的优先级设置为最低#define START_STK_SIZE 64//设置任务堆栈大小OS_STK START_TASK_STK[START_STK_SIZE];//任务堆栈void start_task(void *pdata);//任务函数#define MBOX_SEN_PRIO 6 //设置任务优先级#define MBOX_SEN_STK_SIZE 64//设置任务堆栈大小OS_STK MBOX_SEN_STK[MBOX_SEN_STK_SIZE];//任务堆栈void TaskMessageSen(void *pParam);//邮箱发送任务#define MBOX_REC_PRIO 7 //设置任务优先级#define MBOX_REC_STK_SIZE 64//设置任务堆栈大小OS_STK MBOX_REC_STK[MBOX_REC_STK_SIZE ];//任务堆栈void TaskMessageRec(void *pParam);//邮箱接收任务int main(void){Stm32_Clock_Init(9); //系统时钟设置delay_init(72); //延时初始化uart_init(72,9600);OSInit();OSTaskCreate(start_task,(void *)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务OSStart();}//开始任务void start_task(void *pdata){OS_CPU_SR cpu_sr=0;pdata = pdata;OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)OSTaskCreate(TaskMessageSen,(void*)0,(OS_STK*)&MBOX_SEN_STK[MBOX_SEN_STK_SIZE-1],MBOX_SEN_PRIO);OSTaskCreate(TaskMessageRec,(void*)0,(OS_STK*)&MBOX_REC_STK[MBOX_REC_STK_SIZE-1],MBOX_REC_PRIO);OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)}void TaskMessageSen(void *pParam){INT32U scount;scount=0;myMBox=OSMboxCreate(&scount);if(myMBox==(OS_EVENT *)0){printf("时间:%d,TaskMessageSen创建邮箱失败\n",OSTimeGet());OSTaskDel(OS_PRIO_SELF);return;}printf("时间:%d,TaskMessageSen创建邮箱成功\n",OSTimeGet());while(1){OSTimeDly(100);scount++;printf("时间:%d,任务TaskMessageSen准备发消息,消息为%d\n",OSTimeGet(),scount);OSMboxPost(myMBox,&scount);}}void TaskMessageRec(void *pParam){INT8U *perr;INT8U err;INT32U *prcount;perr=&err;err=OS_ERR_NONE;if(myMBox==(OS_EVENT *)0){printf("时间:%d,TaskMessageRec判断邮箱不存在!\n",OSTimeGet());OSTaskDel(OS_PRIO_SELF);return;}prcount=(INT32U *)OSMboxPend(myMBox,0,perr);if(*perr==OS_ERR_NONE)printf("时间:%d,任务TaskMessageRec接收消息为%d\n",OSTimeGet(),*prcount);elseprintf("时间:%d,任务TaskMessageRec等待异常接收,错误号:%d\n",OSTimeGet(),*perr); } 程序分析题p46,。