作为一个刚接触uCOS-II的新手,在看了一些代码之后,萌生出写一个创建uCOS-II多任务的参考模版,虽然不是万能,但相信可以节省一点时间,也可以和大家一起交流。
其中如有错误之处,还望各位高手多多保函,还望指正,帮助我进步,谢谢。
/******************************************************************
Name: Lambda
Date: 2013.03.18
Description: 这是一个基于S3C2440的uCOS-II创建多任务的模板,只包含主程序程序代码
*******************************************************************/
#include "config.h"
#define TASK_STK_SIZE 512 //定义每个堆栈长度为512
OS_STK TaskStartStk[TASK_STK_SIZE]; //创建起始任务的堆栈
OS_STK Task1Stk[TASK_STK_SIZE]; //创建功能任务1的堆栈
OS_STK Task2Stk[TASK_STK_SIZE]; //创建功能任务2的堆栈
char TaskData; //定义功能任务传递的参数
OS_EVENT *MySem; //定义一个信号量
void TaskStart();
static void TaskStartCreateTasks(void);
void Task1(void *pdata);
void Task2(void *pdata);
/******************************************************************
main函数
*******************************************************************/
int main(void)
{
/*
该部分可添加代码
*/
OSInit(); //初始化uCOS,此时系统默认创建两个任务:空闲任务和统计任务,该两个任务优先级最低
MySem = OSSemCreate(1); //创建一个信号量,并初始化为1,即通知内核某一时刻只允许一个任务访问该函数
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 2); //创建起始任务TaskStart
OSStart(); //启动系统,将CPU权限交给uCOS-II
return 0;
}
/******************************************************************
起始任务函数TaskStart
*******************************************************************/
void TaskStart(void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
pdata = pdata; //防止编译器报警
/*
该部分可添加代码
*/
TaskStartCreateTasks(); //调用该函数来创建更多的功能任务
while(1) //所有的任务都应该是一个无限循环的过程
{
/*
该部分可添加代码
*/
OSTimeDlyHMSM(0,0,1,0); //将该任务挂起1秒,uCOS-II开始调度,让下一个就绪的最高优先级的任务运行
}
}
/******************************************************************
创建功能任务函数TaskStartCreateTasks
*******************************************************************/
static void TaskStartCreateTasks(void)
{
OSTaskCreate(Task1, (void *)0, &Task1Stk[TASK_STK_SIZE - 1], 3); //创建功能任务Task1,优先级为3,不传递参数
OSTaskCreate(Task2, (void *)&TaskData, &Task2Stk[TASK_STK_SIZE - 1], 4); //创建功能任务Task2,优先级为4,传递char类型的参数
}
/******************************************************************
功能任务函数Task1
*******************************************************************/
void Task1(void *pdata)
{
pdata = pdata; //防止编译器报警
while(1)
{
/*
该部分可添加代码
*/
OSTimeDly(1); //将该任务挂起1个时钟节拍,uCOS-II开始调度,让下一个就绪的最高优先级的任务运行
}
}
/******************************************************************
功能任务函数Task1
*******************************************************************/
void Task2(void *pdata)
{
INT8U err;
pdata = pdata; //防止编译器报警
while(1)
{
OSSemPend(MySem,0,&err); //Task2首先检查MySem信号量,并将查询信号量的指针作为参数传递给该函数;第二个参数表示超时时限,0表示无限期等待信号量
//MySem在建立时被初始化为1,并且没有其他任务使用该信号量,故可以立即得到该信号量并继续运行;若该信号量被其它任务使用
//则uCOS-II将挂起该任务并调度,找到下一个就绪的最高优先级,并使之运行
/*
该部分可添加代码
*/
OSSemPost(MySem); //释放信号量
OSTimeDly(1); //将该任务挂起1个时钟节拍,uCOS-II开始调度,让下一个就绪的最高优先级的任务运行
}
}
阅读(3952) | 评论(0) | 转发(0) |