霡霂的个人空间 https://blog.eetop.cn/maimu [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

最简单易懂的UCOS多任务切换例程

已有 3363 次阅读| 2006-8-16 10:22 |个人分类:备份

天气: 晴朗
心情: 高兴

#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.


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 3

    粉丝
  • 1

    好友
  • 6

    获赞
  • 45

    评论
  • 3123

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-28 16:58 , Processed in 0.025906 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部