实时操作系统实验报告2

  • 格式:doc
  • 大小:61.50 KB
  • 文档页数:13

下载文档原格式

  / 13
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实时操作系统实验报告

专业:11通信工程

学号:20110306136

姓名: 王帅

指导老师:申屠浩

实验二 任务管理实验

实验目的:

1、理解任务管理的基本原理,了解任务的各个基本状态及其变迁

过程;

2、掌握µC/OS -II 中任务管理的基本方法(挂起、解挂);

3、熟练使用µC/OS -II 任务管理的基本系统调用。

实验要求与思路:

为了体现任务的各个基本状态及其变迁过程,本实验设计了T0、

T1和T3三个任务,它们交替运行,如图2-2所示。

T0 T1 T2 T3 T4 T5 T6 T7 T8

图2-2

注意:

图中的栅格并不代表严格的时间刻度,而仅仅表现各任务启动和

执行的相对先后关系。

说明:

在系统完成初始化后,可以先创建并启动优先级最低的

TaskStart ,由它创建其他3个应用任务T0、T1和T2,之后整个系

T0

T2

T1

T0 T1 T2 T1

T0

统的运行流程如下:

1)优先级最高的T0开始执行,之后T0挂起自己;

2)然后系统调度选中T1开始执行,之后T1挂起自己;

3)接着系统调度选中T2,之后唤醒T0;

4)如此循环

实现提示:

在启动任务中创建三个任务后,应挂起任务1和任务2。

在每个任务恢复其它任务并挂起自己之前,显示当前三个任务的状态,并延时1秒。

函数说明:

void PC_GetDateTime (char *s);

获取"YYYY-MM-DD HH:MM:SS"格式的时间字串存放在字符串s中,s的长度最少为21字节。

void PC_DispStr (INT8U x, INT8U y, INT8U *s, INT8U color);

在y行x列以color颜色值显示字串s,注意color由背景色和前景色两种颜色构成。

INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli);

按时、分、秒、毫秒设置进行延时。

void OSTimeDly (INT16U ticks)

按ticks值进行延时,1 ticks一般为10ms。

INT32U OSTimeGet (void)

获取从程序开始运行到当前时间,所经过的ticks值。

实验程序:

#include "includes.h"

#define TASK_STK_SIZE 512

OS_STK TaskStk1[TASK_STK_SIZE];

OS_STK TaskStk2[TASK_STK_SIZE];

OS_STK TaskStk3[TASK_STK_SIZE];

OS_STK TaskStartStk[TASK_STK_SIZE];

void Task1(void *data);

void Task2(void *data);

void Task3(void *data); /* Function prototypes of tasks*/

void TaskStart(void *data); /* Function prototypes of Startup task */

static void TaskStartCreateTasks(void);

static void TaskStartDispInit(void);

void main (void)

{

PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* Clear the screen */

OSInit(); /*

Initialize uC/OS-II */

PC_DOSSaveReturn(); /* Save environment to return to DOS */

PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-II's context switch vector */

OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 4);

OSStart(); /* Start multitasking */

}

void TaskStart (void *pdata)

{

#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */

OS_CPU_SR cpu_sr;

#endif

char s[100];

INT16S key;

pdata = pdata;

TaskStartDispInit(); /* Initialize the display */

OS_ENTER_CRITICAL();

PC_VectSet(0x08, OSTickISR); /* Install uC/OS-II's

clock tick ISR */

PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick rate */

OS_EXIT_CRITICAL();

OSStatInit(); /* Initialize uC/OS-II's

statistics */

OSTaskCreate(Task1, (void *)0, &TaskStk1[TASK_STK_SIZE

- 1], 1);

OSTaskCreate(Task2, (void *)0, &TaskStk2[TASK_STK_SIZE -

1], 2);

OSTaskCreate(Task3, (void *)0, &TaskStk3[TASK_STK_SIZE -

1], 3);

OSTaskSuspend(2);/* Prevent compiler warning */

OSTaskSuspend(3);

for (;;) {

if (PC_GetKey(&key) == TRUE) { /* See if key

has been pressed */

if (key == 0x1B) { /* Yes, see if it's

the ESCAPE key */

PC_DOSReturn(); /*