音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng)
驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

從混沌中走出-uc/os ii學習日記

作者:waitwait 欄目:嵌入式系統(tǒng)
從混沌中走出-uc/os ii學習日記


各位感興趣的進來后,可別以為我已經(jīng)是什么高手了,那說明我的題目把大家誤導了,其實我是想寫一個學習

實時操作系統(tǒng)uc/os ii的日記,記下我的學習之路,當然這其中包含我的錯誤理解。以前看到的精辟文章都是

各位在取得了小成,有了一定的心得,并經(jīng)過實際檢驗之后,確認無誤后共享給大家的。而我的打算是,只是

記錄自己短時間內(nèi)的理解,錯誤是在長時間后方能得到糾正的,所以其中的錯誤想請大家指出,進而加快我的

理解,學習的過程,這也是我的目的之一。另外就是希望和剛剛踏入,或有想法踏入嵌入式系統(tǒng)的朋友們一起

討論,共同進步。
我做過一段時間的硬件,控制器用的是51單片機,程序都是采用前后臺的方式,還沒有系統(tǒng)的開發(fā)過產(chǎn)品(還沒

有畢業(yè)呢)。最近看到arm的興起,決定嘗試一下,正好樓下實驗室的一個哥們買了一塊周立功的開發(fā)板,可一

蹭一蹭,沒有開發(fā)板估計我也懶得學,有了塊板子,就來勁了。
因為有硬件的底子,我也沒有去看arm控制器的介紹,首先把不上系統(tǒng)的例程序先跑了一遍,自己在把幾個板子

上具有的功能,融合起來,編了一個程序,稍微了解一下板子的功能。這次學習的重點不是這塊,就敷衍了一

下。

首先聲明這都是目前學習中我的個人理解,一定會有錯誤的,目的是希望大家指出。
然后就向著期待已久的移植操作系統(tǒng)進發(fā)了,又怕又喜呀。先移例子,按照要求把source文件夾放在了

SOFTWARE\ucos-II文件夾下,在這個文件夾下,存放得是系統(tǒng)移植的例子,其中有三個文件夾:

arm_pc,source,lpc2100是和系統(tǒng)移植相關的。source中存放的是uc/os的源碼,lpc2100中存放的是關于arm控

制器的文件。這個文件夾中的代碼應當是和具體的控制器直接相關的,應當是根據(jù)實際情況進行修改的。第三

個文件arm_pc中存放的是pc機上的一些應用程序經(jīng)過修改的,沒有仔細看,我覺得現(xiàn)在還用不著。
因為我是做硬件的,喜歡從本質上看到程序是怎么運行的,操作系統(tǒng)是如何工作的,這一點我覺得匯編程序最

能體現(xiàn)程序運行的流程了。
我首先看了一下主函數(shù),很簡單,
//void main (void)          //change bu cmj
int main (void)
{
    PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);      /* Clear the screen                    

     */

    OSInit();                                              /* Initialize uC/OS-II                 

     */

    PC_DOSSaveReturn();                                    /* Save environment to return to DOS   

     */
//del by cmj    
//    PC_VectSet(uCOS, OSCtxSw);                             /* INSTALL uC/OS-II's context SWITCH

vector */

    RandomSem   = OSSemCreate(1);                          /* Random NUMBER semaphore             

     */

    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
    OSStart();                                             /* Start multitasking                  

     */
}
關于pc的函數(shù)我不感興趣,我學習東西的過程是先總體瀏覽,不求很懂(能懂最好了),主程序中首先進行了

操作系統(tǒng)初始化,然后創(chuàng)建了一個任務,最后啟動了多任務運行環(huán)境。太簡單了。再往下看創(chuàng)建的任務子函數(shù)
TaskStart(),在這個函數(shù)中又創(chuàng)建了10個人物。這時瀏覽一遍后的感性認識。接下來通過看書,了解到在啟動

多任務環(huán)境前需要至少創(chuàng)建一個任務,我想TaskStart()任務就應該是這個原因放在了    OSStart()之前。

接著出現(xiàn)了困擾我?guī)滋斓膯栴},到現(xiàn)在還是沒明白。任務之間是如何切換的,操作系統(tǒng)何時退出當前任務,去

尋找優(yōu)先級最高的就緒的任務。查資料,網(wǎng)上詢問。得到一個答案。中斷級任務調(diào)度,和任務級調(diào)度。我的理

解是當發(fā)生中斷時,操作系統(tǒng)內(nèi)核判斷此時是否有更高優(yōu)先級的就緒任務,有的話進行任務調(diào)度。任務級調(diào)度

就是當前任務在執(zhí)行過程中主動執(zhí)行任務調(diào)度,將權力交給內(nèi)核。
但是這個中斷是怎么產(chǎn)生的呢,我又看到了時鐘節(jié)拍的概念,時鐘節(jié)拍(clock tick):P67頁中說道時鐘節(jié)拍是

特定的周期性中斷。有兩種作用:這種周期性的定時中斷一來為內(nèi)核提供一個時間標準,例如某個任務要延時

多長時間,可以通過紀錄這種中斷來完成(中斷的時間是已知的,但應當是可更改的),二 為任務切換提供了時

間片,任務之間的調(diào)度是按時完成的,就是在一個時鐘節(jié)拍后來進行
P68-P69中的圖形說明了這一點。以前不明白每個任務是一個死循環(huán),在每個程序中都有一個OSTimeDly(),這個

函數(shù)是將任務掛起,將控制權交給內(nèi)核,內(nèi)核進行任務調(diào)度,從就續(xù)的任務中找到優(yōu)先級最高的任務執(zhí)行,這

是一種調(diào)度。那么當一個低優(yōu)先級任務在執(zhí)行時,如果在等待一個信號,可能要等很長時間,那么內(nèi)核不能一

直在這里等待這個信號的到來,別的高優(yōu)先級任務可能已經(jīng)就緒,那么就需要進行任務調(diào)度,何時調(diào)度呢?這

時就應該是時鐘節(jié)拍所起到的作用,每一個時鐘節(jié)拍到達后進入中斷處理函數(shù),進行任務調(diào)度。
所以總的理解應當是內(nèi)核在每個時鐘節(jié)拍到來時進行一次任務調(diào)度,這是大前提,使每個任務都有相同的權利

執(zhí)行相同的時間。有時個別任務在一個時鐘節(jié)拍內(nèi)早已完成,這時需要向內(nèi)核提前交權,讓內(nèi)核進行任務調(diào)度



到目前為止我的理解就是這樣的,苦于周圍無人探討,遂發(fā)帖請大家指正。我將繼續(xù)努力,我的目標是理解系

統(tǒng)是如何工作的。



2樓: >>參與討論
宋道慶LPC
是啊
我也是,周圍沒有人可以討論,一般在網(wǎng)上自己找資料,前段時間也學了一段時間的UC/OS,搞了好久的移植工作,還是沒有能夠讓UC/OS在我的板子上跑起來,懇請朋友把周功的UC/OS移植的列子發(fā)我一份,讓我也在板子上跑跑UC/OS,謝謝
diangzishijie@yahoo.com.cn

3樓: >>參與討論
xait3207
茫然啊,你說的是什么啊
 
4樓: >>參與討論
syzhou1314
我也在初學中
我也是在校生,最近也在用easyarm2100 ,邵貝貝的書我覺得應該好好研究一下,我看了兩遍了,基本都懂了,但我在研究uc/os在2100上的移植范例是還是好些不懂,特別是那個幾個與cpu相關的函數(shù),os_cpu_c.c,os_cpu_a.s等,還有這個sp把我搞的好暈!

5樓: >>參與討論
zycfrank
樓主,有同感啊
看了有一個星期的書了,關于RTOS的認識和樓上一樣啊,現(xiàn)在還在努力中,
基本上樓主說的就是RTOS的執(zhí)行過程了,也苦于周圍沒人請教.
所以看了樓主的貼,真是深有感觸啊
一起加油!!!!!!!

6樓: >>參與討論
seahai
不錯
這種經(jīng)驗的文章,多多益善。支持樓主

7樓: >>參與討論
shiye
關注中
關注中

8樓: >>參與討論
zxwwwwcom
支持。!
 
9樓: >>參與討論
superseed
頂,偶也正學習中
 
10樓: >>參與討論
net_walker
re
“這是一種調(diào)度。那么當一個低優(yōu)先級任務在執(zhí)行時,如果在等待一個信號,可能要等很長時間,那么內(nèi)核不能一直在這里等待這個信號的到來。。。”
內(nèi)核不會在這等,該任務馬上處于掛起狀態(tài)了,并執(zhí)行一次調(diào)度任務,下一個就緒列表中優(yōu)先級最高的任務得到運行。

“內(nèi)核在每個時鐘節(jié)拍到來時進行一次任務調(diào)度” 不認同。
個人認為因該是放棄對cpu控制權的時候進行一次任務調(diào)度,這樣描述可能不太確切,大家一起探討~~~~~~~

11樓: >>參與討論
seahai
re:
內(nèi)核在每個時鐘節(jié)拍(OSTimeTick())到來時并不實現(xiàn)調(diào)度的.
OSTimeTick()做的一項重要工作主要是掃描每一個TCB的OSTCBDly延長節(jié)拍數(shù)是否減為0,如果是,則把該任務推入就緒態(tài)。


12樓: >>參與討論
smihtctecg
ucosii中高優(yōu)先級任務調(diào)度
"那么當一個低優(yōu)先級任務在執(zhí)行時,如果在等待一個信號,可能要等很長時間,那么內(nèi)核不能一直在這里等待這個信號的到來,別的高優(yōu)先級任務可能已經(jīng)就緒,那么就需要進行任務調(diào)度,何時調(diào)度呢?"

是通過中斷實現(xiàn)的。每個由UCOSII管理的中斷進入和退出都有通知內(nèi)核的操作,特別是退出時會執(zhí)行一次任務調(diào)度,若別的高優(yōu)先級任務因此次中斷已經(jīng)就緒將被調(diào)度執(zhí)行,然后再返回并執(zhí)行中斷前的任務。這就是所謂的搶占式任務調(diào)度。

13樓: >>參與討論
net_walker
re
樓上只是說明了這個信號量是有中斷產(chǎn)生的,但這個信號量不一定要有中斷產(chǎn)生,別的任務也可以釋放該信號量。


14樓: >>參與討論
kelawood
咳嗽
雖然大方向的東西明白了,不過很多細節(jié)上的東西會讓你郁悶致死的

15樓: >>參與討論
waitwait
最近又明白了一些,跟大家共享
前一段時間對何時任務調(diào)度一直搞不清楚,苦讀幾天有些眉目,跟大家共享,共同探討。
所謂任務調(diào)度說的明白些就是將控制權交給內(nèi)核,那么在程序上其實就是實現(xiàn)了程序上的一個跳轉(匯編),C語言的話就是調(diào)用了一個函數(shù)sched().在這個函數(shù)里執(zhí)行的功能就是從就緒表中找到就緒的最高級的任務,并將該任務的TCB復給OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];然后調(diào)用OS_TASK_SW();這個函數(shù)是用匯編寫的(其中涉及到一個宏定義),這個函數(shù)就的入口就是OSIntCtxSw,功能就是保存當前任務的信息,將其壓入堆棧,將OSTCBHighRdy 所對應的任務的指針付給PC,將數(shù)據(jù)從堆棧中彈出。開始執(zhí)行新的任務。

那么什么時候調(diào)用sched()呢?有幾種情況,第一種應當就是通常所說的中斷級任務調(diào)度。大家都知道有一個時鐘節(jié)拍的概念。它的一個重要作用就是當任務通過ostimedly()掛起時,在中斷中提供準確的tick數(shù)。那么中斷中到底執(zhí)行了什么呢?當時鐘節(jié)拍發(fā)生中斷時函數(shù)的入口是IRQ向量中斷,地址是timer0。
如下:
;定時器0中斷
Timer0_Handler  HANDLER Timer0
這里用到了一個宏定義

    MACRO
$IRQ_Label HANDLER $IRQ_Exception

初次看時并沒有看懂其中的意思,后經(jīng)過反復思考,結合自己認為正確的想法,終于有所突破。
在這個宏中調(diào)用了留給用戶自己編寫的用C語言寫的中斷處理函數(shù)。
        void Timer0(void)
{
    T0IR = 0x01;
    T0MR0 += (Fpclk / OS_TICKS_PER_SEC);
    VICVectAddr = 0;            // 通知中斷控制器中斷結束
    OSTimeTick();
}
這個函數(shù)中調(diào)用了    OSTimeTick();這個函數(shù),那么這個函數(shù)又完成了什么呢?
他負責檢查是否在掛起的任務中有完成tick數(shù)的如果有將其加到任務就緒表中,返回宏中,在宏的末尾調(diào)用了任務處理函數(shù)OSIntCtxSw。進行了任務切換。
這種就應到是中斷級任務調(diào)度。
另外的就是任務及調(diào)度,任務的就緒目前認為只有兩種情況,一是tick數(shù)到期,另外一種就是信號量,消息,郵箱等非中斷產(chǎn)生的信號是任務就緒。第一種上面已經(jīng)討論過。剩下的就是第二種,所以以信號量為例,如果一個任務要等待某個信號量那么他會調(diào)用ossempend()函數(shù),任務要等待,以我們的想法,她沒事做了,要等,那么就別占著茅坑不拉屎,交權吧!沒措事實就是這樣,這個函數(shù)中再次調(diào)用了sched()這個函數(shù),尋找高優(yōu)先級任務,進行任務切換。
那么有了ossempend()這個函數(shù)我們就會想到ossempost()這個函數(shù),它是發(fā)送信號量的,當一個任務發(fā)送了信號量,那么內(nèi)核就應該看看是不是有任務在等待信號量,oseventtaskrdy(),如果有任務在等待,怎么辦,應該讓這個任務執(zhí)行,內(nèi)核讓一個任務執(zhí)行的方法就是任務調(diào)度,本質就是程序跳轉,再次調(diào)用sched()這個函數(shù),這樣是不是就通了。當然這塊還涉及到事件控制塊的機制,要細究的朋友,可以弄一下,弄點心得出來,大家一起進步。
總結一下,操作系統(tǒng)是人寫出來的,別忘了它是一個程序。在想一個操作系統(tǒng)是如何工作時,我們首先要想如果我設計應該怎么設計,當然不考慮細節(jié),先考慮整體,然后再按著自己的思路看源碼,這是我的體會!還請大家指教!

稱為搶占式的操作系統(tǒng),也是有一個極小的時間片在里邊的,就是時鐘節(jié)拍。當然與時間片輪轉式的操作系統(tǒng)大不一樣。之所以能夠進行搶占,就是在每種使任務就緒的情況發(fā)生的地方都進行了任務調(diào)度,尋找出高優(yōu)先級的任務,進行執(zhí)行。

共同努力!

16樓: >>參與討論
lpcfans
好。頂。。。
 
17樓: >>參與討論
artblakey0
請哪位大蝦賜告入門ARM的讀物
請哪位大蝦賜告入門ARM的讀物.萬分感謝!

18樓: >>參與討論
smihtctecg
Re
"樓上只是說明了這個信號量是有中斷產(chǎn)生的,但這個信號量不一定要有中斷產(chǎn)生,別的任務也可以釋放該信號量。"

當然信號量不一定要有中斷產(chǎn)生,但對于實時性要求較高的系統(tǒng)來說,一般還是通過中斷來保證響應的實時性。諸如輸入信號通過引腳變化產(chǎn)生中斷,定時輸出的信號通過定時器中斷產(chǎn)生輸出。

對于非中斷方式的信號量,若當前任務執(zhí)行一較長時間的延遲操作(非調(diào)用OsTimeDly()),比如通過低速光耦訪問IO設備時,此時有較長一段時間不會主動發(fā)生任務調(diào)度,在此期間不會發(fā)生使用此類信號量的任務調(diào)度。

因此非中斷方式產(chǎn)生的信號量只適用于慢速實時性要求不高的任務。
對于信號量一般還是推薦采用由中斷方式產(chǎn)生。

19樓: >>參與討論
seahai
re:
樓上言之有理

20樓: >>參與討論
net_walker
re
多任務內(nèi)核中普遍使用信號量作用:
控制共享資源的使用權;標志事件的發(fā)生;同步任務
系統(tǒng)的實時性是由中斷機制來保證的,信號量只是一個途徑,不用信號量,用郵箱也可以阿。(打個比方)


“那么當一個低優(yōu)先級任務在執(zhí)行時,如果在等待一個信號,可能要等很長時間,那么內(nèi)核不能一直在這里等待這個信號的到來,別的高優(yōu)先級任務可能已經(jīng)就緒,那么就需要進行任務調(diào)度,何時調(diào)度呢?"
是通過中斷實現(xiàn)的。。。。!

只是想說明沒有中斷產(chǎn)生信號量的情況。


21樓: >>參與討論
zhangjcad
有時間我也來學學
 嗯~~
  有機會我也學學USOSII

22樓: >>參與討論
huilily
re
正在學習
關注

23樓: >>參與討論
pajoke
沖50點啊!!!!
沖50點啊!!!!

24樓: >>參與討論
smihtctecg
re
本人設計的儀器使用了RTOS后,一片小飛的ARM7完成了競爭對手一片80C196+2片8X5X所作的工作,對其實時響應深有體會,當然實時性是由中斷來保證的。
唯一感到不便的是小飛只有2個32位的定時器,少了點。不象ATMEL有4個16位的定時器。正考慮在下一個大飛的系統(tǒng)中使用CPLD或FPGA產(chǎn)生RTOS所需的ticks中斷以及其它關鍵信號的中斷,以進一步提高各任務的實時響應時間。

25樓: >>參與討論
zusen
~~~
如果兩個任務用的是獨產(chǎn)的資源,你可以看作他們是同時運行的,當他們同時用到共同的資源時,那么,高優(yōu)先級的任務先用這個資源,比如兩個任務在T時刻同時在顯視器上顯視M與Y,M比Y優(yōu)先級高,那么就是說,他們在同一時刻在顯視器上作輸出,那么誰先呢,這就由優(yōu)先級作決定,兩個任務都就緒了,他就查誰的優(yōu)先級高,先做完高的,再做低的,這就會在 顯視器上先顯視M再到Y

26樓: >>參與討論
圓圈
看邵貝貝的書,說的很明白的
 
27樓: >>參與討論
liuzs755
不錯
做個記號


28樓: >>參與討論
88296175
做個記號
 
29樓: >>參與討論
mxp1122




30樓: >>參與討論
sithui
RTOS的設計目的就是讓就緒的高優(yōu)先級任務立即得到運行
因此,在所有可能讓任務狀態(tài)發(fā)生變化的地方都要調(diào)用任務調(diào)度函數(shù)

31樓: >>參與討論
zlfox2
佩服呀!
很不錯,多總結總有好處,發(fā)到網(wǎng)上:
一、讓別人受益;
二、讓自己受益;
大家都受益,支持,我會一直關注的,等我看懂一些之后定來交流

32樓: >>參與討論
am780717
re
可不可以采用linux處理中斷的方式

33樓: >>參與討論
pjohn2004
講得有點簡單,不過好懂。
 
34樓: >>參與討論
hgdljb
頂----
強人--

35樓: >>參與討論
dislin
Ucos-II中斷怎么使用!
 
36樓: >>參與討論
husteiraul
想跟你討論一下
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關帖子
我是新手。想用匯編寫一這樣的多任務OS,不知可行嗎,請大家?guī)兔?/a>
想學嵌入式的請進!
做過MIDI轉USB的大大進來看看
求救:各位大蝦,誰有BC4.5的編譯器
請教,Linux2.6.15內(nèi)核支持s3c2410液晶驅動嗎
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號