加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSSRSS-巴斯仪表网
您当前的位置:首页 > 电子发烧 > 单片机学习

UC/OS II多任务切换例程

时间:2013-09-03  来源:123485.com  作者:9stone

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


分享到:
来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
栏目导航->单片机学习
  • 电子应用基础
  • 电源技术
  • 无线传输技术
  • 信号处理
  • PCB设计
  • EDA技术
  • 单片机学习
  • 电子工具设备
  • 技术文章
  • 精彩拆解欣赏
  • 推荐资讯
    使用普通运放的仪表放大器
    使用普通运放的仪表放
    3V与5V混合系统中逻辑器接口问题
    3V与5V混合系统中逻辑
    数字PID控制及其改进算法的应用
    数字PID控制及其改进
    恶劣环境下的高性价比AD信号处理数据采集系统
    恶劣环境下的高性价比
    栏目更新
    栏目热门