亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? manual.txt

?? 51單片機的實時系統
?? TXT
?? 第 1 頁 / 共 3 頁
字號:
     的棧底是前一個任務的棧頂,因此其個數為OS_MAX_TASKS+1。考慮到
     第一個任務的棧底和最后一個任務的棧頂的值在運行時實際不會改變,
     OSTsakStackBotton可以減少兩個字節空間占用,但這樣程序復雜一些。

Small RTOS的移植:
(1)在os_cpu.h中定義幾個宏(以keil c51為例):

    #define  OS_INT_ENTER() OSIntNesting++                      /* 中斷嵌套管理             */
#define  OS_ENTER_CRITICAL()  EA = 0,Os_Enter_Sum++             /* 禁止中斷                                     */
#define  OS_EXIT_CRITICAL()   if (--Os_Enter_Sum==0) EA = 1     /* 允許中斷                                     */

    #define  HIGH_BYTE  0                                       /* uint16的高位字節         */
    #define  LOW_BYTE   1                                       /* uint16的低位字節         */

    #define  OS_TASK_SW()         OSCtxSw()                     /* 任務切換函數             */


    OS_ENTER_CRITICAL()、OS_EXIT_CRITICAL()分別定義為禁止和允
    許中斷在特定的c編譯器的表示方法。
    HIGH_BYTE、LOW_BYTE定義uint16型變量在特定的c編譯器的存儲方法,
    如果高位字節的地址小于低位字節的地址(如keil c51),則
    HIGH_BYTE為0,LOW_BYTE為1。否則(如8086系列),HIGH_BYTE為1,
    LOW_BYTE為0。
    OS_INT_ENTER則將變量OSIntNesting加1。它僅在中斷服務程序中使用。
    注意:如果中斷嵌套層數可能超過255,OS_INT_ENTER要防止
    OSIntNesting溢出。
    OS_TASK_SW()定義非中斷中任務切換時執行的指令,可以是一條軟中斷指
    令(例如在8086系列CPU上),或僅僅是函數調用(如keil c51)。

(2)定義與編譯器無關的變量類型(以keil c51為例):

    typedef unsigned char  uint8;                                   /* 定義可移植的無符號8位整數關鍵字            */
    typedef signed   char  int8;                                    /* 定義可移植的有符號8位整數關鍵字            */
    typedef unsigned int   uint16;                                  /* 定義可移植的無符號16位整數關鍵字           */
    typedef signed   int   int16;                                   /* 定義可移植的有符號16位整數關鍵字           */
    typedef unsigned long  uint32;                                  /* 定義可移植的無符號32位整數關鍵字           */
    typedef signed   long  int32;                                   /* 定義可移植的有符號32位整數關鍵字           */

(3)在os_cpu_c.c和os_cpu_a.asm中定義幾個函數:
    OSStart、OSIntCtxSw、OSTickISR和OS_TASK_SW()最終調用的函數
    或中斷。
    
    OSStart:初始化任務并讓ID為0的任務執行。同時允許中斷。
      定義如下:
    
                void OSStart(void)
        
        {
            初始化除ID為0以外所有任務堆棧;
            OSTaskID = 0;
            使堆棧指針指向ID為0的任務堆棧空間;
            OS_EXIT_CRITICAL();
            使程序指針指向ID為0的任務的程序首地址;
        }

    OSIntCtxSw:中斷中任務切換函數
      定義如下:

                void OSIntCtxSw(void)
        
        {
            堆棧指針調整為中斷程序調用OSIntExit前的狀態;
            堆棧空間變換;
            堆棧指針指向新的堆棧;
            OSTaskID = OSNextTaskID;
            恢復任務環境;
            中斷返回指令;
        }
        OSIntCtxSw由OSIntExit直接調用,堆棧指針調整為中斷程序調用
        OSIntExit前的狀態即為執行若干出棧指令。
        堆棧空間變換可以參照keilc51目錄下Os_cpu_c.c文件中被注釋的
        C_OSCtxSw函數,C_OSCtxSw還包括 堆棧指針指向新的堆棧.
        
    OSTickISR為系統節拍中斷服務程序
      定義如下:

               void OSTickISR(void)

        {
        #if TICK_TIMER_SHARING >1 
            static unsigned char TickSum=0;
        #endif

            禁止中斷;
            保存任務環境;

        #if TICK_TIMER_SHARING >1 
            TickSum = (TickSum + 1) % TICK_TIMER_SHARING;
            if (TickSum != 0)
            {
                允許中斷;
                恢復任務環境;
                return;
            }                
        #endif


        #if EN_OS_INT_ENTER >0 
            OS_INT_ENTER();                                     /* 中斷開始處理                                             */
        #endif
            允許中斷;
    
        #if USER_TICK_TIMER_EN == 1 
            UserTickTimer();                                    /* 用戶函數                                                 */
        #endif

        #if EN_TIMER_SHARING > 0
            OSTimeTick();                                       /* 調用系統時鐘處理函數                                     */
        #else
            OSIntSendSignal(TIME_ISR_TASK_ID);
        #endif
    
            OSIntExit();                                        /* 中斷結束處理                                             */
        }
    
      其中有一些CPU的禁止中斷和保存任務環境由CPU自動處理或是自動處
      理一部分。    

    OS_TASK_SW()最終調用的函數或中斷:非中斷中任務切換函數
      定義如下:

                void OS_TASK_SW(void)
        
        {
            保存任務環境;
            堆棧空間變換;
            堆棧指針指向新的堆棧;
            OSTaskID = OSNextTaskID;
            恢復任務環境;
            恢復程序指針;
        }
        
        
        
            
Small RTOS 51(for keil)的特殊說明:
  編譯器版本需求需求
      當不使用消息隊列時,需要Keil C51 V6.14以上版本。
      當使用消息隊列時,需要Keil C51 V7.00以上版本。
  目標系統需求
      Small RTOS 51可以在沒有任何外部數據存儲器的單片8051系統上運行
      但應用程序仍然可以訪問外部存儲器。Small RTOS 51可以使用C51支
      持的全部存儲器模塊,選擇記憶模型僅影響應用目標的位置。一般來說
      Small RTOS 51應用程序工作在小模式下。Small RTOS 51沒有按照
      bank switching 程序設計,不能使用code banking程序。
  可重入功能
      不允許從幾個任務或中斷過程調用非可再入C語言函數。
      非可再入C51函數將它們的參數和自動變量局部數據保存在靜態存儲器內
      因此當重復調用函數時這些數據會被改寫。非可再入C語言函數不可第歸
      調用,不可被多個任務同時調用,不可被一個或多個任務與一個或多個
      中斷同時調用。Small RTOS 51系統函數不會調用任何這樣的函數。那些
      僅使用寄存器作為參變量和自動變量的C語言函數總是可再入的而且可以
      從不同的Small RTOS 51任務中沒有任何限制的調用。C51編譯程序也提
      供可重入功能,參看“ C51 用戶手冊”以便獲得更多信息。可再入函數
      將他們的參變量和局部數據變量儲存到一個可再入堆棧內并且數據是被
      保護的以預防多重呼叫。然而如果你在你的應用程序中使用可再入函數
      你必須保證這些功能不呼叫任何Small RTOS 51系統函數。而且那些可再
      入函數不會被Small RTOS 51任務調度所中斷。特別注意一點,可再入堆
      棧不得放在內部RAM中。
  C51庫函數
      全部的可再入 C51 庫函數可以沒有任何限制的用于全部任務。非可再入
      c51庫函數與非可再入C語言函數在應用時有著同樣的限制。
  多數據指針和數學單元的用法
      c51 編譯程序允許你使用8051派生類型的多數據指針和數學單元。因為
      Small RTOS 51不包括任何對這些硬件的管理,最好你不要與Small 
      RTOS 51 一起使用這些器件。如果你可以保證在使用這些派生硬件的程
      序執行期間不會被任務調度中斷的話你可以使用多數據指針和數學單元。
  寄存器段
      Small RTOS 51分配全部任務到寄存器段0。因此全部的任務函數必須用
      c51的默認設置registerbank 0 編譯。不需要Small RTOS 51管理的
      中斷函數可以使用剩余的寄存器段。
  局部變量
      keil c51采用變量覆蓋的方法分配局部變量,而不是把局部變量分配到
      堆棧中,當在keil c51使用Small RTOS時,編譯系統會把各個任務的局
      部變量分配在同一塊內存,造成程序運行錯誤。因此,最多只能允一個
      任務函數與?CO?OS_CPU_C進行覆蓋分析,禁止任務函數與?CO?OS_CPU_C
      進行覆蓋分析的方法如下:
      在Progect->BL51 Misc->Overlay里填"?CO?OS_CPU_C~任務函數名,"
      每一項禁止一個任務函數。
      如果任務(包括任務調用的函數)沒有局部變量,可以不進行以上處理。
      注意參數也是局部變量。
      另外,用戶函數被多個任務或和中斷調用且不可重入(程序保證各個任
      務和中斷不同時調用此函數),它的局部變量不能與任何任務的局部變
      量覆蓋,應該禁止所有調用它的任務與之進行覆蓋分析,方法與上面一
      樣:
      在Progect->BL51 Misc->Overlay里填"任務函數名~用戶函數名,"。
      在進行以上處理后,會出現多條類似如下的警告:
      
      *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
          SEGMENT: ?PR?XXXX?XXX
      
      不用理會它.
      
      注意,以上最后一項不需要逗號。
  關于軟非屏蔽中斷
      當某個中斷對時間要求非常嚴格的時候,用戶可以使用軟非屏蔽中斷,使
      之不受Small RTOS 51關中斷的影響,但它也不再受OS管理。設置方法
      如下:
      (1)將這個中斷設置為最高優先級中斷,其它受OS管理的中斷優先級
      必須比它低。因此,標準51系列單片機就不需要中斷嵌套管理了。有些
      51單片機有超過2個中斷優先級,它們還需要中斷嵌套管理。
      (2)將OS_CPU.h中EN_SP2定義為1
      (3)將OS_CPU.h中宏OS_ENTER_CRITICAL()定義為類似 
           IE = IE & (~0x30)
      形式,其中0x30根據程序要求取值,為1的位為程序運行時需要打開且
      受OS管理的中斷。
      (4)將OS_CPU.h中宏OS_ENTER_CRITICAL()定義為類似 
           IE = IE | 0xb0
      形式,其中0xb0根據程序要求取值,為1的位為程序運行時需要打開且
      受OS管理的中斷。
      (5)將OS_CPU.h中Sp2Space定義合適大小(ISR使用堆棧最大值+2)。
      (6)將OS_CPU.h中宏SET_EA定義為類似
             orl     IE,#0b0h
      形式,其中0b0h根據程序要求取值,以允許程序運行時受OS管理的中斷
      可以中斷CPU。
      (7)在合適的時候允許或軟非屏蔽中斷。
      (8)軟非屏蔽中斷不允許調用OS_INT_ENTER()和OSIntExit(),因此,
      如果在軟非屏蔽中斷中調用OSIntSendSignal()使高優先級任務就緒,
      OS也不進行任務切換。作者不推薦在軟非屏蔽中斷中調用
      OSIntSendSignal()。

      

      
      
  其它注意事項
      1、通過調用系統函數進行任務切換,保存任務環境需要RAM空間為(2+到
         OSSched時的調用層次*2)字節。通過中斷進行任務切換保存任務環境
         需要RAM空間為(中斷發生時堆棧使用量+15)字節,這15字節包括
         R0~R7,ACC,B,PSW,DPH和DPL。而8051系列idata小(51只有128字節,
         52只有256字節),因此,當任務較多時,應該避免過多的通過中斷進
         行任務切換。
      2、OS_CPU.H 中的IDATA_RAM_SIZE應當與實際的idata相同。
      

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美三级视频在线观看| 欧美中文字幕久久| 亚洲成a人片在线观看中文| 久久综合色播五月| 91视频.com| 国产精品自拍av| 日日夜夜一区二区| 亚洲男同1069视频| 久久久国际精品| 日韩欧美一区二区久久婷婷| 91传媒视频在线播放| 国产在线播放一区| 日本亚洲天堂网| 亚洲国产精品人人做人人爽| 国产精品美女久久久久久久网站| 精品国产一区二区三区久久影院| 欧美裸体一区二区三区| 97国产一区二区| www.视频一区| 国产成人精品一区二区三区四区| 日本女优在线视频一区二区| 亚洲综合色区另类av| 亚洲人成精品久久久久| 国产精品福利av| 国产精品久久久久久妇女6080| 国产亚洲欧美激情| 久久久久一区二区三区四区| 精品久久久网站| 欧美成人女星排名| 日韩欧美国产不卡| 欧美一区二区高清| 91精品国产综合久久久蜜臀图片| 欧美艳星brazzers| 在线观看日产精品| 欧美三区免费完整视频在线观看| 欧美性视频一区二区三区| 色88888久久久久久影院按摩| 91免费版在线| 欧美综合色免费| 精品视频1区2区| 5月丁香婷婷综合| 欧美欧美午夜aⅴ在线观看| 欧美日韩和欧美的一区二区| 欧美色涩在线第一页| 欧美片网站yy| 日韩精品一区二区三区老鸭窝| 欧美成人猛片aaaaaaa| 精品捆绑美女sm三区| 久久久久久麻豆| 中文字幕精品在线不卡| 最近日韩中文字幕| 一卡二卡三卡日韩欧美| 亚洲成人在线观看视频| 蜜臀久久99精品久久久久久9| 精品在线一区二区三区| 成人激情黄色小说| 欧美亚洲日本一区| 欧美精品日韩精品| 精品国产乱码久久久久久蜜臀| 亚洲国产成人一区二区三区| 亚洲欧美日韩在线不卡| 午夜伊人狠狠久久| 久久99久久久久| 国产**成人网毛片九色 | 国产日韩v精品一区二区| 欧美国产丝袜视频| 亚洲一区二区三区免费视频| 日本va欧美va瓶| 国产大片一区二区| 色香蕉成人二区免费| 欧美精品日日鲁夜夜添| 亚洲精品一区二区三区四区高清| 亚洲国产精品av| 丝袜国产日韩另类美女| 国产精品一二三在| 欧美性三三影院| 精品99999| 玉米视频成人免费看| 久久国产精品露脸对白| 色综合天天综合网天天狠天天| 91精品国产综合久久福利软件| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲一区二区三区小说| 国产一区二区三区免费在线观看| 色噜噜狠狠成人中文综合| 日韩女同互慰一区二区| 亚洲人成小说网站色在线| 麻豆成人久久精品二区三区红| av一区二区三区四区| 91麻豆精品国产91久久久资源速度| 久久精品一级爱片| 一区二区三区四区精品在线视频| 久久国产精品免费| 欧美色倩网站大全免费| 中文字幕精品一区 | 成人av电影免费在线播放| 欧美美女bb生活片| 中文字幕制服丝袜一区二区三区| 日韩精品一区第一页| 99re6这里只有精品视频在线观看| 日韩三级精品电影久久久| 综合电影一区二区三区 | 成人午夜视频免费看| 日韩免费视频线观看| 亚洲成a天堂v人片| 91麻豆精品在线观看| 国产亚洲精品超碰| 日本少妇一区二区| 欧美体内she精视频| 亚洲国产精品av| 极品少妇xxxx精品少妇| 337p亚洲精品色噜噜噜| 一区二区三区在线高清| 99综合电影在线视频| 精品国产亚洲在线| 日本欧美一区二区三区| 在线精品观看国产| 一区二区三区欧美日韩| gogogo免费视频观看亚洲一| 久久久久国产精品厨房| 久久精品久久精品| 91精品国产丝袜白色高跟鞋| 亚洲成人动漫av| 欧美日韩免费不卡视频一区二区三区| 亚洲视频综合在线| www.日韩在线| 亚洲日本欧美天堂| 91视频一区二区| 亚洲视频免费观看| 色丁香久综合在线久综合在线观看| 国产精品成人一区二区艾草| 99在线热播精品免费| 国产精品久久影院| thepron国产精品| 国产精品系列在线| av影院午夜一区| 亚洲黄色av一区| 色天使色偷偷av一区二区| 亚洲人吸女人奶水| 一本久久a久久精品亚洲| 亚洲色图丝袜美腿| 96av麻豆蜜桃一区二区| 一区二区三区蜜桃网| 色综合天天视频在线观看| 亚洲色图制服丝袜| 在线精品视频一区二区| 天天影视色香欲综合网老头| 欧美色倩网站大全免费| 人人超碰91尤物精品国产| 欧美一级欧美三级在线观看| 免费av网站大全久久| 精品久久国产字幕高潮| 国产.欧美.日韩| 一区二区在线看| 337p亚洲精品色噜噜噜| 国产精品一级片| 最新国产成人在线观看| 欧美日韩国产一级二级| 看国产成人h片视频| 国产精品女主播在线观看| 91精彩视频在线| 丝袜美腿成人在线| 精品盗摄一区二区三区| 高清视频一区二区| 一区二区三区中文在线| 91麻豆精品国产自产在线| 国产高清一区日本| 亚洲黄网站在线观看| 91精品国产综合久久精品| 国产麻豆成人精品| 一区二区三区中文字幕精品精品 | 欧美一区日本一区韩国一区| 国产制服丝袜一区| 亚洲精品第1页| 欧美一级专区免费大片| 成人动漫一区二区三区| 日韩国产精品大片| |精品福利一区二区三区| 欧美电影在哪看比较好| 国产精品一区二区你懂的| 亚洲综合激情另类小说区| 精品国产乱码久久久久久图片| 色综合久久天天综合网| 美女精品自拍一二三四| 国产精品白丝在线| 日韩视频一区二区三区 | 欧美国产禁国产网站cc| 欧美日韩国产一二三| 成人免费看的视频| 男女男精品网站| 亚洲色图视频免费播放| 精品国产一区二区三区av性色| 日本精品免费观看高清观看| 国产不卡高清在线观看视频| 亚洲国产一二三| 久久久精品tv| 91精品欧美久久久久久动漫| 99精品久久免费看蜜臀剧情介绍| 波多野结衣在线一区| 日韩不卡在线观看日韩不卡视频|