os的核心運轉過程--空閒任務的建立及執行過程
os是如何運轉起來的?(一般情況下,不考慮系統的一些配置被修改).
1.系統變數常量配置
在程式的最開頭,先定義你需要的任務的堆疊大小,優先順序,此時cpu已經將系統的一些變數,常量儲存於實際實體地址了(例如任務堆疊)
#define .....
...2.執行到osinit();
首先是乙個主函式,cpu執行第乙個函式osinit();在這裡,cpu初始化一些系統變數的值,例如一些任務記數器等.
然後建立兩個基本的任務:空閒任務(cpu閒置時就連續執行此任務),統計任務(統計空閒任務,以便計算cpu的使用率).
void main(void)
3. 建立空閒任務的過程
3.1 ostaskstkinit(任務堆疊初始化函式)
根據任務函式入口,傳遞的引數,棧頂,選擇項,4個引數決定物理棧頂指標,這個棧裡還有其他引數,比如pc值,這些引數都儲存在這個物理棧裡,在任務開始執行時,將這些值取出,而當任務因為某種原因中斷了,則儲存這些值,這樣下次就能從中斷的那個狀態再次執行這個任務.
初始化堆疊,從棧頂依次壓入,任務函式入口,各個暫存器,這樣恢復任務的時候先恢復各個暫存器,最後才將任務函式入口壓入pc,從而執行任務
3.2 ostcbinit (初始化乙個任務控制塊)
將各個引數填入這個控制塊,並且生成乙個雙向任務鍊錶,每次初始化的任務控制塊將會新增入鍊錶的左端,這個雙向鍊錶在時鐘節拍中會用到.
最後在就緒表裡將此任務對應的位置一,表示這個任務已經就緒了.
3.3 如果以上都成功了,則任務記數器+1. 接下來會檢查osrunning,如果它為0,說明系統還未執行,這樣空閒任務就建立了,等待osstart 函式開始執行系統,如果osrunning 為1,說明系統已經執行,這樣就執行一次任務排程,任務排程的作用是,如果剛剛建立的任務優先順序最高,就執行這個任務. 以下分析任務排程函式
3.4 ossched(任務排程函式)
如果任務排程的條件成立,則將就緒表裡優先順序最高的任務賦予ospriohighrdy(等待執行裡優先順序最高的任務)(這個地方有個疑問:在這個地方執行完後,ospriohighrdy和ospriordy會變成什麼) 如果這個最高優先順序的任務還沒執行,那麼任務切換計數器+1,執行os_task_sw 任務切換函式. 接下來解析任務切換函式功能
3.5 os_task_sw(任務切換函式)
儲存處理器的值,將當前任務的堆疊指標儲存到當前任務的os_tcb , ostcbcur , ospriocur 賦予最高優先順序任務,堆疊指標賦予最高優先順序任務指標,將堆疊中的內容恢復,執行中斷返回指令,這樣就執行了最高優先順序任務了,這裡就是空閒任務.
3.6 ostickisr (時鐘節拍函式)
時鐘一到,儲存暫存器值,當前的堆疊指標sp賦予ostcbcur.ostcbstkptr,呼叫ostimetick()
ostimetick 節拍服務函式
將每個tcb中的.ostcbdly-1,如果ostcbdly為0了,任務原先也沒有被掛起,就將任務置為就緒態,如果原先被掛起,就先將ostcbdly為1.
REST介面開發的核心任務
分析一下上節的案例,可以發現,在開發rest api介面時,檢視中做的最主要有三件事 維基百科中對於序列化的定義 序列化 serialization 在電腦科學的資料處理中,是指將資料結構或物件狀態轉換成可取用格式 例如存成檔案,存於緩衝,或經由網路中傳送 以留待後續在相同或另一台計算機環境中,能恢...
過程管理的核心價值
好久沒有更新部落格了,最近看到了我早幾年整理的cmmi理解,覺的有些內容需要分享。文中直接引用了部分cmmi模型的原文 首先說說定義過程的目的 我們都知道有根據的 有質量的工作是十分重要的,但是當過程沒有被理解或者過程沒有工作在最佳狀態時,人是不能表現出他的最大工作效率的。我們一直強調過程並不是說人...
儲存過程及任務的建立
在sql下執行 oracle create or replace procedure procedure name as begin 語句塊 一般加個commit end mysql delimiter create procedure procedure name in out param1 in...