|
发表于 2010-5-15 01:12:09
|
显示全部楼层
我初学ucos,但是我怎么感觉LZ分享的代码有点问题呢,我把代码直接拿来(其中就把点灯的PB口改为了PA口)烧尽片中,发现根本没有反应,好像很多任务都没进去,刚好是当成一个学习过程,我就在原代码上做些自己认为对的改正,经过探索和调试,最后调出来了,所有任务经过标记,都表明正常进去了。把main 函数贴出来大家看看,有低级错误的话请大家指正。
#include <avr/io.h>
#include "ucos_ii.h"
OS_STK Task1Stk[OS_USER_TASK_STK_SIZE]={0};
OS_STK Task2Stk[OS_USER_TASK_STK_SIZE]={0};
OS_STK Task3Stk[OS_USER_TASK_STK_SIZE]={0};
OS_STK Task4Stk[OS_USER_TASK_STK_SIZE]={0};
OS_STK Task5Stk[OS_USER_TASK_STK_SIZE]={0};
volatile unsigned char t1=0;
volatile unsigned char t2=0;
volatile unsigned char t3=0;
volatile unsigned char t4=0;
volatile unsigned char t5=0;
volatile unsigned char t6=0;
OS_EVENT *T2sem=(OS_EVENT *)0;
OS_EVENT *Tmbox=(OS_EVENT *)0;
struct msgTask
{
unsigned char cnt;
unsigned char *s;
};
struct msgTask T5mbox={1,"Hello"};
struct msgTask *pMsgTsk=&T5mbox;
void Task1(void *pdata)
{
pdata=pdata;
TIMSK&=0xFC;
#if OS_TICKS_PER_SEC <= (F_CPU/1024/256)
#error "OS_TICKS_PER_SEC < (F_CPU/1024/256) "
#endif
OCR0=F_CPU/1024/OS_TICKS_PER_SEC;
TCNT0=0;
TCCR0=(1<<WGM01)|0x05;
TIMSK|=2;
DDRA|=(1<<0);
PORTA|=(1<<0);//测试防干扰
while(1)
{
t1++;
PORTA^=(1<<0);
OSTimeDly(20);//注意前后,是不是一调用OSTimeDly就开始挂起的??
//查了书之后知道这么理解是对的,所以该函数都应该
//在任务代码最后调用吧,不然其后的语句就不能执行了吧
//为什么原代码里基本都不是这么做的呢,很奇怪,是我错了??
}
}
void Task2(void *pdata)
{
unsigned char err=0;
pdata=pdata;
MCUCR=0x02;
GICR=0x40;
TCCR2=0x08; // CTC 模式, TOP=OCR2
OCR2=72; // 7372800/1024/72=100
TCCR2|=0x07; // 1024分频
TIMSK|=0x80; // 比较中断使能
PORTA|=(1<<1);
DDRA|=(1<<1);
while(1)
{
OSSemPend(T2sem,0,&err);//如果去掉该语句的话,就是说任务2不
//在依赖信号量,也就是中断0了,此时
//很容易执行任务,说明了框架是可信的
if(err==OS_NO_ERR)
{ PORTA&=~(1<<1);
t2++;
//如果能点亮的话,至少说明了中断0能进入··
//但是还有可能是由于干扰才进去的
//这可能是为什么总是会抖动的原因
}
if(err==OS_TIMEOUT)
{};
GIFR|=0x40;//外部中断0写1清标志位,还有之前防止其他中断来打断
//任务2
//OSTimeDly(10);
}
}
void Task3(void *pdata)
{
pdata=pdata;
//MCUCR|=0x02;
//GICR|=0x40;
while(1)
{
t3++;
DDRD|=0x04;//好吧,我承认这是传说中的,我没接触过的软件中断
PORTD|=0x04;//或者说明一下软件中断的概念
PORTD&=~0x04;//软中断其实就是一段程序,不是外部设备触发的
//而是程序安排的
OSTimeDly(4);
}
}
void Task4(void *pdata)
{
pdata=pdata;
MCUCR|=0x08;
GICR|=0x80;
while(1)
{
t4++;
DDRD|=0x08;
PORTD|=0x08;
PORTD&=~0x08;
OSTimeDly(8);
}
}
void Task5(void *pdata)
{
unsigned char err=0;
struct msgTask *p=( struct msgTask *)0;
pdata=pdata;
while(1)
{
p=( struct msgTask *)OSMboxPend(Tmbox,0,&err);
t5=p->cnt;
}
}
int main(void)
{
OSInit();
OSTaskCreate(Task1,0,&Task1Stk[OS_USER_TASK_STK_SIZE-1],1);
OSTaskCreate(Task2,0,&Task2Stk[OS_USER_TASK_STK_SIZE-1],2);
OSTaskCreate(Task3,0,&Task3Stk[OS_USER_TASK_STK_SIZE-1],3);
OSTaskCreate(Task4,0,&Task4Stk[OS_USER_TASK_STK_SIZE-1],5);
OSTaskCreate(Task5,0,&Task5Stk[OS_USER_TASK_STK_SIZE-1],4);
T2sem=OSSemCreate(0);
Tmbox=OSMboxCreate((void *)0);
OSStart();
} |
|