新聞中心

        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.104case.com/article/172857.htm


        結束語


        本文中的例子,基本上用Win和Proteus調試仿真成功,一定可能存在某些方面的缺陷,因為工作上時間的壓力,就沒有進一步查找。


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

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 绵阳市| 安仁县| 称多县| 那坡县| 彰化县| 遂宁市| 洪洞县| 蒙城县| 丰都县| 高碑店市| 蒙山县| 肥乡县| 深泽县| 射阳县| 徐州市| 蚌埠市| 红安县| 禹州市| 高青县| 普陀区| 宝清县| 建宁县| 大安市| 逊克县| 吉木萨尔县| 甘南县| 同德县| 那坡县| 永修县| 西青区| 鲁甸县| 凤阳县| 宁河县| 漯河市| 剑川县| 邢台市| 固阳县| 宁安市| 新余市| 重庆市| 离岛区|