新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 建立一个属于自己的AVR的RTOS

建立一个属于自己的AVR的RTOS

作者:时间:2011-04-29来源:网络收藏

TIMSK|=(1TOIE0);//T0溢出中断允许
TCNT0=100;//置计数起始值

}

SIGNAL(SIG_OVERFLOW0)
{
IntNum++;//中断嵌套+1
sei();//在中断中,重开中断

unsignedchari;
for(i=0;iOS_TASKS;i++)//任务时钟
{
if(TCB[i].OSWaitTickTCB[i].OSWaitTick!=0xffff)
{
TCB[i].OSWaitTick--;
if(TCB[i].OSWaitTick==0)//当任务时钟到时,必须是由定时器减时的才行
{
OSRdyTbl|=(0x01i);//使任务可以重新运行
OSCoreState|=0x02;//要求任务切换的标志位
}
}
}
TCNT0=100;
cli();
IntNum--;//中断嵌套-1
IntSwitch();//进行任务调度
}


unsignedchar__attribute__((progmem))proStrA[]=Task;

unsignedcharstrA[20];

SIGNAL(SIG_UART_RECV)//串口接收中断
{
strA[0]=UDR;
}


/////////////////////////////////////串口发送

unsignedchar*pstr_UART_Send;
unsignedintnUART_Sending=0;

voidUART_Send(unsignedchar*Res,unsignedintLen)//发送字符串数组
{
if(Len>0)
{
pstr_UART_Send=Res;//发送字串的指针
nUART_Sending=Len;//发送字串的长度
UCSRB=0xB8;//发送中断使能
}
}


//SIGNAL在中断期间,其它中断禁止

SIGNAL(SIG_UART_DATA)//串口发送数据中断
{

IntNum++;//中断嵌套+1,不充许中断

if(nUART_Sending)//如果未发完
{
UDR=*pstr_UART_Send;//发送字节
pstr_UART_Send++;//发送字串的指针加1
nUART_Sending--;//等待发送的字串数减1
}
if(nUART_Sending==0)//当已经发送完
{
OSSemPost(0);
OSCoreState|=0x02;//要求任务切换的标志位
UCSRB=0x98;
}
cli();//关发送中断
IntNum--;
IntSwitch();//进行任务调度
}


voidUARTInit()//初始化串口
{
#definefosc8000000//晶振8MHZUBRRL=(fosc/16/(baud+1))%256;
#definebaud9600//波特率
OSCCAL=0x97;//串口波特率校正值,从编程器中读出
//UCSRB=(1RXEN)|(1TXEN);//允许发送和接收
UCSRB=0x98;
//UCSRB=0x08;
UBRRL=(fosc/16/(baud+1))%256;
UBRRH=(fosc/16/(baud+1))/256;
UCSRC=(1URSEL)|(1UCSZ1)|(1UCSZ0);//8位数据+1位STOP位
UCSRB=0xB8;
UDR=0;
}


//打印unsignedint到字符串中00000
voidstrPUT_uInt(unsignedchar*Des,unsignedinti)
{
unsignedcharj;
Des=Des+4;
for(j=0;j5;j++)
{
*Des=i%10+’0’;
i=i/10;
Des--;
}
}

voidstrPUT_Star(unsignedchar*Des,unsignedchari)
{
unsignedcharj;
for(j=0;ji;j++)
{
*Des++=’*’;
}
*Des++=13;
}

unsignedintstrPUT_TaskState(unsignedchar*Des,
unsignedcharTaskID,
unsignedcharNum)
{
//unsignedinti=0;
*(Des+4)=’0’+TaskID;
strPUT_uInt(Des+6,Num);
strPUT_Star(Des+12,TaskID);
return12+TaskID+1;
}

voidTask0()
{
unsignedintj=0;
while(1)
{
PORTB=j++;
if(OSTaskSemPend(0,0xffff))
{
unsignedintm;
m=strPUT_TaskState(strA,OSTaskRunningPrio,j);
UART_Send(strA,m);
}
OSTimeDly(200);
}
}

voidTask1()
{
unsignedintj=0;
while(1)
{
PORTC=j++;
if(OSTaskSemPend(0,0xffff))
{
unsignedintm;
m=strPUT_TaskState(strA,OSTaskRunningPrio,j);
UART_Send(strA,m);
}
OSTimeDly(100);
}
}

voidTask2()
{
unsignedintj=0;
while(1)
{
if(OSTaskSemPend(0,0xffff))
{
unsignedintm;
m=strPUT_TaskState(strA,OSTaskRunningPrio,j);
UART_Send(strA,m);
}
PORTD=j++;
OSTimeDly(50);
}
}



voidTaskScheduler()
{
OSSched();
while(1)
{
}
}


intmain(void)
{
strlcpy_P(strA,proStrA,20);
UARTInit();
TCN0Init();

OSRdyTbl=0;
IntNum=0;
OSTaskCreate(Task0,Stack[99],0);
OSTaskCreate(Task1,Stack[199],1);
OSTaskCreate(Task2,Stack[299],2);
OSTaskCreate(TaskScheduler,Stack[399],OS_TASKS);
OSStartTask();
}

本文引用地址:http://www.eepw.com.cn/article/172857.htm


结束语


本文中的例子,基本上用Win和Proteus调试仿真成功,一定可能存在某些方面的缺陷,因为工作上时间的压力,就没有进一步查找。


上一页 1 2 3 4 5 6 下一页

评论


相关推荐

技术专区

关闭