#include "includes.h"
#include "global.c" 
void SystemInit();
void Timer1Init(); 
void OS_Tick() ;
extern unsigned int key();
extern unsigned int  num=0;
OS_STK Task0[OS_TASK_IDLE_STK_SIZE];
OS_STK Task1[OS_TASK_IDLE_STK_SIZE];
OS_STK Task2[OS_TASK_IDLE_STK_SIZE];
static void Task0(void *); 
static void Task1(void *);
static void Task2(void *);
/*******************************************************************************
*
* Routine :   main
*
*******************************************************************************/
void main(void)
 {
 int i;
        SystemInit();          //系统初始化
 OSInit();
 OSTaskCreate(Task0,(void *)&i,(void *)&Task0[0], 5);       
 OSTaskCreate(Task1,(void *)&i,(void *)&Task1[0], 10); 
 OSTaskCreate(Task2,(void *)&i,(void *)&Task2[0], 1); 
        OSStart(); 
 }
void Task0(void *i)
 {
    i=i;
    while (1)
     {    
        num=key();    //读键值
 
  if(num!=0)
                   OSTimeDly(20);   //若有键按下时,延时20个始终节拍
        }
    }        
/*******************************************************************************/
void Task1(void *j)
 {
     int i=i; 
     MCRA=MCRA & 0x80FF;      //IOPB0-6设为IO口模式
     PBDATDIR=0xBFC2;        //所有LED=0,并置IOPB6为输入口 
      
       while (1)
        {
      if(num==60)
     { PBDATDIR=PBDATDIR & 0xFFC7;        //将其他的led灭掉
   if((PBDATDIR & 0x0004)==0x0004) 
    PBDATDIR=PBDATDIR & 0xFFFB;    //IOPB2=0;LED1灭  
   else
    PBDATDIR=PBDATDIR |0x0404;     //IOPB2=1;LED1亮 
  }
      if(num==58)
     { PBDATDIR=PBDATDIR & 0xFFCB;
   if((PBDATDIR & 0x0008)==0x0008) 
    PBDATDIR=PBDATDIR & 0xFFF7;    //IOPB3=0;LED2灭  
   else
    PBDATDIR=PBDATDIR |0x0808;     //IOPB3=1;LED2亮 
  }
      if(num==54)
     { PBDATDIR=PBDATDIR & 0xFFD3;
   if((PBDATDIR & 0x0010)==0x0010) 
    PBDATDIR=PBDATDIR & 0xFFEF;    //IOPB4=0;LED3灭  
   else
    PBDATDIR=PBDATDIR |0x1010;     //IOPB4=1;LED3亮 
  }
      if(num==92)
     { PBDATDIR=PBDATDIR & 0xFFE3; 
   if((PBDATDIR & 0x0020)==0x0020) 
    PBDATDIR=PBDATDIR & 0xFFDF;    //IOPB5=0;LED4灭  
   else
    PBDATDIR=PBDATDIR |0x2020;     //IOPB5=1;LED4亮 
  }
        
     OSTimeDly(20);
       
        }        
 }
/*******************************************************************************/
void Task2(void *i)
 {
    i=i;
     Timer1Init();
     asm(" CLRC INTM "); 
    while (1)
     {    
        OSTimeDlyHMSM(1,0,0,0);
        }
    }        
/*******************************************************************************/
void SystemInit() 
{  
 
 asm(" SETC  INTM "); /* 关闭总中断 */
 asm(" CLRC  SXM  "); /* 禁止符号位扩展 */ 
 asm(" CLRC  CNF  ");    /* B0块映射为 on-chip DARAM*/
 asm(" CLRC  OVM  ");    /* 累加器结果正常溢出*/
 SCSR1=0x83FE;          /* 系统时钟CLKOUT=20*2=40M */
       /* 打开ADC,EVA,EVB,CAN和SCI的时钟,系统时钟CLKOUT=10M */
 WDCR=0x006F;   /* 禁止看门狗,看门狗时钟64分频 */ 
// KickDog();       /* 初始化看门狗 */  
    IFR=0xFFFF;    /* 清除中断标志 */
    IMR=0x0002;    /* 中断*/      
    
}  
void Timer1Init()           
{ 
    EVAIMRA=0x0080;   //  定时器1周期中断使能 
    EVAIFRA=0xFFFF;   //  清除中断标志 
    GPTCONA=0x0000;
 T1PR=25000;          //  定时器1初值,定时0.4us*25000=10ms    
 T1CNT=0;
 T1CON=0x144E;                   //增模式, TPS系数40M/16=2.5M,T1使能
    
}  
这是我在ucos下写的三个任务,按照我的想法,程序是这样运行:首先,建立3个任务,开始运行多任务OSStart(),在优先级最高的Task2启动时钟节拍,然后挂起1小时,接下来运行Task0读出按键的键值,当读出键值后任务挂起20个时钟节拍,接下来运行Task1,点亮相应的LED,挂起20个时钟节拍,程序进入空闲任务。等Task0延时时间完了后,又开始运行Task0,然后Task1,不断反复,直到1个小时后,运行Task2,再反复...
   示意图表示下: main()--OSStart()--task2--task0--task1--OSTaskIdle()--task0--task1--OSTaskIdle()
  但我通过设置断点发现实际程序运行顺序是:
     main()--OSStart()--task2--task0--task1--OSTaskIdle()--main()--OSStart()--task2--task0--task1--OSTaskIdle()
   感觉是不是设置断点影响了时钟节拍,导致运行顺序发生变化???????????????
   全速运行,观察运行效果,按一个键,对应LED亮,再按再亮,没有什么问题了。
   
   
大家所说自己意见?
[align=right][color=#000066][此贴子已经被作者于2007-4-29 9:39:20编辑过][/color][/align]