UC/OS-II的學習

?? 粗略的的看了邵貝貝老師的那本書,感覺有點眉目。UC/OS-II的全局變量繁多,剛接觸的時候容易弄混淆,現在總結下:

?

?

OSRunning:??用于標識多任務環境是否已經開啟運行,在OSStart()函數里啟動任務后就置為True。

OSIntNesting:用于標識中斷嵌套層數。產生一次中斷可以調用OSIntEnter()函數使該值自增1,處理完一次中斷再調用OSIntExit()自減1。

OS_TCB:一個結構體變量,每建立一個任務都會為該任務指定一個OS_TCB,包含該任務的棧頂指針,任務優先級,任務狀態字,延時節拍等所有相關信息。每個任務的OS_TCB都存在于一個雙向鏈表內,并使變量OSTCBList指向最后建立的那個任務的OS_TCB。

OS_STK:任務堆棧,每個任務都有一個自己的堆棧空間,用于保存寄存器,狀態值,和任務的入口地址。這個堆棧與系統棧沒有什么關系,只是用戶為一個任務分配的存儲任務信息的空間,只需要是一個連續的存儲空間即可。

OSRdyGrp,OSRdyTbl[
]用于標識就緒的任務。uC/OS根據優先級唯一確定一個任務,也即一個優先級只能分配給一個任務。OSRdyTbl[ ]里保存(MAX_TASKS/8+1)個字節,每個字節又有8個Bit,從最低位開始分別對應0~LOWEST_PRIO優先級的任務,任務就緒時就將該任務的優先級所在Bit置1,否則清0。
OSRdyGrp完全是為了找到最高優先級方便而設立的,將OSRdyTbl[ ]里每個字節代表的8個任務劃為一個組,只要某一組內有就緒任務時,OSRdyGrp的相應位就置1。比如,只要OSRdyTbl[0]不為0,則OSRdyGrp的第0位就置1,依次類推。

OSPrioCur
:這是一個整型數,表示當前執行任務的優先級數。

OSPrioHighRdy:一個整型數,表示當前最高級別的就緒任務的優先級數。

OSTCBHighRdy:這是一個指針,它指向最高優先級就緒任務的OS_TCB。

OSTCBCur:一個指針,指向當前執行任務的OS_TCB。

OSTCBTbl[ ]初始化時建立的一塊存儲空間,一共建立了MAX_TASKS個OS_TCB空間。并令變量OSTCBFreeList總是指向下一個可用的OS_TCB空間。當新建立一個任務時,就將一個空的OS_TCB空間分配給它使用。

OSTCBPrioTbl[
]這是一個指針數組,用于保存就緒任務的OS_TCB地址,一共有MAX_TASKS個值,依次對應0~LOWEST_PRIO優先級的任務。當某一優先級未分配給一個任務時,該數組對應元素的值為(void *)0,當某優先級的任務分配給一個處于就緒態的任務時,對應元素的內容就被寫入該任務的OS_TCB所在地址。

拿到沒用過的系統,首先就想知道它是怎么用的,對于一個實時操作系統,先要解決以下幾個問題:
如何切換任務
uC/OS多任務的原理是,在某個任務重新獲得CPU控制權的時候,先把上一個執行的任務的所有寄存器以及它的返回地址保存起來,然后把現在要執行的任務的所有變量恢復到操作寄存器里,然后使PC指向這個任務的處理函數。而保存和恢復變量的重要媒介就是每個任務獨有的堆棧空間,這點跟中斷處理的過程幾乎一樣,重新獲得CPU的任務可以看成是中斷函數,原先執行的看成是被中斷的函數,只不過uC/OS是模擬中斷來切換任務,所有堆棧的保存和恢復要在移植不同處理器的時候根據實際情況來完成,目的只有一個,就是模擬中斷的壓棧和出棧操作。
uC/OS引起任務切換的功能函數主要是兩個,任務級的切換是OSSched(),中斷級的切換由OSIntExit()完成。而前者中真正實現切換操作的是OS_TASK_SW()宏,后者真正實現切換功能的是OSIntCtxSw(),這個宏如何實現,移植不同的處理器有不同的處理方法,目的仍然是,把現場處理的跟真正發生了中斷一樣,該保存的保存,該恢復的恢復。
因此可以得到,uC/OS切換任務時可以有兩種方法,第一種是擁有CPU控制權的任務主動調用函數OSTimeDly()、OSTaskSuspend()等這類函數把控制權交出來,重新分配給下一個優先級高的任務,實際上是依靠OSSched()調度任務。第二種方法是CPU產生中斷,把當前任務的控制權剝奪掉,令它掛起,從而使下一優先級的任務得以執行,當然,如果中斷沒有令當前任務掛起,中斷返回后它依然是最高優先級的話,CPU將繼續被它控制。

如何查找最高優先級
uC/OS把一個字節可能的256個值的所有優先級狀況都做成一個表OSUnMapTbl[ ],比如,如果字節的值為7,即0000 0111,那么任務0,1,2都處于就緒態,最高優先級當然是0,那么OSUnMapTbl[7] == 0,因此,先通過y = OSUnMapTbl[OSRdyGrp]找到最高優先級的組y,然后通過x = OSUnMapTbl[OSRdyTbl[OSRdyGrp]]得到這個組里的最高優先級任務號x。因為uC/OS最大任務數不超過64,可以把優先級數看成是一個六位的二進制數,高三位表示所在組,低三位表示組內的號,因此y<<3+x就是找到的最高優先級數了,實在佩服OSUnMapTbl[ ]的設計。

作者進行很多查表的設計,為的是提高運行的速度。很想知道作者是如何創造出來的這些巧妙的查表設計的。uc/os-II源代碼算是在嵌入式OS中比較小巧玲瓏的啦,例如嵌入式linux的系統是怎么寫出來的呢?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259145.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259145.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259145.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

偶數哥德巴赫猜想

已知不小于6的偶數都可以分成兩個素數之和。請編寫6到100000的所有偶數的分解&#xff0c;若有一個偶數可以分解成多個素數之和&#xff0c;只需寫出一種即可。 #include <iostream> #include <algorithm> using namespace std;bool isprime(int n)//判斷素數{int …

[20170420]表達式加0或者減0不一樣.txt

[20170420]表達式加0或者減0不一樣.txt --//oracle 有時候避免某個索引采用字段0或者-0的方式&#xff0c;不使用索引&#xff0c;但是兩者存在一點點區別&#xff0c;通過例子說明。 1.環境&#xff1a; SCOTTbook> &r/ver1 PORT_STRING VERSION …

MAPLAP開發環境中release模式和debug模式燒寫.hex文件的不同之處

昨天看了齊工的報告才知道release模式和debug模式燒寫.hex文件的不同。 三&#xff1a;問題分析 1. PIC系列的仿真器和集成開發環境的情況&#xff1a; Release模式和Debug模式是有區別的&#xff1b;Release模式是只把代碼燒錄到單片機的flash區內&#xff0c;上電執行&am…

JavaWeb -- Session實例 -- 自動登錄 和 防止表單重復提交(令牌產生器) MD5碼

1、 自動登錄 http://blog.csdn.net/xj626852095/article/details/16825659 2. 防止表單重復提交 表單Servlet //負責產生表單 public class FormServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletEx…

電腦常見故障處理_彩超常見故障及維修

彩超是醫學檢測手段中重要的環節之一&#xff0c;是對產婦以及對病人進行內部組織和結構觀察的重要方式之一&#xff0c;彩超應用得當可以及早的診斷出病人的疾病&#xff0c;為患者解除疾病的困擾。彩超設備是一種極為先進的診斷系統&#xff0c;一般彩超系統包括以下幾個部分…

微軟歷史最高市值是多少?

有人說微軟在1999 年 12 月達到股價歷史最高點 $58.38并不準確。我1999年12月22日增加微軟&#xff0c;公司依照1999年12月27日的價格&#xff08;119.125&#xff0c;拆股后變為59.5625&#xff09;給了我一筆期權&#xff0c;這個價格&#xff0c;成為微軟股價空前絕后最高點…

京東2016校招編程題

記得有一個大題&#xff0c;說的是給定一個n*n的矩陣&#xff0c;要求從1開始填充矩陣&#xff0c;最后的矩陣是蛇形的。即如下&#xff1a; n3, 7 8 1 6 9 2 5 4 3 n4, 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4 給出代碼&#xff1a; #incl…

leetcode21

/*** Definition for singly-linked list.* public class ListNode {* public int val;* public ListNode next;* public ListNode(int x) { val x; }* }*/ public class Solution {public ListNode MergeTwoLists(ListNode l1, ListNode l2) {//遞歸實現鏈表合并…

springmvc02

1&#xff0c;創建實體類對象User 注意要導入 bean-validator.jar 包 package com.yangw.springmvc.entity;import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotEmpty; import org.hibernate.validator.constraints.Range; im…

用基本信號畫出如下的信號_股市入門基本知識丨下跌時期可以抄底的安全信號有哪些...

點擊藍色字體 關注我們 帶來更多精彩股票市場中的秘籍其實就是“低買高賣”&#xff0c;不過我們不能在大盤一開始下跌的時候就進行買入&#xff0c;因為不清楚下跌的時間&#xff0c;太早介入&#xff0c;只有在反彈幅度超出我們介入的點的時候才可以進行高賣。那么什么時候才…

Flume數據傳輸事務分析[轉]

本文基于ThriftSource,MemoryChannel,HdfsSink三個組件&#xff0c;對Flume數據傳輸的事務進行分析&#xff0c;如果使用的是其他組件&#xff0c;Flume事務具體的處理方式將會不同。一般情況下&#xff0c;用MemoryChannel就好了&#xff0c;我們公司用的就是這個&#xff0c;…

最近的一些校招試題摘錄

最近又參加了一些校招&#xff0c;真是馬不停蹄啊。多參加考試是好的&#xff0c;可以不斷發現一些新的問題。下面摘錄一些我不太會的題。 1.volatile的作用是什么&#xff1f; 答案&#xff1a;volatile是類型修飾符&#xff0c;用它修飾的類型變量可能會被編譯器未知的因素…

yii2中的rules驗證規則

2019獨角獸企業重金招聘Python工程師標準>>> Rules驗證規則&#xff1a;required : 必須值驗證屬性||CRequiredValidator 的別名, 確保了特性不為空.[[字段名],required,requiredValue>必填值,message>提示信息];email : 郵箱驗證||CEmailValidator 的別名,確…

weblogic數據源配置的問題,weblogic密碼破解

weblogic 報錯 please increase XXX,得知是連接池出了問題&#xff0c;查看weblogic配置&#xff0c;發現沒有設置超時 查看oracle 當前session&#xff0c;可以看到連接的機器&#xff0c;用戶&#xff0c;當前執行的sqlid select * from v$session; select v$sql where sql_i…

自己寫的簡易多任務系統---基于pic18fxxx

這個工程只是實現了最簡單的OS任務調度&#xff0c;對于理解任務調度有點幫助。其實就是從UC/OS-II里面摘出來的&#xff0c;沒有原來的那么復雜&#xff0c;很精簡&#xff0c;但道理上是一樣的。工程中的CPU.C文件時直接拿Nathan Brown寫好的&#xff0c;因為關于PIC任務切換…

python語言整數類型-Python 的內置數值類型

Python 是一種敏捷的、動態類型化的、極富表現力的開源編程語言&#xff0c;可以被自由地安裝到多種平臺上。Python 代碼是被解釋的。如果您對編輯、構建和執行循環較為熟悉&#xff0c;則 Python 代碼對您來說更簡單。但是&#xff0c;請不要搞錯&#xff1a;Python 器可以是簡…

滴滴出行2016校招編程題

1. 給定一個m*n的數組&#xff08;m,n>2,數組值>0&#xff09;&#xff0c;要求選出和最大的子2*2數組。例如&#xff1a; 1 2 3 4 5 6 7 8 9 顯然和最大的2*2子數組是5 6;8 9.下面完成這個功能。 Input: &#xff08;m*n的數組&#xff09; 1 2 3 ; 4 5 6 ; 7 8 9 …

每天一個linux命令(22):find 命令的參數詳解

find一些常用參數的一些常用實例和一些具體用法和注意事項。 1&#xff0e;使用name選項&#xff1a; 文件名選項是find命令最常用的選項&#xff0c;要么單獨使用該選項&#xff0c;要么和其他選項一起使用。 可以使用某種文件名模式來匹配文件&#xff0c;記住要用引號將文件…

(WPF) DataGrid之綁定

通過ObservableCollection 綁定到 DataGrid. 1. 前臺Xaml. <DataGrid x:Name"dgMeasurements"HorizontalAlignment"Left"Margin"10,69,0,10"ItemsSource"{Binding}"AutoGenerateColumns"False"Width"370">…

程序=數據結構+算法

這句名言&#xff0c;我現在品來很有感覺&#xff0c;看看uc/os-II里面那些就緒表、查找最高優先級任務等等&#xff0c;算法設計的非常巧妙&#xff0c;整個OS都是圍繞著OS_TCB來運轉的&#xff0c;任務需要通信&#xff0c;那就在建立個OS_EVENT&#xff0c;通過.*OSTCBEvent…