嵌入式实时操作系统复习.docx
《嵌入式实时操作系统复习.docx》由会员分享,可在线阅读,更多相关《嵌入式实时操作系统复习.docx(9页珍藏版)》请在冰豆网上搜索。
嵌入式实时操作系统复习
操作系统的基本功能:
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中承载了任务的相关信息。
Typedefstructosevent
{
INT8UOSEventType;/*事件控制块的类型*/
Void*OSEventPtr;/*指向下一个ECB或消息队列的指针*/
INT16UOSEventCnt;/*信号量计数值,对除信号量意外其他事件无效*/
OSPRIOOSEventGrp;/*事件等待组*/
OSPRIOOSEventGbl[OSEVENTTBLSIZE];/*等待事件的任务表*/
INT8U*OSEventName;/*事件名称*/
}
OSEVENT;
移植步骤:
1、使用开发软件MDK4.70,为uc/os操作系统建立一个目录,将系统的代码复制到该目录下,要有一个子目录。
2、在该目录下创建工程。
3、建立主程序main.c。
4、对os_cpu.h说明,根据硬件修改os_cpu.h。
5、修改os_cpu.c。
6、编译,下载,运行
信号量函数列表:
Name
Description
OsSemCreat
创建一个信号量
OsSemSet
设置信号量值
OsSemDel
删除一个信号量
OsSemPend
等待一个信号量
OsSemAccept
无等待请求信号
OsSemPendAbort
放弃等待信号量
OsSemPost
发出一个信号量
OsSemQuery
查询一个信号量
存管理函数:
Name
Description
OSMemInit
创建一个存分区
OsMemCreate、OsSemCreat
分配一个存块,创建一个信号量
OsMemGet
释放一个存块
OsMemPut,OsSemPend
等待一个信号量,
OsMemQuery,OsSemQuery
查询一个存分区状态,一个信号量
OsMemNameSet
设定一个存分区名称
OsMemNameGet
获取一个存分区名称
编程题例子
一、
#include"sys.h"
#include"usart.h"
#include"delay.h"
#include"led.h"
#include"includes.h"
#defineSTART_TASK_PRIO10//设置任务优先级,开始任务的优先级设置为最低
#defineSTART_STK_SIZE64//设置任务堆栈大小
OS_STKSTART_TASK_STK[START_STK_SIZE];//任务堆栈
voidstart_task(void*pdata);//任务函数
#defineLED0_TASK_PRIO7//设置任务优先级
#defineLED0_STK_SIZE64//设置任务堆栈大小
OS_STKLED0_TASK_STK[LED0_STK_SIZE];//任务堆栈
voidled0_task(void*pdata);//LED0任务
#defineLED1_TASK_PRIO6//设置任务优先级
#defineLED1_STK_SIZE64//设置任务堆栈大小
OS_STKLED1_TASK_STK[LED1_STK_SIZE];//任务堆栈
voidled1_task(void*pdata);//LED1任务
intmain(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();
}
//开始任务
voidstart_task(void*pdata)
{
OS_CPU_SRcpu_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();//退出临界区(可以被中断打断)
}
voidled0_task(void*pdata)//LED0任务
{
while
(1)
{
LED0=0;
delay_ms(80);
LED0=1;
delay_ms(920);
};
}
voidled1_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;
#defineSTART_TASK_PRIO10//设置任务优先级,开始任务的优先级设置为最低
#defineSTART_STK_SIZE64//设置任务堆栈大小
OS_STKSTART_TASK_STK[START_STK_SIZE];//任务堆栈
voidstart_task(void*pdata);//任务函数
#defineMBOX_SEN_PRIO6//设置任务优先级
#defineMBOX_SEN_STK_SIZE64//设置任务堆栈大小
OS_STKMBOX_SEN_STK[MBOX_SEN_STK_SIZE];//任务堆栈
voidTaskMessageSen(void*pParam);//发送任务
#defineMBOX_REC_PRIO7//设置任务优先级
#defineMBOX_REC_STK_SIZE64//设置任务堆栈大小
OS_STKMBOX_REC_STK[MBOX_REC_STK_SIZE];//任务堆栈
voidTaskMessageRec(void*pParam);//接收任务
intmain(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();
}
//开始任务
voidstart_task(void*pdata)
{
OS_CPU_SRcpu_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();//退出临界区(可以被中断打断)
}
voidTaskMessageSen(void*pParam)
{
INT32Uscount;
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);
}
}
voidTaskMessageRec(void*pParam)
{
INT8U*perr;
INT8Uerr;
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);
else
printf("时间:
%d,任务TaskMessageRec等待异常接收,错误号:
%d\n",OSTimeGet(),*perr);
}程序分析题p46,