互斥信号量AB两个任务程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);