在线情况
1
  • 头像
  • 级别
    • 积分30
    • 经验613
    • 文章57
    • 注册2011-01-31
    不带操作系统的程序,所有的代码、任务都是放在一个大循环下的。这种情况如果你的工程里任务不多,那问题不大。但如果你的项目是多任务,那你在最后组合程序的时候会比较棘手。因为你在单独调试每一个模块的时候,模块程序之间是相互独立的死循环。但最后你要把所有单独的模块任务整合到一个大循环下,这时会出现各种各样的问题。有时甚至程序结构都要调整。这个弊端任务越多越明显。

    但uCOS可以直接实现死循环和死循环之间的调用(通过设置各个任务的优先级与挂起时间)。这样一来,应对多任务的工程时会有以下好处:1、将多任务明确地模块化,使工程代码更规整,阅读与调试起来更方便,多任务代码的最后整合非常简单;2、使整个系统更稳定。(普通的程序,如果在哪一个任务那里陷入死循环或者跑飞,就会一直卡在那里,没法往下运行了。但uCOS不会,一个任务出现问题不会影响其他任务的进行。因为如果哪个任务死循环了,时间一到你反正要OUT,让其他进程运行的。)

    但记住,任何操作系统都是牺牲效率来换取其他方面的便利的。所以单任务或者任务较少时,不推荐用操作系统。只有在多任务实时调度时,uCOS才能发挥出它的优势
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
      • 积分30
      • 经验613
      • 文章57
      • 注册2011-01-31

      #include "includes.h"

      #define  TASK_STK_SIZE                  128       // 定义任务堆栈大小    
       
      OS_STK   TaskStartStk[TASK_STK_SIZE];
      OS_STK   Task1Stk[TASK_STK_SIZE];

      void   TaskStart(void *data);                    //前导声明任务(函数)
      void   Task1(void *data);                        // 任务 1

      void  main (void)
      {  
          WDTCTL = WDTPW + WDTHOLD;                              //禁止看门狗
       
          OSInit();                                              //初始化uCOS-II
          OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
          OSTaskCreate(Task1, (void *)0, &Task1Stk[TASK_STK_SIZE - 1], 3);
         
           
          OSStart();                                             //开始任务调度  
      }


      void  TaskStart (void *pdata)
      {
          pdata  = pdata;                                        // 无任何意义,防止编译器报警

          WDTCTL = WDT_MDLY_32;                                  //设置时钟节拍间隔为32ms    
          IE1   |= 0x01;                                         //开看门狗定时器中断        
          //_DINT();
          /*************************************
          *       应用程序初始化
          *************************************/
         for(;;)
         {    
            P3DIR=BIT0;
            P3OUT=BIT0;
            OSTimeDly(50);  
          }
      }

      void   Task1(void *pdata)                       
      {
          pdata  = pdata;                                        //防止编译器报警
          for(;;)
          {
            P3DIR=BIT1;
            P3OUT=BIT1;
            OSTimeDly(100);  
          }
      }

      微控网感谢您的参与
      在线情况
      3
      • 头像
      • 级别
        • 积分30
        • 经验613
        • 文章57
        • 注册2011-01-31
        这是我在ucos的main文件中写的一个简单实例的代码,就是完成两个LED交替发光。
        微控网感谢您的参与
        在线情况
        4
        • 头像
        • 级别
          • 积分30
          • 经验613
          • 文章57
          • 注册2011-01-31
          msp430f149,这段代码是IAR下的。说实话,处理器不同肯定不能直接照搬的,但是main文件都是一样的,区别在需要移植的那几个文件里。
          微控网感谢您的参与
          Powered by LeadBBS 9.2 .
          Page created in 0.2031 seconds with 7 queries.