結語按照main函式的流程去閱讀原始碼。
1、哦,怎麼這麼大,首先是定義了個鉤子函式,在os_cpu_c.c由使用者實現。
2、initmisc雜七雜八的初始化,初始化變數是在ucos_ii.h定義或宣告的,巨集定義的是在os_cfg.h使用者配置檔案裡定義的。
補充:全域性變數定義前的os_ext
//os_core.c
#ifndef os_master_file
#define os_globals
#include "includes.h"
#endif
//ucos_ii.h
#ifdef os_globals
#define os_ext
#else
#define os_ext extern
#endif
3、initrdylist就緒值和就緒表,當前優先順序和最高優先順序,當前任務tcb指標和最高優先順序任務(就緒的嗎加上執行的)tcb指標統統清零。
4、inittcblist使任務塊鍊錶,任務塊指標陣列和空閒任務塊指標陣列統統清零。
5、直接蹦到初始化空閒任務和初始化統計任務,就堆疊方向和是否使用擴充套件的建立任務函式分為四種情況,堆疊首先要宣告成全域性變數,os_stk型別陣列,os_stk是堆疊入口寬度,和其他與處理器無關的型別都是在os_cpu.h裡typeof的。
空閒任務:
統計任務以及外加後面的其初始化函式,還沒看懂,涉及時鐘,不知道怎麼確保一秒鐘執行一次,os_ticks_per_sec使用者定義的。。。:
補充:1、關中斷函式,第三種方法,當前程式狀態暫存器的值儲存在區域性變數裡,最後再載入回來,防止本來是中斷關閉狀態反而最後開啟了中斷。是用彙編編寫的,在os_cpu.h裡巨集定義的。在呼叫系統函式前不要關中斷。任務至少要呼叫乙個任務掛起函式,讓出cpu使用權。
//os_core.c
#ifos_critical_method==3
os_cpu_sr cpu_sr;
#endif
os_enter_critical()
;os_exit_critical()
;
2、任務控制塊型別定義,目前只能看懂部分
設定中斷模式和中斷的開禁,不懂。
init建立了兩個函式,在啟動前還要建立乙個類似於啟動程式的乙個任務(且唯一,跟統計任務有關,為了讓他一秒鐘執行一次?),因為osrunning初始化為false,任務建立並不引起任務排程,類似啟動程式的任務裡:時鐘初始化和啟動,其次是初始化統計任務,再者呼叫建立其他任務系統函式。時鐘啟動不能早於多工啟動(不懂),也就是osstart的osstarthighrdy彙編函式,osrunning也是在這兒要變成true以及跳到類似於啟動程式的任務並且永遠不會返回main。
就緒表中找到最高的優先順序,然後把當前優先順序和最高優先順序(就緒的?),當前任務指標和最高優先順序(就緒的?)都置為該任務的。
補充:1、排程,不在中斷巢狀子程式,以及排程器沒有上鎖才可以切換任務。如果當前任務就是就緒表裡的(執行任務一直在就緒表。。。)。反正要準備出最高就緒任務優先順序及對應tcb指標,然後呼叫彙編函式切換。
2、排程上鎖 啟動之後再上鎖
3、排程解鎖 如果不在中斷巢狀子程式以及排程器沒有上鎖,就要進行任務切換。
第一次用,亂七八糟的,寫來給自己複習用的,爭取五天之內把源**看完。
1、目前任務切換時機,建立任務的時候以及解鎖排程器的某一狀態下要進行排程。
2、開關中斷很暈。
3、還有一些坑要填。
UCOS學習(2)任務簡介
本來想著第二篇記一下ucosiii的移植內容,中間學完ucosii的移植後,ucosiii斷檔了,所以沒跟上,因此就把移植這部分跳過了。雖然學習檔案下有現成好的移植環境,但總覺的還是少學了什麼東西,心裡不太舒服,廢話少說,開始吧!1.delay.c檔案 條件編譯 一般情況下,源程式中所有的行都參加編...
1606 例 1 任務安排 1
1606 例 1 任務安排 1 時間限制 1000 ms 記憶體限制 524288 kb 提交數 203 通過數 149 題目描述 有 n 個任務排成乙個序列在一台機器上等待執行,它們的順序不得改變。機器會把這 n 個任務分成若干批,每一批包含連續的若干個任務。從時刻 0 開始,任務被分批加工,執行...
第4周任務1
程式頭部注釋開始 程式的版權和版本宣告部分 檔名稱 sanjiaoxing.cpp 作 者 鄒議鵬 完成日期 2012 年 3 月 14 日 版 本 號 41.vc 對任務及求解方法的描述部分 輸入描述 問題描述 程式輸出 程式頭部的注釋結束 include include math.h using...