互斥信号量AB两个任务程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/**************************************************************************** 【文件名称】main.c

【功能描述】互斥信号量实验代码

【程序版本】2.0

【创建人及创建日期】昆明理工王老师//2013-12-13 16:30

【修改人及修改日期】

****************************************************************************/ #include "grobal.h"

/************************任务、堆栈、优先级定义***************************/ OS_STK Main_Task_Stack[STACKSIZE_M];

void Task_Main( void *Id ) ;

#define Main_Task_PRIO 4

OS_STK Task_A_Stack[STACKSIZE_M];

void Task_A( void *Id ) ;

#define Task_A_PRIO 16

OS_STK Task_B_Stack[STACKSIZE_M];

void Task_B( void *Id ) ;

#define Task_B_PRIO 15

OS_EVENT *LED_Mutex; //LED互斥信号量

void Main(void)

{

char Id0 = '1';

U8 err;

SystemInit();

Delay(5000);//延时等待有效复位

Led( OFF ) ;

Led_Set(0x00);//关闭底板LED

Uart_Printf("\n\n昆明理工大学...\n\n");

OSInit();

//创建LED互斥信号量

LED_Mutex = OSMutexCreate(13,&err) ;

if ( err != OS_NO_ERR);

Uart_Printf( "创建LED_Mutex失败,错误码%d\n\0", err ) ;

//创建主任务

OSTaskCreate(Task_Main, (void *)&Id0,

(OS_STK *)&Main_Task_Stack[STACKSIZE_M-1], Main_Task_PRIO);

OSStart();

}

void Task_Main(void *p_arg)

{

char Id1 = '2';

char Id2 = '3';

U16 ver ;

(void)p_arg;

Uart_Printf("uCOS-II实时操作系统初始化...\n");

OSTimeSet(0);

Uart_Printf("uCOS-II实时操作系统时钟设定.\n");

ver = OSVersion();

Uart_Printf("uCOS-II实时操作系统版本:%d\n",ver);

Uart_Printf("\nuCOS-II实时操作系统开始运行...\n");

Uart_Printf("请注意串口输出及LED灯闪烁,\0");

Uart_Printf("注意AB两个任务之间消息传递及调度关系!\n\n");

TimersStart();

OSTimeDly(20);

OSTaskCreate( Task_A, (void *)&Id1, (OS_STK *)&Task_A_Stack[STACKSIZE_M-1], Task_A_PRIO);//底板LED组显示任务

OSTaskCreate( Task_B, (void *)&Id2, (OS_STK *)&Task_B_Stack[STACKSIZE_M-1], Task_B_PRIO );//核心板LED显示任务

for( ; ; )

{

OSTaskSuspend(OS_PRIO_SELF) ; //挂起当前任务直至其他任务或中断置起信号量

}

}

/****************************************************************************** 【功能说明】A任务

*****************************************************************************/ void Task_A( void *Id )

{

U8 err;

U8 iCnt = 0;

U16 uCnt = 0;

InitPCA9554();//PCA9554初始化

while(1)

{

OSMutexPend (LED_Mutex,0,&err);

Uart_Printf( "A任务运行->%d\n",uCnt++ ) ;

for( iCnt = 0; iCnt <2; iCnt++ )

{

Led( OFF ) ;

Delay(2000); //将任务延时若干时钟节拍

Led( ON ) ;

Delay(2000); //将任务延时若干时钟节拍

}

OSMutexPost(LED_Mutex);

OSTimeDlyHMSM(0,0,3,0);

}

}

/****************************************************************************** 【功能说明】B任务

******************************************************************************/ void Task_B( void *Id )

{

U8 err;

U8 iCnt = 0;

U16 uCnt = 0;

while(1)

{

OSMutexPend (LED_Mutex,0,&err);

Uart_Printf( "B任务运行->%d\n",uCnt++ ) ;

for( iCnt = 0; iCnt < 3; iCnt++ )

{

Led( OFF ) ;

Delay(4000); //将任务延时若干时钟节拍

Led( ON ) ;

Delay(4000); //将任务延时若干时钟节拍

}

OSMutexPost(LED_Mutex);

相关文档
最新文档