新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 混合式調(diào)度器C51源代碼及相關(guān)注釋

        混合式調(diào)度器C51源代碼及相關(guān)注釋

        作者: 時間:2012-05-12 來源:網(wǎng)絡(luò) 收藏

        uchar SCH_Add_Task(void (code * pFunction)(),const ushort DELAY, ushort PERIOD,bit Co_op)
        {
        uchar Index = 0;
        //首先在隊列中找到一個空隙(如果有的話,否則就不添加新任務(wù))
        while((SCH_tasks_G[Index].pTask != 0)(Index SCH_MAX_TASKS))
        {
        Index++;//當(dāng)一個新任務(wù)被添加,且沒有超過任務(wù)上限
        }
        //是否達(dá)到任務(wù)隊列的結(jié)尾?
        if(Index == SCH_MAX_TASKS)//任務(wù)數(shù)量達(dá)到上限
        {
        Error_code_G = ERROR_SCH_TOO_MANY_TASKS;
        return SCH_MAX_TASKS;//直接返回,不添加這個新任務(wù)
        }
        //如果能運行到這里,說明任務(wù)隊列中有空隙,添加任務(wù)。
        SCH_tasks_G[Index].pTask = pFunction;
        SCH_tasks_G[Index].Delay = DELAY;
        SCH_tasks_G[Index].Period = PERIOD;
        SCH_tasks_G[Index].Co_op = Co_op;
        SCH_tasks_G[Index].RunMe = 0;
        return Index;//返回任務(wù)的位置(以便以后刪除)
        }

        本文引用地址:http://www.104case.com/article/149077.htm

        void SCH_Dispatch_Tasks(void)
        {
        uchar Index;
        //(運行)下一個任務(wù)(如果有任務(wù)就緒)
        for(Index = 0;Index SCH_MAX_TASKS;Index++)
        {
        //只合作式任務(wù)
        if((SCH_tasks_G[Index].RunMe > 0)(SCH_tasks_G[Index].Co_op))
        {
        (*SCH_tasks_G[Index].pTask)();//執(zhí)行任務(wù)
        SCH_tasks_G[Index].RunMe -= 1;//清除任務(wù)需要執(zhí)行的標(biāo)志
        }
        //如果這是個“單次”任務(wù),將它從隊列中刪除
        if(SCH_tasks_G[Index].Period == 0)
        {
        SCH_tasks_G[Index].pTask = 0;// 比通過調(diào)用來刪除任務(wù)更快SCH_Delete_Task(Index);
        }
        }
        SCH_Report_Status();//報告系統(tǒng)狀況
        SCH_Go_To_Sleep();
        }

        void SCH_Start(void)
        {
        EA = 1;
        }

        bit SCH_Delete_Task(const ushort TASK_INDEX)
        {
        bit Return_code;
        if(SCH_tasks_G[TASK_INDEX].pTask == 0)
        {
        //這里沒有任務(wù)。。。設(shè)置全局錯誤變量
        Error_code_G = ERROR_SCH_CANOT_DELETE_TASK;
        Return_code = RETURN_ERROR;//返回錯誤代碼
        }
        else
        {
        Return_code = RETURN_NORMAL;
        }
        //刪除任務(wù)
        SCH_tasks_G[TASK_INDEX].pTask = 0x0000;
        SCH_tasks_G[TASK_INDEX].Delay = 0;
        SCH_tasks_G[TASK_INDEX].Period = 0;
        SCH_tasks_G[TASK_INDEX].RunMe = 0;
        return Return_code;
        }

        void SCH_Go_To_Sleep()
        {
        PCON |= 0x01;//進(jìn)入休眠模式
        }

        void SCH_Report_Status(void)
        {
        /* #ifdef SCH_REPORT_ERRORS
        if(Error_code_G != Last_error_code_G)
        {
        Error_Port = 255 - Error_code_G;
        Last_error_code_G = Error_code_G;
        if(Error_code_G != 0)
        {
        Error_tick_count_G = 60000;
        }
        else
        {
        Error_tick_count_G = 0;
        }
        }
        else
        {
        if(Error_tick_count_G != 0)
        {
        if(--Error_count_G == 0)
        {
        Error_code_G = 0;
        }
        }
        }
        #endif */
        }

        void LED_Flash_Update_A(void)
        {
        if(LED_State_G_A == 1)
        {
        LED_State_G_A = 0;
        LED_pin_A = 0;
        }
        else
        {
        LED_State_G_A = 1;
        LED_pin_A = 1;
        }
        }

        void LED_Flash_Update_B(void)
        {
        if(LED_State_G_B == 1)
        {
        LED_State_G_B = 0;
        LED_pin_B = 0;
        }
        else



        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 开化县| 宣汉县| 利津县| 瑞金市| 芜湖县| 岗巴县| 原平市| 宁远县| 平顺县| 垣曲县| 永嘉县| 延津县| 灵台县| 科尔| 宿州市| 呼玛县| 宿迁市| 黑河市| 淮安市| 兴城市| 留坝县| 卫辉市| 宣城市| 吉木萨尔县| 菏泽市| 清河县| 蓬安县| 无锡市| 刚察县| 洛宁县| 图木舒克市| 昭觉县| 阿拉善盟| 沂水县| 纳雍县| 叶城县| 房产| 孟津县| 临颍县| 淅川县| 广饶县|