嵌入式实时操作系统复习.docx

上传人:b****8 文档编号:28233657 上传时间:2023-07-09 格式:DOCX 页数:9 大小:17.44KB
下载 相关 举报
嵌入式实时操作系统复习.docx_第1页
第1页 / 共9页
嵌入式实时操作系统复习.docx_第2页
第2页 / 共9页
嵌入式实时操作系统复习.docx_第3页
第3页 / 共9页
嵌入式实时操作系统复习.docx_第4页
第4页 / 共9页
嵌入式实时操作系统复习.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

嵌入式实时操作系统复习.docx

《嵌入式实时操作系统复习.docx》由会员分享,可在线阅读,更多相关《嵌入式实时操作系统复习.docx(9页珍藏版)》请在冰豆网上搜索。

嵌入式实时操作系统复习.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中承载了任务的相关信息。

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,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 财务管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1