色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 程序的多任務(wù)和資源復用舉例

          程序的多任務(wù)和資源復用舉例

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

          程序的舉例

          有一臺機電設(shè)備,有兩個按鍵,控制設(shè)備的兩個不同部分。
          現(xiàn)要求:
           每個按鍵按下,相應(yīng)控制程序運行。但兩個按鍵可以同時按下,就是說兩個控制程序可能
          需要同時運行。使用一個89C52,如何編寫程序?

          注:此程序不使用RTOS等操作系統(tǒng)。


          /*程序說明:
           一)產(chǎn)生波形可以使用中斷中計數(shù)來產(chǎn)生精確的波形。
             本答案中為更能體現(xiàn)程序的問題,采用主程序循環(huán)產(chǎn)生。
           二)請?zhí)貏e注意,題意是兩個程序在并發(fā)運行,實際按本答案可以擴展到N個不同任務(wù)同時運行,在此就不討論。
             (對大程序結(jié)構(gòu)增加了很多其它的概念)
           三)因為在論壇上直接貼出,所以程序放在一個文件中。
             應(yīng)該按Timer.c, Key.c, Const.h(存放常量定義),Task1, Task2, Answer.c存放
          */
          #include REG52.h>

          /*Timer*/
          bit fTimer0_2ms;  /*T0中斷產(chǎn)生的標志,準備傳遞給主循環(huán)*/
          bit fSYS_2ms;   /*系統(tǒng)T0中斷產(chǎn)生的標志,12M,主循環(huán)使用*/
          bit fSYS_20ms;   /*每20MS產(chǎn)生一次的消息*/

          #define INT2MSCOUNT   10           /*產(chǎn)生2MS所需要的時間次數(shù)*/
          unsigned char data mTimer_2msReg=INT2MSCOUNT;  /*產(chǎn)生2MS所需要的寄存器*/
          #define INT20MSCOUNT  10           /*產(chǎn)生20MS所需要的時間次數(shù),在20MS基礎(chǔ)上*/
          unsigned char data mTimer_20msReg=INT20MSCOUNT; /*產(chǎn)生20MS所需要的寄存器,在20MS基礎(chǔ)上*/

          /*KEY*/
          unsigned char data mKey1SwapTask;  /***按鍵任務(wù)寄存器***/
          unsigned char data mKey2SwapTask;  /***按鍵任務(wù)寄存器***/
          sbit iKey1=P1^0;           /*按鍵的輸入口*/
          sbit iKey2=P1^1;

          bit fKey1;             /*為簡單化,沒使用隊列保存鍵值,使用標志*/
          bit fKey2;             /*為簡單化,沒使用隊列保存鍵值,使用標志*/


          /*Task1*/
          unsigned char data mTask1Id;    /*任務(wù)一的任務(wù)號*/
          unsigned char data mTask1_1HzReg;  /*1hz時間寄存器*/
          unsigned int data mTask1_2SReg;   /*2S時間寄存器*/
          sbit oTask1=P1^2;          /*輸出方波口*/

          /*Task2*/
          unsigned char data mTask2Id;    /*任務(wù)二的任務(wù)號*/
          unsigned char data mTask2_1p2HzReg; /*1.2hz時間寄存器*/
          sbit oTask2=P1^3;          /*輸出方波口*/

          /*---------------------------------------------------------------------------*/
          /*產(chǎn)生以1MS為基礎(chǔ)的系統(tǒng)定時信號,T0作為基準定時器*/

          /*************************************************
          定時器T0初始化0.2MS,12M
          *************************************************/
          void Timer0_Init()
          {
           TMOD|=0x2;      /*8位定時器*/

           TL0=TH0=~(200)+1;   /*12M*/

           TR0=1;
           ET0=1;
          }

          /*************************************************
          定時器0的中斷服務(wù),產(chǎn)生fTimer0_2ms
          *************************************************/
          void timer0(void) interrupt 1 /*T0中斷*/
          {
           mTimer_2msReg--;
           if(mTimer_2msReg==0){
            mTimer_2msReg=INT2MSCOUNT; /*產(chǎn)生1MS所需要的寄存器*/
            fTimer0_2ms=1;
           }
          }

          /*************************************************
          控制消息fSYS_2ms
          *************************************************/
          void Timer0_MainLoop()
          {
           fSYS_2ms=0;
           fSYS_20ms=0;

           if(fTimer0_2ms){
            fTimer0_2ms=0;       /*接收中斷過來的時間標志,轉(zhuǎn)換為消息*/
            fSYS_2ms=1;         /*此消息在一周內(nèi)有效,被外部程序復用*/
            /*產(chǎn)生20MS的消息*/
            mTimer_20msReg--;
            if(mTimer_20msReg==0){
              mTimer_20msReg=INT20MSCOUNT;  /*產(chǎn)生20MS所需要的寄存器,在20MS基礎(chǔ)上*/
              fSYS_20ms=1;
            }
           }
          }


          上一頁 1 2 3 下一頁

          關(guān)鍵詞: 多任務(wù) 資源復用

          評論


          相關(guān)推薦

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

          關(guān)閉