原创 ucos信号量的简单使用

2011-2-25 14:17 1656 4 4 分类: MCU/ 嵌入式
来源:瑞萨单片机论坛

#include "includes.h" 
OS_STK task_stack[10][100];      // 任务栈 
INT32U system_time;             // 系统时钟 
OS_TCB my_task_state;      // 任务状态 
OS_EVENT *semaphore;       // 信号量 
OS_EVENT *mailbox;         // 邮箱 
OS_EVENT *msg;             // 消息队列 
void *msg_queue[10]; 

OS_EVENT *tsk1;       // 信号量1 
OS_EVENT *tsk2;       // 信号量2 
OS_EVENT *tsk3;       // 信号量3 

void my_task1(void *pdata); 
void my_task2(void *pdata); 
void my_task3(void *pdata); 
void my_task4(void *pdata); 

void main(void) 

OSInit();        

// 用户程序中不能使用优先级0,1,2,3以及最低的四个优先级                 
    OSTaskCreate(my_task1, (void *)0, &task_stack[0][100 - 1], 7); 
OSTaskCreate(my_task2, (void *)0, &task_stack[1][100 - 1], 8); 
OSTaskCreate(my_task3, (void *)0, &task_stack[2][100 - 1], 9); 
// OSTaskCreate(my_task4, (void *)0, &task_stack[3][100 - 1], 9); 


// 任务的通信机制 
// 先建立相应的ECB,才能使用信号量,邮箱或者消息队列 

// 建立信号量,初始化为0,表示事件的发生 
// 如果大于0,则表示对共享资源的访问 
tsk1 = OSSemCreate(0);    // task1 <==> task3        
tsk2 = OSSemCreate(3);    // task1 <==> task2 
tsk3 = OSSemCreate(0);    // task2 <==> task3 

// mailbox = OSMboxCreate((void *)0);           // 建立邮箱 
// msg = OSQCreate(&msg_queue[0], 10);          // 建立消息队列 

    OSStart();     


void my_task1(void *pdata) 

INT32U i, j; 
INT8U err; 
pdata = pdata; 
start_os_time();     // 启动系统时钟 
OSSemPost(tsk1); // 向task1发送信号量 

while(1){ 
   // 等待一个信号量 
   // 如果信号量大于0,将信号量减1,置OS_NO_ERR,然后返回 
   // 如果信号量为0,将该任务挂起到信号量的等待任务列表中,然后任务调度 
   OSSemPend(tsk1, 0, &err);   
   if(err == OS_NO_ERR){ 
    for(j = 0; j < 6; j++){ 
     i = 6000000; 
     while(i--);    
     LED_Monitor1 ^= 1; 
    } 
    // 发送一个信号量,表示一个事件发生了 
    // 当信号量 >= 0时,将信号量加1 
    // 如果有任务等待该信号量,优先级最高的任务进入就绪态,然后任务调度 
    OSSemPost(tsk2); 
   }    

}       
        
void my_task2(void *pdata) 

INT32U i, j; 
INT8U err; 
pdata = pdata; 
   
while(1){ 
   // 等待来自task1的信号量 
   OSSemPend(tsk2, 0, &err); 
   if(err == OS_NO_ERR){ 
    for(j = 0; j < 6; j++){ 
     i = 6000000; 
     while(i--); 
     LED_Monitor2 ^= 1; 
    }   
    // 发送一个信号量,切换到task1 
    // task1从OSSemPend()里面的某处继续执行 
    OSSemPost(tsk3); 
   }   

}    
   
void my_task3(void *pdata) 

INT8U err; 
INT32U i, j; 
pdata = pdata; 
   
while(1){ 
   // 等待来自task2的信号量 
   OSSemPend(tsk3, 0, &err); 
   if(err == OS_NO_ERR){ 
    for(j = 0; j < 6; j++){ 
     i = 6000000; 
     while(i--); 
     LED_Monitor3 ^= 1;     
    } 
    OSSemPost(tsk1); 
   } 

}

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /3 下一条