专业:J通信0601
学号:3061109015
姓名:蔡 智 超
指导老师:李峰
实验二 任务管理实验
实验目的:
1.理解任务管理的基本原理,了解任务的各个基本状态及其变迁过程;
2.掌握μC/OS-II 中任务管理的基本方法(挂起、解挂);
3.熟练使用μC/OS-II 任务管理的基本系统调用。
实验要求与思路:
为了体现任务的各个基本状态及其变迁过程,本实验设计了T0、T1 和T3
三个任务,它们交替运行,如图所示
说明:
在系统完成初始化后,可以先创建并启动优先级最低的TaskStart,由它创
建其他3 个应用任务T0、T1 和T2,之后整个系统的运行流程如下:
1) 优先级最高的T0 开始执行,之后T0 挂起自己;
2) 然后系统调度选中T1 开始执行,之后T1 挂起自己;
3) 接着系统调度选中T2,之后唤醒T0;
4) 如此循环
实验程序:
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
* EX #1 Task Management
*********************************************************************************************************
#include "includes.h"
*********************************************************************************************************
* CONSTANTS
*********************************************************************************************************
#define TASK_STK_SIZE 512 /* Size of each task's stacks (# of WORDs) */
#define N_TASKS 2 /* Number of identical tasks
* VARIABLES
*********************************************************************************************************
*/
OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; /* Tasks stacks
OS_STK TaskStartStk[TASK_STK_SIZE]; /* TaskStart task stack
INT8U TaskData[N_TASKS]; /* Parameters to pass to each task
/*
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void Task0(void *pdata); /* Function prototypes of tasks */
void Task1(void *pdata);
void Task2(void *pdata);
void TaskStart(void *pdata); /* Function prototypes of Startup task */
static void TaskStartCreateTasks(void); /* Function prototypes of creat task */
static void TaskStartDispInit(void); /* Function prototypes of Initialization the display */
/*$PAGE*/* MAIN
**********************************************************************************************************/
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 */
}
/*
*********************************************************************************************************
* STARTUP TASK
*********************************************************************************************************
*/
void TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT16S key;
pdata = pdata; /* Prevent compiler warning */
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 */
TaskStartCreateTasks(); /* Create all the application tasks */
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(); /* Return to DOS */
}
}
OSCtxSwCtr = 0; /* Clear context switch counter */
OSTimeDlyHMSM(0, 0, 1, 0); /* Wait one second */
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* INITIALIZE THE DISPLAY
*********************************************************************************************************
*/
static void TaskStartDispInit (void)
{
/* 1111111111222222222233333333334444444444555555555566666666667777777777 */
/* 01234567890123456789012345678901234567890123456789012345678901234567890123456789 */
PC_DispStr( 0, 0, " uC/OS-II, The Real-Time Kernel ", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
PC_DispStr( 0, 1, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 2, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 3, " EXAMPLE #1 Task Management ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 4, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 5, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 6, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 7, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 8, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 9, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 10, "Task0() : ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 11, "Task1() : ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 12, "Task2() : ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 13, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 14, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 15, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 16, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 17, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 18, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 19, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 20, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 21, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 22, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 23, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 24, " <-PRESS 'ESC' TO QUIT-> ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);
/* 1111111111222222222233333333334444444444555555555566666666667777777777 */
/* 01234567890123456789012345678901234567890123456789012345678901234567890123456789 */
}
/*$PAGE*/
/*
*********************************************************************************************************
* CREATE TASKS
*********************************************************************************************************
*/
static void TaskStartCreateTasks (void)
{
INT8U i;
INT8U err;
for (i = 0; i < N_TASKS; i++) { /* Create tasks */
TaskData[i] = i; /* Each task will display its own information */
}
OSTaskCreate(Task0, (void *)&TaskData[0], &TaskStk[0][TASK_STK_SIZE - 1], 5);
OSTaskCreate(Task1, (void *)&TaskData[1], &TaskStk[1][TASK_STK_SIZE - 1], 6);
OSTaskCreate(Task2, (void *)&TaskData[2], &TaskStk[2][TASK_STK_SIZE - 1], 7);
err=OSTaskSuspend(6); /* 确保每个任务运行时其他任务被挂起
err=OSTaskSuspend(7);
}
/*$PAGE*/
/*
*********************************************************************************************************
* TASK #0
*
* Description: This task is suspended by itself,then it will be resumed by other tasks.
*********************************************************************************************************
*/
void Task0 (void *pdata)
{
INT8U i;
INT8U err;
i=*(int *)pdata;
for (;;) {
PC_DispStr( 14, 10, "task0 is running. ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 14, 11, "task1 is suspended. ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 14, 12, "task2 is suspended. ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSTimeDly(200);
err=OSTaskResume(6);
err=OSTaskSuspend(5); /* suspend itself */
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* TASK #1
* Description: This task resume task0
*/
void Task1 (void *pdata)
{
INT8U i;
INT8U err;
i=*(int *)pdata;
for (;;) {
OSTimeDly(200);
PC_DispStr( 14, 10, "task0 is suspended. ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 14, 11, "task1 is running. ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 14, 12, "task2 is suspended. ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSTimeDly(200);
err=OSTaskResume(7); /* resume task0 */
err=OSTaskSuspend(6);
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* TASK #2
*
* Description: This task resume task0
*********************************************************************************************************
*/
void Task2 (void *pdata)
{
INT8U i;
INT8U err;
i=*(int *)pdata;
for (;;) {
OSTimeDly(200);
PC_DispStr( 14, 10, "task0 is suspended. ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 14, 11, "task1 is suspended. ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 14, 12, "task2 is running. ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSTimeDly(200);
err=OSTaskResume(5); /* resume task0 */
err=OSTaskSuspend(7);
}
}
实验截图:
实验感想
通过这次实验使我掌握μC/OS-II 中任务管理的基本方法(挂起、解挂),首先在主函数中创建初始任务OSTaskCreate,执行OSTaskCreate后,在调用TaskStartCreateTasks ,在TaskStartCreateTasks实现3 个应用任务T0、T1 和T2循环挂起和唤醒,每个任务运行时要保证其他任务被挂起,而且要在挂起之前唤醒下一个任务。显示设置可以修改TaskStartDispInit函数或者在Task0 Task1 Task2修改。
实验名称:粉体真密度的测定粉体真密度是粉体质量与其真体积之比值,其真体积不包括存在于粉体颗粒内部的封闭空洞。所以,测定粉体的真密度…
研究生实验报告范本实验课程实验名称实验地点学生姓名学号指导教师范本实验时间年月日一实验目的熟悉电阻型气体传感器结构及工作原理进行基…
实验报告课程名称物证技术学实验项目名称捺印手印样本指纹显现提取班级与班级代码074213070853实验室名称或课室法学实验教学中…
滁州市政府组织退耕还林(黑体,小二,1.5倍行距,段前段后0.5行)——5060451007范雪花(学号,TimesNewRoma…
科学实验报告单1科学实验报告单2科学实验报告单3科学实验报告单4九完小科学实验报告单10九完小科学实验报告单11九完小科学实验报告…
缺氧的类型及影响缺氧耐受性的因素浙江中医药大学中七一班沈维20xx1220xx01009摘要目的复制小鼠乏氧性缺氧模型观察温度中枢…
分析报告分析内容水中物质的检测及分析方法分析地点实验室一概述工业水中含有各种无机物和有机物此外还含有悬浮颗粒物微生物等地下水中的化…
实验报告示例实验题目1不同给药途径对药物作用的影响家兔硫酸镁法2钙镁拮抗作用实验目的观察不同给药途径对药物作用的影响观察钙镁的拮抗…
水中钙镁含量的测定实验报告试验时间20xx0411报告人武伟一目的要求1掌握配位滴定的基本原理方法和计算2掌握铬黑T钙指示剂的使用…
钙镁同补的研究进展湖南微量元素研究所李以暖钙为生命之本是人体内含量最多的矿物元素它构成了人体的支架其99存在于骨骼和牙齿中处于软组…
植物营养的拮抗与协同作用作者光合尚品HGY一营养元素的分类一必需营养元素营养元素在植物体内的含量不同所引起的作用也不同有些是偶然进…