实时操作系统实验报告2
- 格式:doc
- 大小:61.50 KB
- 文档页数:13
实时操作系统实验报告
专业: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(); /*