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