ucos-ii学习笔记——首个多任务程序的创建
Created on: 2012-10-6
Author: zhang bin
学习笔记
for ucos-ii PC
redesigned by zhang bin
2012-10-6
versions:V-0.1
All Rights Reserved
#include "INCLUDES.h"
#define TASK_STK_SIZE 512
//定义两个任务的任务堆栈,每一个任务有一个任务堆栈
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_STK YouTaskStk[TASK_STK_SIZE];
INT8U x=0,y=0; //字符显示位置
//声明两个任务函数
void MyTask(void *data);
void YouTask(void *data);
void main (void)
{
char *s_m="L";
OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS, OSCtxSw);
//创建MyTask任务
OSTaskCreate(MyTask,s_m, &MyTaskStk[TASK_STK_SIZE - 1], 0); //创建起始函数
OSStart();
}
void MyTask(void *pdata)
{
char *S="C"; //定义要显示的字符
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT16S key;
pdata = pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
//在Mytask中创建任务YouTask
OSTaskCreate(YouTask,S, &YouTaskStk[TASK_STK_SIZE - 1], 2); //创建任务函数
//其实在这里创建任务YouTask,也会执行一次任务的调度,只不过YouTask的优先级没有MyTask的高,所以
//继续执行任务MyTask,详细说明请参见P119
for (;;)
{
if(x>=4) //每行显示4个字符
{
x=0;
y+=2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE); //显示L
x+=1;
//如果恩下ESC键,则退出UC/OS-II
if (PC_GetKey(&key) == TRUE)
{
if (key == 0x1B)
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0, 0, 3, 0); // Wait 3s 把cpu的控制权交出,让任务YouTask运行
//任务MyTask调用的延迟函数,延迟函数会从就绪表中删除当前任务,该任务就不再处于就绪状态
//然后会进行一次任务调度,执行下一个优先级最高的就绪任务
}
}
void YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 //Allocate storage for CPU status register
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
for (;;)
{
if(x>=4)
{
x=0;
y+=2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x+=1;
OSTimeDlyHMSM(0, 0, 1, 0); //等待1s,交出cpu的控制权,让任务Mytask运行
}
}
//因为MyTask的等待时间为3s,YouTask的等待时间为1s,所以MyTask每执行一次,YouTask执行3次
//程序运行的效果为每显示一个L,显示3个C
//因为在MyTask显示完L后就交出了cpu,所以YouTask会立马执行,显示一个C,所以看到的效果相当于L和第一个C同时显示
//以后两个C的显示间隔1s
//按时,分,秒,毫秒延时函数OSTimeDlyHMSM();实质上是调用了任务节拍延时函数,OSTimeDly();
//延时函数OSTimeDly();以时钟节拍数进行延时,在函数中,调用了OSSched();任务调度。
//因为在函数中,首先从就绪表中删除当前任务,最后再进行任务的调度。所以当任务调用了延迟函数后,那么该
//任务就处于等待状态了,交出了cpu的使用权。而最后的任务调度就会执行下一个优先级最高的就绪任务。
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) | Powered by Discuz! X3.4 |