实验二、uCOS-II的多任务机制及其编程

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

实验二、μC/OS-II的多任务机制及其编程

一、实验目的

1、熟悉μC/OS-II任务的基本概念;

2、掌握μC/OS-II的多任务机制以及多任务应用程序编程的基本步骤;

3、了解μC/OS-II操作系统中多任务函数的源码基本结构;

4、在实验一的基础上进一步熟悉μC/OS-II应用程序的烧录步骤。

二、实验设备

2.1硬件

本实验采用的奋斗版STM32 MINI开发板,该硬件的详细说明参见实验一指导书。

2.2软件

Windows XP/Windows 7、RealView MDK、μC/OS-Ⅱ版本2.86 与移植包、ST 官方标准库V3.2 版、STM32™ and STM8™Flash loader demonstrator,串口调试工具等。

三、实验内容

3.1 建立任务OSTaskCreate的使用

与实验一相同,本实验也是基于led_example_gui文件中的APP目录下的工程文件STM32-FD-ucgui.Uv2。在该项目中添加新文件app1.c,并在其中按下列要求编写代码。注意要将项目工程中app.c文件的main函数名字改掉,例如改为main1。该软件的主要功能是创建的任务,在任务中每隔20000个节拍的时间通过串口输出文字。源代码如下:

/** 案例一演示OSTaskCreate 函数的使用方法*/

#include "includes.h"

OS_STK Task1Stk[1024];

OS_STK Task2Stk[1024];

void Task1(void *pdata);

void Task2(void *pdata);

int main(int argc, char **argv)

{

CPU_INT08U os_err; /* 禁止所有中断*/

CPU_IntDis();

OSInit(); /* ucosII 初始化*/

BSP_Init(); /* 硬件平台初始化*/

OSTaskCreate(Task1, (void *)0, &Task1Stk[0],5);

OSTaskCreate(Task2, (void *)0, &Task2Stk[0],10);

OSStart();

return 0;

}

void Task1(void *pdata)

{

INT8U cnt = 0;

for(;;)

{

USART_OUT(USART1,"****** 任务1...\r\n");

OSTimeSet(20000);

}

}

void Task2(void *pdata)

{

for(;;)

{

USART_OUT(USART1,"******** 任务2...\r\n");

OSTimeSet(2000);

}

}

编译链接上述项目产生HEX文件。编译链接的方法在实验一中已有论述,如果程序出现错误,修改后继续编译。接下来就需要将该文件烧录到目标板中运行程序,烧录完成后拔掉电源,将【启动模式选择】插针插上,并且一定要关闭Flash Loader Demonstrator软件,否则该软件会一直占用串口。打开串口调试软件,接上电源就可以在串口调试软件观察到ARM板输出结果,如图1-1所示。同样道理,在烧录时也必须关闭串口调试软件。结果表明Task1一直在占用串口输出,Task2没有机会占用串口输出运行,这是因为Task1的优先级要高于Task2。要注意的是实际上Task2也在运行,请问如何验证Task2在运行中。

图2-1、任务1运行示意图

3.2优先级变更函数OSTaskChangePrio的使用

利用函数OSTaskChangePrio可以改变优先级低的任务的优先级,该函数的原型如下:INT8U OSTaskChangePrio(INT8U oldprio, INT8U newprio) 在上述程序app1.c中改变Task1的程序代码如下:

void Task1(void *pdata)

{

INT8U cnt = 0;

for(;;)

{

USART_OUT(USART1,"****** 任务1...\r\n");

OSTimeSet(20000);

if(cnt++ == 1000)

OSTaskChangePrio(10,3);

}

}

上述代码中的OSTaskChangePrio(10,3)就是将低优先级(优先级数为10)的任务改为高于Task1优先级的任务,将程序重新编译链接后烧录到ARM开发板中,运行程序的结果示意图如图2-2。从运行结果中可以看到Task1独占串口运行一段时间后,由于改变了Task2的优先级使得Task2有机会独占串口输出运行,所以输出了Task2的运行结果。

图2-2、改变优先级后Task2运行示意图

3.3删除任务函数OSTaskDel的使用

利用函数OSTaskDel可以删除某个任务,该函数的原型如下:

INT8U OSTaskDel(INT8U prio)

在上述程序app1.c中只要将OSTaskChangePrio(10,3)改为OSTaskDel(5)即可。程序的运行结果也是Task1运行一段时间后运行Task2,因此从输出结果来看完全一致,但在这里Task1已经处于休眠状态了。

图2-2、删除任务1后Task2运行示意图

相关文档
最新文档