OSTimeTick 函式解析

2021-07-01 22:00:32 字數 1328 閱讀 1711

ucos v2.52

ostimetick()函式解析

呼叫處:os_cpu_a.asm裡_ostickisr

函式所有原始檔:os_core.c

**:void  ostimetick (void)

else   }

}ptcb = ptcb->ostcbnext;  /* point at next tcb in tcb list   */    //(10)

os_exit_critical();          //(11) }

} }內容解釋:

(1)進入臨界段, ostime++;

(2)如果os已開始執行(osstart()已執行,則執行if裡面的語句;

(3)遍歷ostcblist,直到idle task;

(4)進入臨界段

(5)如果ptcb->ostcbdly不為0,則需要處理

(6)--ptcb->ostcbdly,如果自減後為0

(7)如果任務不是由ostasksuspend()掛起的,由event掛起或只是ostimedly()掛起

(8)使該優先順序的任務處於就緒態

(9)如果任務是由ostasksuspend()掛起的,則 ptcb->ostcbdly重新置為1.

(10)得ostcblist鍊錶的下乙個os_tcb項。

(11)退出臨界段

1,重點解釋(9),為什麼的馬ostasksuspend()掛起的任務的ptcb->ostcbdly重新置為1呢?

對ostimetick()函式來說,ptcb->ostcbdly=0的task它不處理。

被ostacksuspend()掛起的任務,可以被ostaskresume()解除掛狀態,所以ostimetick()有義務持續檢測被掛起的任務,所以要保持ptcb->ostcbdly>0。

而對於非ostacksuspend()掛起的任務,不管是由event掛起或只是ostimedly()掛起,既然設定了超時時間,當ptcb->ostcbdly=0時就要置為就緒態。

2,(8)是如何使任務進入就緒態的呢?

首先,通過osrdygrp和osrdytbl[ptcb->ostcby]賦值,告知os此優先順序的任務已經準備就緒;

然後,在os_sched()裡尋找最高優先順序任務,做任務切換。

3,(5),

ptcb->ostcbdly!=0人有一種情況,此任務是等待狀態的任務。可是是因為

event掛起或只是ostimedly()掛起。

ptcb->ostcbdly=0有三種情況,一種是此任務是執行態的任務;第二種是此任務是就緒態的任務;第三種是此任務是等待狀態的任務,等待某個event,且timeout設定為0.

linux wait函式解析

程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序,wait 就會收集這個子程序的資訊,並把它徹底銷毀後返回 如果沒有找到這樣乙個子程序,wait就會一直阻塞在這裡,直到有乙個出現為止。wait 等待子程序中斷或結束...

matlab cov 函式解析

最近在用matlab 一直搞不懂cov 函式怎麼算出來了。從網上查了一下,結合一些程式例子總結如下 x 6 9 3 4 5 4 2 1 6 7 7 8 7 8 9 10 cov x ans 0.6667 1.3333 2.3333 3.0000 1.3333 4.6667 3.0000 5.0000...

strcpy函式解析

題目 已知strcpy函式的原型是 char strcpy char strdest,const char strsrc 1.不呼叫庫函式,實現strcpy函式。2.解釋為什麼要返回char 解說 1.strcpy的實現 char strcpy char strdest,const char str...