实验二uCOS-II的多任务机制及其编程.doc
文本预览下载声明
实验二、μ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运行示意图
优先级变更函数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)的
显示全部