/*--------------文件信息---------------------------------------------------------
* 文 件 名: main.c
* 创 建 人: lixiaoxu
* 创建日期: 2011年11月16日
* 描 述: 主程序C语言入口
* 说明:UCOS模板移植于 ZLG Company
*---------- 版本信息------------------------------------------------------------
* 版 本: V1.0
*
*-------------------------------------------------------------------------------*/
#include "includes.h"
/*********************************************************************************
任务优先级
**********************************************************************************/
#define TASK_START_PRIO 0
#define TASK_1_PRIO 10
#define TASK_2_PRIO2 11
#define TASK_3_PRIO3 12
/*********************************************************************************
任务堆栈大小
*********************************************************************************/
#define TASK_START_STK_SIZE 50 //定义任务堆栈大小
#define TaskStkLengh_32 32
#define TaskStkLengh_64 64
#define TaskStkLengh_128 128
#define TaskStkLengh_256 256
static OS_STK Task_Start_Stk[TASK_START_STK_SIZE];
static OS_STK Task_1_Stk[TaskStkLengh_64];
static OS_STK Task_2_Stk[TaskStkLengh_64];
static OS_STK Task_3_Stk[TaskStkLengh_64];
/********************************************************************************
定义任务 信号量 邮箱 消息队列
********************************************************************************/
OS_EVENT *AckSem;
OS_EVENT *Delay_Mbox;
/*******************************************************************************
函数声明
*******************************************************************************/
static void taskStart (void *pdata);
static void task1 (void *pdata);
static void task2 (void *pdata);
static void task3 (void *pdata);
/******************************************************************************
* 本工程实现功能:实现邮箱、信号量的使用
* 注意:
*
******************************************************************************/
int main (void)
{
OSInit(); //OS-II 初始化uC/OS-II的内核
OSTaskCreate ( taskStart,
(void *)0, //创建启动任务
&Task_Start_Stk[TASK_START_STK_SIZE-1],
TASK_START_PRIO );
OSStart(); //Start uC/OS-II 启动uC/OS-II
return(0) ;
}
/*********************************************************************************************************
** Function name: Task_Start
** Descriptions: Start task
** input parameters: *pdata
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
static void taskStart (void *pdata)
{
pdata = pdata;
Set_System(); //用于mcu的配置
OS_CPU_SysTickInit(); //启动系统SysTick 作为UCOS的时基
#if OS_TASK_STAT_EN > 0 //使能统计功能
OSStatInit();
#endif
//在这里创建 任务中所用到的 信号量 邮箱 消息队列
AckSem = OSSemCreate(0); //创建信号量
Delay_Mbox = OSMboxCreate((void *)0); //创建邮箱 由任务2向任务3发送LED闪烁间隔
// 在这里创建要使用的任务
OSTaskCreate (task1, (void *)0, //创建任务1
&Task_1_Stk[TaskStkLengh_64-1],
TASK_1_PRIO);
OSTaskCreate (task2, (void *)0, //创建任务2
&Task_2_Stk[TaskStkLengh_64-1],
TASK_2_PRIO2);
OSTaskCreate (task3, (void *)0, //创建任务2
&Task_3_Stk[TaskStkLengh_64-1],
TASK_3_PRIO3);
while (1)
{
OSTaskSuspend(OS_PRIO_SELF); //挂起启动任务,也可以删除
}
}
/*********************************************************************************************************
** Function name: task1
** Descriptions: 任务1
** input parameters: *pdata
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
static void task1 (void *pdata)
{
pdata = pdata;
while (1)
{
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0,GPIO_PIN_0); //点亮LED3
OSTimeDlyHMSM(0,0,0,500); //延时0.5秒
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0,~GPIO_PIN_0); //熄灭LED3
OSTimeDlyHMSM(0,0,0,500); //延时0.5秒
OSSemPost (AckSem); //发送信号量
}
}
/*********************************************************************************************************
** Function name: task2
** Descriptions: 任务2
** input parameters: *pdata
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
static void task2 (void *pdata)
{
INT8U err;
u8 time = 1;
pdata = pdata;
while (1)
{
OSSemPend (AckSem, 0, &err); //等待信号量
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1,GPIO_PIN_1); //点亮LED4
OSSemPend (AckSem, 0, &err); //等待信号量
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1,~GPIO_PIN_1); //熄灭LED4
OSMboxPost(Delay_Mbox, &time); //发送邮箱 邮箱信息为 1和6 交替发送
if(time ==6) time = 1;
else time = 6;
}
}
/*********************************************************************************************************
** Function name: task3
** Descriptions: 任务3
** input parameters: *pdata
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
static void task3 (void *pdata)
{
INT8U err;
u8 *RX_Mbox; //存放邮箱信息
pdata = pdata;
while (1)
{
RX_Mbox = OSMboxPend(Delay_Mbox, 0, &err); //接收邮箱信息
OSTimeDlyHMSM(0,0,*RX_Mbox,0); //延时x秒
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_1,GPIO_PIN_1); //点亮LED5
OSTimeDlyHMSM(0,0,*RX_Mbox,0); //延时x秒
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_1,~GPIO_PIN_1); //熄灭LED5
}
}
工程截图