1. 程式人生 > >uc/os-ii任務排程的鎖定與解鎖

uc/os-ii任務排程的鎖定與解鎖

排程器上鎖函式OSSchedlock()的功能是用於禁止任務排程,使任務保持對CPU的控制權。排程器開鎖函式OSSchedUnlock()的功能是解除對任務排程的禁止。
排程器上鎖和開鎖的實現原理是:對全域性變數鎖定巢狀計數器OSLockNesting進行操作,OSLockNesting跟蹤OS SchedLock() 函式被呼叫的次數,允許巢狀深度達255層。排程器上鎖即對變數OSLockNesting進行加1操作,開鎖即對變數OSLockNesting進行減1操作。

  • 排程器鎖定函式OSSchedLock()
void  OSSchedLock (void)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
OS_CPU_SR cpu_sr = 0; #endif if (OSRunning == OS_TRUE) { /* Make sure multitasking is running */ OS_ENTER_CRITICAL(); if (OSIntNesting == 0) { /* Can't call from an ISR */ if (OSLockNesting
< 255u) { /* Prevent OSLockNesting from wrapping back to 0 */ OSLockNesting++; /* Increment lock nesting level */ } } OS_EXIT_CRITICAL(); } }
  • 排程器解鎖函式OSSchedUnlock()
    由於OSSchedUnlock()函式是被某任務呼叫的,在排程器上鎖期間,可能會有事件發生並使一個更高優先順序的任務進入就緒態,因此當OSLockNesting
    減到零時,OSSchedUnlock() 必須呼叫OSSched() 函式,但是這種呼叫還必須滿足另一個前提,也就是呼叫者不是中斷服務子程式。
void  OSSchedUnlock (void)
{
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr = 0;
#endif
    if (OSRunning == OS_TRUE) {                            /* Make sure multitasking is running        */
        OS_ENTER_CRITICAL();
        if (OSLockNesting > 0) {                           /* Do not decrement if already 0            */
            OSLockNesting--;                               /* Decrement lock nesting level             */
            if (OSLockNesting == 0) {                      /* See if scheduler is enabled and ...      */
                if (OSIntNesting == 0) {                   /* ... not in an ISR                        */
                    OS_EXIT_CRITICAL();
                    OS_Sched();                            /* See if a HPT is ready                    */
                } else {
                    OS_EXIT_CRITICAL();
                }
            } else {
                OS_EXIT_CRITICAL();
            }
        } else {
            OS_EXIT_CRITICAL();
        }
    }
}

最後一點注意,OSSchedLock()OSSchedUnlock()必須成對呼叫。上鎖後必須要記住解鎖。使用時務必非常謹慎,因為它們影響μC/OS-Ⅱ對任務的正常管理。  
當一個任務呼叫OSSchedLock()以後,應用程式不得使用任何系統呼叫將該任務掛起。因為排程器一旦上鎖,系統就被鎖住,其它任何任務都不能執行。這些系統呼叫包括OSTaskSuspend(OS_PRIO_SELF)OSMboxPend()OSQPend()OSSemPend()OSTimeDly()OSTimeDly HMSM()等,直到OSLockNesting回零為止。

相關推薦

uc/os-ii任務排程鎖定

排程器上鎖函式OSSchedlock()的功能是用於禁止任務排程,使任務保持對CPU的控制權。排程器開鎖函式OSSchedUnlock()的功能是解除對任務排程的禁止。 排程器上鎖和開鎖的實現原理是:對全域性變數鎖定巢狀計數器OSLockNesting進行操作

uC/OS-II任務排程中判斷最高優先順序

一、任務優先順序的表示    uC/OS-II中,規定最多可以有64個任務。每個任務的優先順序不能相同,因此,優先順序為0~63.數字越小,優先順序越高,那麼0就是最高優先順序,63就是最低優先順序。系統保留了優先順序最高及最低的各4個,因此使用者不能使用這8個優先順序作為自己的任務的優先順序。巨集OS_L

uC/OS-II任務排程之就緒表及最高優先順序任務判定演算法

uC/OS-II是Jean J. Labrosse設計的完整的、可移植、可固化、可裁剪的搶佔式實時多工核心,絕大部分程式碼都是用標準的C語言編寫的,開源、規模不大,比較適合初次接觸嵌入式作業系統的人員

uc/os-ii任務排程(二)

任務排程關鍵是任務執行環境的切換。任務執行環境包括以下: 1. 程式的斷點地址(PC) 2. 程式狀態字暫存器(xPSR) 3. 通用暫存器內容 4. 任務堆疊指標(SP) 其中1、2、3儲存在任務堆疊中,4儲存在任務的任務控制塊中。 程式切換的關鍵

uc/os-II的記憶體改進實現TLSF演算法的詳,移植實現(二)

上一節講到了TLSF的資料結構,下面繼續哈。 TLSF用兩個層次的分類對不同尺寸的記憶體塊進行分類。第一層次的類別目錄為2n,n為4,5,……,31的整數,稱為FLI(First-level Segregated Fit)。每一個FLI類別又根據第二層的SLI細分為2SLI

UC/OS-II 任務的狀態

uc/os是一個搶佔式多工的實時作業系統,每個任務都有各自的狀態,並且狀態之間都有一定的轉換關係。寫下此文以作記錄及幫助自己理清關係。 在uc/os-ii中,任務的狀態有5種:睡眠態、就緒態、執行態、等待態及中斷服務態。通過下圖可以有一個大致的認知: 最

uC/OS-II任務機制理解

        半年前接觸的uC/OS,看了兩個月之後又因為其他的事把他放下了。現在因為專案需要又把它重拾起來。         uC/OS----Micro Controller OS微控制器作業系

uC/OS II 函式說明之訊號量操作相關的六個函式

    if (OSIntNesting > 0) {                           /* ISR中,不允許此操作                           */        *err = OS_ERR_PEND_ISR;                        

centos鎖定賬戶

 3、鎖定賬號 newuser1   # usermod -L newuser1   4、解除對 newuser1 的鎖定   # usermod -U newuser1 如何檢視賬戶被鎖定

資料庫鎖定

在進行資料同步時導致資料庫被鎖,可以自己檢視鎖情況和解鎖 下面介紹方式 select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.sess

uC/OS-II任務同步通訊

在多工合作過程中的,作業系統應解決兩個問題:一是各任務之間應具有一種互斥關係,即對於某個共享資源的共享,如果一個任務正在使用,則其他任務只能等待,等到該任務釋放該資源以後,等待的任務之一才能使用它;二是相關的任務在執行上要有先後次序,一個任務要等其夥伴發來通知或建立了某個條件

uCOS-II中的任務切換-圖解多種任務排程時機問題

【@.1 任務排程時機】 之前的一篇文章分析了具體的uCOS-II中的任務切換機制,是從函式呼叫的角度上分析的。這次我具體從整個程式執行的時間上來看,分析多種任務排程發生的時機。以下所有圖片均可點選放大觀察。 所有圖中紅色箭頭表示中斷級的任務切換,藍色箭頭表示任務級的中斷切換。 1.僅有一個任務,這種情況

uC/OS-II核心架構解析---uC/OS-II通訊同步

1. 訊息郵箱Mbox       Mbox用於多工間單一訊息的傳遞,uC/OS-II使用ECB管理Mbox的基本資訊,OSEventPtr指向建立Mbox時指定的記憶體空間。事件的建立由具體的事件管理程式實現。主要包含在C原始檔OS_MBOX.C中。 OS_EVENT

uc/os-ii刪除任務

uC/OS-II中與刪除任務相關的函式有兩個,刪除任務函式OSTaskDel() 和請求刪除任務函式OSTaskDelReq() 。 刪除任務函式原始碼如下,主要工作: 判斷引數的有效性 把要刪除的任務從任務就緒表中刪除 使被刪除的任務不等待延時期滿 ,

uC/OS II 函式說明 之–OSTaskCreate()OSTaskCreateExt()

#if OS_ARG_CHK_EN > 0    if (prio > OS_LOWEST_PRIO) {             /* 引數檢查,優先順序是否處於允許優先順序之內     */        return (OS_PRIO_INVALID);    }#endif    OS_E

嵌入式實時作業系統uc-os-ii原理及應用 第三章 uc/os-ii中的任務

3.1-3.4.3  印象比較深的點在作業系統中程式叫做程序或執行緒。系統任務:空閒任務和統計任務。不同處理器,堆疊的增長方向不同。實時作業系統,時間操作必須為常量,所以不能用for,配合break或continue。不然每個任務執行時間不同。

uC/OS-III 任務(四)

uC/OS系統的任務一般都放在最開始介紹,我放在第四章主要是對模糊的概念作清晰的講解。 從使用者的角度來看,uC/OS-III 中的任務可以分為5 種狀態,分別是休眠態、就緒態、執行態、掛起態和中斷態,如下表所示。      任務狀態之間的具體切換情況如下圖所示。  

比特幣的鎖定指令碼指令碼

鎖定指令碼:這筆錢傳送給A(包含A的共鑰); 解鎖指令碼:我是A,這筆錢是我的;   鎖定指令碼:我要驗證你的身份; 解鎖指令碼:這個是我用我的私鑰簽名的上一筆交易資訊的簽名;   礦工: 1、使用解鎖指令碼關聯的公鑰的地址的hash資訊與鎖定指令碼的地址hash比較; 2

百度海量日誌處理:任務排程實踐優化

作者簡介 運小軍 百度高階研發工程師 負責百度運維部大規模日誌處理、海量事件資料儲存相關設計研發工作,在分散式系統架構、大資料儲存計算、高效能網路服務和即時通訊服務有廣泛實踐經驗。 乾貨概覽 本文主要介紹百度運維部監控架構團隊在處理大規模日誌計算任務時,為保證任務分配均勻性和穩定性,對原始一致性雜湊

uC/OS-II訊息佇列及操作

使用訊息佇列可在任務之間傳遞多條訊息,訊息佇列由三部分組成:事件控制塊、訊息佇列和訊息。 事件控制元件塊成員OSEventPtr指向一個叫做佇列控制塊(OS_Q)的結構,該結構管理著一個數組MsgTb1[],該陣列中的元素都是指向訊息的指標。一. 訊息佇列的操作 1. 建立