UC/OS II多任务切换例程

#include "config.h"

#define    TaskStkLengh    64            
OS_STK    TaskStk [TaskStkLengh];        
OS_STK    TaskStk1 [TaskStkLengh];
OS_STK    TaskStk2 [TaskStkLengh];

OS_EVENT  *TASK1;         
OS_EVENT  *TASK2;    
OS_EVENT  *TASK3;   

void     Task0(void *pdata);            //Task0 ÈÎÎñ0
void     Task1(void *pdata);    
void     Task2(void *pdata);   

uint8 err;
void  UART0_Ini(void)
{  uint16 Fdiv;

   U0LCR = 0x83;                    
   Fdiv = (Fpclk / 16) / UART_BPS;  
   U0DLM = Fdiv / 256;                            
   U0DLL = Fdiv % 256;                        
   U0LCR = 0x03;

void  UART0_SendByte(uint8 data)
{  U0THR = data;                    // ·¢ËÍÊý¾Ý

   while( (U0LSR&0x40)==0 );        // µÈ´ýÊý¾&Yacute
}

int main (void)
{
    OSInit  
();                                                                                                        
    OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 0);     
    TASK1=    OSSemCreate(0);
    TASK2=    OSSemCreate(0);  
    TASK3=    OSSemCreate(0);     
    TargetInit(); 
    OSStart ();
    return 0;                                                            
}
/*********************************************************************************************************
**                            Task0 ÈÎÎñ0
********************************************************************************************************/

    void Task0    (void *pdata)
{
    UART0_Ini();
        OSTaskCreate(Task1, (void *)0, &TaskStk1[TaskStkLengh-1], 9); 
        OSTaskCreate(Task2, (void *)0, &TaskStk2[TaskStkLengh-1], 10); 
        OSSemPost(TASK1);       
        for (;;)
        {     
              OSSemPend(TASK1,10,&err    
             if(err==OS_NO_ERR)
               {
                     
               UART0_SendByte(0x01);              
               OSSemPost(TASK2);
            }
       
        }
}
/*********************************************************************************************************
**                            Task1 ÈÎÎñ1
********************************************************************************************************/


    void Task1    (void *pdata)
{
    
        UART0_Ini();
        for (;;)
        {
             OSSemPend(TASK2,10,&err);    
             if(err==OS_NO_ERR)
             {        
            
               UART0_SendByte(0x02); 
            
               OSSemPost(TASK3);  

             }
       
        }
}


    void Task2    (void *pdata)
{
    
        UART0_Ini();
        for (;;)
        {
             OSSemPend(TASK3,10,&err);//»&    
             if(err==OS_NO_ERR)
               {
                      
               UART0_SendByte(0x03); 
             
               OSSemPost(TASK1);
             }
       
        }
}

三个任务分别通过UART0输出0X01,0X02,0X03,可以学习理解信号量的基本用法及多任务的调度方法.
以上例子基于LPC2200系列ARM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值