新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 極小資源單片機調度器

        極小資源單片機調度器

        作者: 時間:2016-11-11 來源:網絡 收藏
        版本一、
        1. /****小小調度器開始**********************************************/
        2. #define MAXTASKS 2
        3. static unsigned char timers[MAXTASKS];
        4. unsigned char currdt;
        5. #define _SS static unsigned char _lc; switch(_lc){default:
        6. #define _EE ;}; _lc=0; return 255;
        7. #define WaitX(tickets)do {_lc=__LINE__+((__LINE__%256)==0); return tickets ;} while(0); case __LINE__+((__LINE__%256)==0):
        8. #define RunTask(TaskName,TaskID) do { if (timers[TaskID]==0) timers[TaskID]=TaskName(); }while(0);
        9. #define CallSub(SubTaskName) do { _lc=__LINE__+((__LINE__%256)==0); return 0; case __LINE__+((__LINE__%256)==0):currdt=SubTaskName(); if(currdt!=255) return currdt;} while(0);
        10. #define UpdateTimers() unsigned char i; for(i=MAXTASKS;i>0 ;i--){if((timers[i-1]!=0)&&(timers[i-1]!=255)) timers[i-1]--;}
        11. #define SEM unsigned int
        12. //初始化信號量
        13. #define InitSem(sem) sem=0;
        14. //等待信號量
        15. #define WaitSem(sem) do{ sem=1; WaitX(0); if (sem>0) return 1;} while(0);
        16. //等待信號量或定時器溢出, 定時器tickets 最大為0xFFFE
        17. #define WaitSemX(sem,tickets)do { sem=tickets+1; WaitX(0); if(sem>1){ sem--;return 1;} } while(0);
        18. //發送信號量
        19. #define SendSem(sem)do {sem=0;} while(0);
        20. /*****小小調度器結束*******************************************************/
        21. sbit LED1 = P2^1;
        22. sbit LED2 = P2^2;
        23. void InitT0()
        24. {
        25. TMOD = 0x21;
        26. IE |= 0x82;// 12t
        27. TL0=0Xff;
        28. TH0=0XDB;//22M---b7;
        29. TR0 = 1;
        30. }
        31. void INTT0(void) interrupt 1 using 1
        32. {
        33. UpdateTimers();
        34. TL0=0Xff; //10ms 重裝
        35. TH0=0XDB;//b7;
        36. }
        37. voidtask1(){
        38. _SS
        39. while(1){
        40. WaitX(50);
        41. LED1=!LED1;
        42. }
        43. _EE
        44. }
        45. voidtask2(){
        46. _SS
        47. while(1){
        48. WaitX(100);
        49. LED2=!LED2;
        50. }
        51. _EE
        52. }
        53. void main()
        54. {
        55. InitT0();
        56. while(1){
        57. RunTask(task1,0);
        58. RunTask(task2,1);
        59. }
        60. }
        版本二、
        在IAR6.7下編譯通過。(選用:Misra C 2004)

        /****小小調度器開始**********************************************/
        #define MAXTASKS 3U
        volatile static unsigned char timers[MAXTASKS];
        #define _SS static unsigned char _lc=0U; switch(_lc){case 0U:
        #define _EE break; default:break;}_lc=0U;return 255U;
        #define WaitX(tickets) _lc=(unsigned char)(__LINE__)%255U+1U;if(_lc){return (tickets);}break; case ((unsigned char)(__LINE__)%255U)+1U:

        #define RunTask(TaskName,TaskID)do {if (timers[(TaskID)]==0U){ timers[(TaskID)]=(TaskName)(); } } while(0)
        #define RunTaskA(TaskName,TaskID) { if (timers[(TaskID)]==0U) {timers[(TaskID)]=(TaskName)(); continue;} } /*前面的任務優先保證執行*/

        #define CallSub(SubTaskName) do {unsigned char currdt; _lc=(unsigned char)(__LINE__)%255U+1U; if(_lc) {return 0U;} break; case (unsigned char)(__LINE__)%255U+1U:currdt=(SubTaskName)(); if(currdt!=255U) {return currdt;}} while(0);
        #define InitTasks() do {unsigned char i; for(i=MAXTASKS;i>0U ;i--) {timers[i-1U]=0U;} } while(0)
        #define UpdateTimers() do { unsigned char i;for(i=MAXTASKS;i>0U ;i--){ if(timers[i-1U]!=0U){ if(timers[i-1U]!=255U) { timers[i-1U]--;} } }} while(0)

        #define SEM unsigned int
        /*初始化信號量*/
        #define InitSem(sem) (sem)=0;
        /*等待信號量*/
        #define WaitSem(sem) do{ (sem)=1; WaitX(0); if ((sem)>0) return 1;} while(0);
        /*等待信號量或定時器溢出, 定時器tickets 最大為0xFFFE*/
        #define WaitSemX(sem,tickets)do { (sem)=(tickets)+1; WaitX(0); if((sem)>1){ (sem)--;return 1;} } while(0);
        /*發送信號量*/
        #define SendSem(sem)do {(sem)=0;} while(0);

        /*****小小調度器結束*******************************************************/


        static unsigned char task0(void){
        static int i;
        _SS
        for(i=0;i<11;i++){
        WaitX(10U);
        }
        _EE
        }

        static unsigned char task1(void){

        _SS
        while(1){
        WaitX(10U);
        }
        _EE
        }

        static unsigned char task2(void){

        _SS
        while(1){
        WaitX(10U);
        }
        _EE
        }

        void InitT0()
        {
        TMOD = 0x21;
        IE |= 0x82;// 12t
        TL0=0Xff;
        TH0=0XDB;
        TR0 = 1;
        }

        void INTT0(void) interrupt 1 using 1
        {
        TL0=0Xff; //10ms 重裝
        TH0=0XDB;//b7;
        UpdateTimers();

        RunTask(task0,0);//任務0具有精確按時獲得執行的權限,要求:task0每次執行消耗時間<0.5個 ticket
        }

        int main(void)
        {
        InitT0();
        InitTasks();
        while(1){
        RunTaskA(task1,1);//任務一具有比任務二優先執行的權限
        RunTaskA(task2,2);
        }
        }


        關鍵詞: 單片機調度

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 绥化市| 夏河县| 镇原县| 绥中县| 金山区| 泸定县| 仁布县| 墨玉县| 辽宁省| 原阳县| 安远县| 崇州市| 纳雍县| 商城县| 海原县| 贵德县| 龙口市| 栾城县| 永胜县| 长乐市| 阳泉市| 平昌县| 交口县| 泸水县| 东阳市| 赫章县| 芷江| 滨海县| 桐梓县| 北京市| 蚌埠市| 从江县| 都兰县| 岳普湖县| 蒙城县| 博兴县| 抚州市| 遂川县| 阿荣旗| 尼勒克县| 香格里拉县|