嵌入式μCOS-II实验报告模板
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.1 多任务编程实验
3.1.1 实验目的
1. 本实验的目的是让学生了解uC/OS-II中怎样创建一个任务以及了解uC/OS-II的多任
务调度机制。
3.1.2 实验内容
1. 在Eg1的基础上新建一个任务;
2. 在该任务函数中打印提示信息。
3.1.3 预备知识
1. C语言的基础知识;
2. 程序调试的基础知识和方法。
3.1.4 实验设备
1. 硬件:JXARM9-2410教学实验箱、PC机;
2. 软件:PC机操作系统 Windows 98(2000、XP) + ADT IDE集成开发环境。
3.1.5 实验步骤
本章将以Eg1为基础,在其上添加一个任务。
1. 打开Eg1工程
打开examples/ucos工作区,并设置Eg1工程为活动工程。
然后打开App目录下的eg1.C 文件。
2. 声明任务栈
在eg1.c文件中声明任务堆栈,下面代码中黑体字表示的为新添加的代码:
/* task stack */
OS_STK StackLED[STACKSIZE]= {0, };
OS_STK StackSEG[STACKSIZE]= {0, };
OS_STK StackTEST[STACKSIZE]= {0, };
任务栈以全局变量的方式静态分配,然后在创建任务时使用。
3. 添加任务ID
/* task name string */
char IdLED = '1';
char IdSEG = '2';
char IdTEST = '3';
4. 任务函数声明
/* task entry function */
void TaskLED(void *Id);
void TaskSEG(void *Id);
void TaskTEST(void *Id);
5. 任务函数实现
在TaskSEG函数后添加如下函数:
/*
* Task entry function.
* this task blink the seg every 200 ticks
* that is 1s.
*/
void TaskTEST(void *Id)
{
uHALr_printf("Task3() called\n");
for (;;)
{
OSSchedLock();
uHALr_printf("Task%c() turned\n", *(char *)Id);
User_SEG_Blink();
OSSchedUnlock();
OSTimeDly(100);
}
}
在该函数中实现数码管显示,由于在TaskSEG中也进行了数码管显示,因此,请先将TaskSEG中的数码管显示功能关闭,以更好地看到效果,修改后的TaskSEG函数如下:void TaskSEG(void *Id)
{
uHALr_printf("Task2() called\n");
for (;;)
{
OSSchedLock();
uHALr_printf("Task%c() turned\n", *(char *)Id);
// User_SEG_Blink();
OSSchedUnlock();
OSTimeDly(100);
}
}
6. 创建任务
然后在Main函数中创建任务,添加TaskTEST的创建代码,如下所示:
/*
* create the tasks in uC/OS and assign increasing
* priorities to them so that Task3 at the end of
* the pipeline has the highest priority.
*/
OSTaskCreate(TaskLED, (void *)&IdLED, (OS_STK *)&StackLED[STACKSIZE - 1], 5);
/* Create seg blink tasks */
OSTaskCreate(TaskSEG, (void *)&IdSEG, (OS_STK *)&StackSEG[STACKSIZE - 1], 13);
/* Create test tasks */
OSTaskCreate(TaskTEST, (void *)&IdTEST, (OS_STK *)&StackTEST[STACKSIZE - 1], 15);
7. 编译
选择“Build”->“Rebuild All”功能编译工程,如果出现错误,修改代码,然后重新编译,直到成功。
8. 下载、调试
将该程序下载到JXARM9-2410教学系统中调试,并观察结果,原来在TaskSEG中进行数码管闪烁的功能转移到TaskTEST中。
如果将串口0连接到PC,在超级终端中还可以看到显示。
9. 修改
TaskTEST的优先级在所创建的任务中为最低,根据uC/OS-II的多任务调度策略,总是保证优先级最高的任务先执行,因此,高优先级的任务如果不主动让出CPU(在此程序中调用OSTimeDly将让出其参数中指定个数时钟节拍的CPU资源)资源,则更低优先级的任务将
无法获得CPU资源,在此程序中,如果将TaskSEG的OSTimeDly函数注释掉,那么TaskTEST 将无法获得执行,数码管也不会闪烁,修改后的TaskSEG函数如下:
void TaskSEG(void *Id)
{
uHALr_printf("Task2() called\n");
for (;;)
{
OSSchedLock();
uHALr_printf("Task%c() turned\n", *(char *)Id);
// User_SEG_Blink();
OSSchedUnlock();
// OSTimeDly(100);
}
}
观察实验结果。
如果将TaskTEST的任务优先级修改为比TaskSEG更高的话,TaskTEST将重新获得执行权,数码管将闪烁,如下所示:
/*
* create the tasks in uC/OS and assign increasing
* priorities to them so that Task3 at the end of
* the pipeline has the highest priority.
*/
OSTaskCreate(TaskLED, (void *)&IdLED, (OS_STK *)&StackLED[STACKSIZE - 1], 5);
/* Create seg blink tasks */
OSTaskCreate(TaskSEG, (void *)&IdSEG, (OS_STK *)&StackSEG[STACKSIZE - 1], 13);
/* Create test tasks */
OSTaskCreate(TaskTEST, (void *)&IdTEST, (OS_STK *)&StackTEST[STACKSIZE - 1], 12);。