/******************************************************************
Name: Lambda
Date: 2013.03.23
Desciption: 创建两个任务,任务1不断循环发送字符A到字符Z,通过
邮箱的方式传递数据给任务2,任务2将从任务1收到的数据
通过串口打印在超级终端里。
*******************************************************************/
#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的堆栈
OS_EVENT *TxMbox; //定义一个邮箱,用来传递发送消息
OS_EVENT *AckMbox; //定义一个邮箱,用来传递应答消息
void TaskStart(void *pdata);
static void TaskStartCreateTasks(void);
void Task1(void *pdata);
void Task2(void *pdata);
/**********************************************************
Main函数
**********************************************************/
int Main(void)
{
TargetInit(); //目标板初始化
OSInit(); //uC/OS-II初始化
OSTimeSet(0); //设置系统时基,建议予以保留
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 7); //创建起始任务TaskStart
OSStart();
return 0;
}
/******************************************************************
起始任务函数TaskStart
*******************************************************************/
void TaskStart(void *pdata)
{
pdata = pdata; //防止编译器报警
TxMbox = OSMboxCreate( (void *)0 ); //创建一个邮箱,用来传递发送消息
AckMbox = OSMboxCreate( (void *)0 ); //创建一个邮箱,用来传递应答消息
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], 8); //创建功能任务Task1,优先级为8,不传递参数
OSTaskCreate(Task2, (void *)0, &Task2Stk[TASK_STK_SIZE - 1], 9); //创建功能任务Task2,优先级为9,不传递参数
}
/******************************************************************
功能任务函数Task1
*******************************************************************/
void Task1(void *pdata)
{
char TxMsg;
INT8U err;
pdata = pdata; //防止编译器报警
TxMsg = 'A';
while(1)
{
OSMboxPost(TxMbox, (void *)&TxMsg); //把消息A的指针通过邮箱TxMbox发送出去
OSMboxPend(AckMbox, 0, &err); //一直等待邮箱AckMbox收到应答信号,只有从任务2收到应答信号后才往下执行
TxMsg++; //循环发送字符A到字符Z
if(TxMsg > 'Z'){
TxMsg = 'A';
//OSTimeDlyHMSM(0,0,1,0); //去掉该函数才能正常打印,但打印速度会非常快; 添加后反而会挂死任务只能打印字符A,就不动了??
//此处的问题还请有经验的朋友指导一下啊。
}
}
}
/******************************************************************
功能任务函数Task2
*******************************************************************/
void Task2(void *pdata)
{
char *RxMsg;
INT8U err;
pdata = pdata; //防止编译器报警
while(1){
RxMsg = (char *)OSMboxPend(TxMbox,0,&err); //通过邮箱的方式从任务1处获得数据
Uart_SendString(RxMsg); //将获得的数据通过串口打印,Uart_SendString()函数在工程其它文件,此处未给出
OSMboxPost(AckMbox,(void *)1); //通过该邮箱发送应答信号给任务1,表明已成功接收到数据
}
}
阅读(8599) | 评论(2) | 转发(0) |