任务的基本管理 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++;
}