2022年嵌入式实时操作系统复习.docx
精品学习资源操作系统的基本功能 :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欢迎下载精品学习资源INT8UOSEventType;/* 大事掌握块的类型 */Void *OSEventPtr;/* 指向下一个 ECB或消息队列的指针 */INT16UOSEventCnt; /* 信号量计数值,对除信号量意外其他大事无效*/ OS PRIO OSEventGrp/;* 大事等待组 */OS PRIO OSEventGblOS EVENT TBL SIZE/*;等待大事的任务表 */INT8U*OSEventName;/* 大事名称 */OS EVENT;移植步骤: 1、使用开发软件,为 uc/os 操作系统建立一个目录,将系统的代码复制到该目录下,要有一个子目录;2、在该目录下创建工程;3、建立主程序 main.c ;4、对 os_cpu.h 说明,依据硬件修改os_cpu.h ;5、修改 os_cpu.c ;6、编译,下载,运行信号量函数列表:NameDescriptionOsSemCreat创建一个信号量OsSemSet设置信号量值OsSemDel删除一个信号量OsSemPend等待一个信号量OsSemAccept无等待恳求信号OsSemPendAbort舍弃等待信号量OsSemPost发出一个信号量OsSemQuery查询一个信号量内存治理函数:NameDescriptionOS MemInit创建一个内存分区欢迎下载精品学习资源OsMemCreat、e OsSemCreat安排一个内存块,创建一个信号量OsMemGet释放一个内存块OsMemPu,t OsSemPend等待一个信号量,OsMemQue,ry 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_STKSTART_STK_SIZE;/ 任务堆栈void start_taskvoid *pdata;/任务函数#define LED0_TASK_PRIO7 /设置任务优先级#define LED0_STK_SIZE64/设置任务堆栈大小OS_STK LED0_TASK_STKLED0_STK_SIZE;/任务堆栈void led0_taskvoid *pdata;/LED0 任务#define LED1_TASK_PRIO6 /设置任务优先级#define LED1_STK_SIZE64/设置任务堆栈大小OS_STK LED1_TASK_STKLED1_STK_SIZE;/任务堆栈void led1_taskvoid *pdata;/LED1 任务int mainvoidStm32_Clock_Init9; / 系统时钟设置delay_init72;/延时初始化LED_Init;/初始化与 LED 连接的硬件接口OSInit;OSTaskCreatestart_task,void *0,OS_STK*&START_TASK_STKSTART_STK_SIZE-1,START_TASK_PRIO ;/创建起始任务OSStart;欢迎下载精品学习资源/开头任务void start_taskvoid *pdataOS_CPU_SR cpu_sr=0; pdata = pdata;OS_ENTER_CRITICAL;/进入临界区 无法被中断打断 OSTaskCreateled0_task,void*0,OS_STK*&LED0_TASK_STKLED0_STK_SIZE-1,LED0_TASK_PRIO;OSTaskCreateled1_task,void*0,OS_STK*&LED1_TASK_STKLED1_STK_SIZE-1,LED1_TASK_PRIO;OSTaskSuspendSTART_TASK_PRIO; /挂/ 起起始任务 .OS_EXIT_CRITICAL;/退出临界区 可以被中断打断 void led0_taskvoid *pdata/LED0 任务while1LED0=0;delay_ms80;LED0=1;delay_ms920;void led1_taskvoid *pdata/LED1 任务while1LED1=0;delay_ms300;LED1=1;delay_ms300;欢迎下载精品学习资源二、#include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "includes.h"OS_EVENT *myMBox;#define START_TASK_PRIO10 /设置任务优先级 ,开头任务的优先级设置为最低#define START_STK_SIZE64/设置任务堆栈大小OS_STK START_TASK_STKSTART_STK_SIZE;/ 任务堆栈void start_taskvoid *pdata;/任务函数#define MBOX_SEN_PRIO6 /设置任务优先级#define MBOX_SEN_STK_SIZE64/设置任务堆栈大小OS_STKMBOX_SEN_STKMBOX_SEN_STK_SIZE;/任务堆栈void TaskMessageSenvoid *pParam;/邮/ 箱发送任务#define MBOX_REC_PRIO7 /设置任务优先级#define MBOX_REC_STK_SIZE64/设置任务堆栈大小OS_STKMBOX_REC_STKMBOX_REC_STK_SIZE ;/任务堆栈void TaskMessageRecvoid *pParam;/邮/ 箱接收任务int mainvoidStm32_Clock_Init9; / 系统时钟设置delay_init72;/延时初始化uart_init72,9600;OSInit;OSTaskCreatestart_task,void *0,OS_STK*&START_TASK_STKSTART_STK_SIZE-1,START_TASK_PRIO ;/创建起始任务OSStart;/开头任务欢迎下载精品学习资源void start_taskvoid *pdataOS_CPU_SR cpu_sr=0; pdata = pdata;OS_ENTER_CRITICAL;/进入临界区 无法被中断打断 OSTaskCreateTaskMessageSen,void*0,OS_STK*&MBOX_SEN_STKMBOX_SEN_STK_SIZE-1,MBOX_SEN_PRIO;OSTaskCreateTaskMessageRec,void*0,OS_STK*&MBOX_REC_STKMBOX_REC_STK_SIZE-1,MBOX_REC_PRIO;OSTaskSuspendSTART_TASK_PRIO;/挂起起始任务 . OS_EXIT_CRITICAL;/退出临界区 可以被中断打断 void TaskMessageSenvoid *pParamINT32U scount; scount=0;myMBox=OSMboxCreate&scount; ifmyMBox=OS_EVENT *0printf" 时间: %d,TaskMessageSen创建邮箱失败 n",OSTimeGet; OSTaskDelOS_PRIO_SELF;return;printf" 时间: %d,TaskMessageSen创建邮箱胜利 n",OSTimeGet; while1OSTimeDly100; scount+;printf" 时间: %d,任务 TaskMessageSen预备发消息,消息为 %dn",OSTimeGet,scount;OSMboxPostmyMBox,&scount;void TaskMessageRecvoid *pParamINT8U *perr; INT8U err; INT32U *prcount; perr=&err;err=OS_ERR_NONE; ifmyMBox=OS_EVENT *0printf" 时间: %d,TaskMessageRec判定邮箱不存在! n",OSTimeGet; OSTaskDelOS_PRIO_SELF;欢迎下载精品学习资源return;prcount=INT32U *OSMboxPendmyMBox,0,perr; if*perr=OS_ERR_NONEprintf" 时间: %d,任务 TaskMessageRec接收消息为 %dn",OSTimeGet,*prcount;elseprintf" 时间: %d,任务 TaskMessageRec等待反常接收,错误号: %dn",OSTimeGet,*perr;程序分析题 p46,欢迎下载