任务的基本管理 实验报告

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

x

实验题目任务的基本管理

学院名称:电子与信息工程学院

专业:x

1.实验目的:

理解任务管理的基本原理,了解任务的各个基本状态及其变迁过程;掌握µC/OS-II中任务管理的基本方法(创建、启动、挂起、解挂任

务);

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

2.实验内容:

为了展现任务的各种基本状态及其变迁过程,本实验需要各位设计两个任务:任务Task0控制2个LED,以0.5S为周期闪烁,任务Task1在Task0中创建,控制2个LED,以1S为周期闪烁,5S后Task1将自己删除。观察实验现象。

3.实验原理:

OSTaskCreate()建立一个新任务。任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立。中断处理程序中不能建立任务。一个任务可以为无限循环的结构。

函数原型:INT8U OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);

参数说明:task是指向任务代码首地址的指针。

Pdata指向一个数据结构,该结构用来在建立任务时向任务传递参数。OSTaskSuspend()

无条件挂起一个任务。调用此函数的任务也可以传递参数OS_PRIO_SELF,挂起调用任务本身。当前任务挂起后,只有其他任务才能唤醒被挂起的任务。任务挂起后,系统会重新进行任务调度,运行下一个优先级最高的就绪任务。唤醒挂起任务需要调用函数

OSTaskResume()。

OSTaskResume()

唤醒一个用OSTaskSuspend()函数挂起的任务。OSTaskResume()也是唯一能“解挂”挂起任务的函数。

4.实验步骤:

1.打开uCOS的空白模版

2.修改主程序使其达到实验内容的要求并仿真直至程序无误;

3.将程序烧入试验箱中,运行,观察实验结果;

5.实验程序:(省略头文件和部分定义)

1.删除任务:

/*任务1*/

static void LedTask1(void *p_arg)

{

#if OS_CRITICAL_METHOD == 3

OS_CPU_SR cpu_sr = 0;

#endif

OSTaskCreateExt((void (*)(void *)) LedTask2,

(void *) 0,

(OS_STK

*)&LED_2_Stk[APP_CFG_TASK_START_STK_SIZE - 1],

(INT8U ) LED_2,

(INT16U ) LED_2,

(OS_STK *)&LED_2_Stk[0],

(INT32U ) APP_CFG_TASK_START_STK_SIZE,

(void *) 0,

(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));

while (1)

{

OS_ENTER_CRITICAL();

OSTimeDlyHMSM(0, 0, 0,500);

LED_ON_16();

LED_ON_17();

OSTimeDlyHMSM(0, 0,0,500);

LED_OFF_16();

LED_OFF_17();

OS_EXIT_CRITICAL();

}

}

/*任务2*/

static void LedTask2(void *p_arg)

{

int i;

#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr = 0;

#endif

for(i=0;i<5;i++)

{

OS_ENTER_CRITICAL();

OSTimeDlyHMSM(0, 0, 1, 0);

LED_ON_18();

LED_ON_19();

OSTimeDlyHMSM(0, 0, 1, 0);

LED_OFF_18();

LED_OFF_19();

OS_EXIT_CRITICAL();

}

OSTaskDel(OS_PRIO_SELF);

}

2.挂起和恢复:

/*任务1*/

static void LedTask1(void *p_arg)

{

INT8U s=0;

#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr = 0;

#endif

OSTaskCreateExt((void (*)(void *)) LedTask2,

(void *) 0,

(OS_STK

*)&LED_2_Stk[APP_CFG_TASK_START_STK_SIZE - 1],

(INT8U ) LED_2,

(INT16U ) LED_2,

(OS_STK *)&LED_2_Stk[0],

(INT32U ) APP_CFG_TASK_START_STK_SIZE, (void *) 0,

(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));

while (1)

{

OS_ENTER_CRITICAL();

OSTimeDlyHMSM(0, 0, 0, 500);

LED_ON_17();

LED_ON_18();

OSTimeDlyHMSM(0, 0, 0, 500);

LED_OFF_17();

LED_OFF_18();

OS_EXIT_CRITICAL();

s++;

if(s==10)

OSTaskResume(LED_2);

}

}

/*任务2*/

static void LedTask2(void *p_arg)

{

INT8U n=0;

#if OS_CRITICAL_METHOD == 3

OS_CPU_SR cpu_sr = 0;

#endif

while (1)

{

OS_ENTER_CRITICAL();

OSTimeDlyHMSM(0, 0, 1, 0);

LED_ON_19();

LED_ON_20();

if(n==2)

OSTaskSuspend(LED_2);

OSTimeDlyHMSM(0, 0, 1, 0);

LED_OFF_19();

LED_OFF_20();

OS_EXIT_CRITICAL();

n++;

}

相关文档
最新文档