|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
從混沌中走出-uc/os ii學習日記 |
| 作者:waitwait 欄目:嵌入式系統(tǒng) |
各位感興趣的進來后,可別以為我已經(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 于 2006/3/28 13:21:00 發(fā)布:
是啊 我也是,周圍沒有人可以討論,一般在網(wǎng)上自己找資料,前段時間也學了一段時間的UC/OS,搞了好久的移植工作,還是沒有能夠讓UC/OS在我的板子上跑起來,懇請朋友把周功的UC/OS移植的列子發(fā)我一份,讓我也在板子上跑跑UC/OS,謝謝 diangzishijie@yahoo.com.cn |
|
| 3樓: | >>參與討論 |
| 作者: xait3207 于 2006/3/28 14:29:00 發(fā)布:
茫然啊,你說的是什么啊 |
|
| 4樓: | >>參與討論 |
| 作者: syzhou1314 于 2006/3/28 22:13:00 發(fā)布:
我也在初學中 我也是在校生,最近也在用easyarm2100 ,邵貝貝的書我覺得應該好好研究一下,我看了兩遍了,基本都懂了,但我在研究uc/os在2100上的移植范例是還是好些不懂,特別是那個幾個與cpu相關的函數(shù),os_cpu_c.c,os_cpu_a.s等,還有這個sp把我搞的好暈! |
|
| 5樓: | >>參與討論 |
| 作者: zycfrank 于 2006/3/28 22:19:00 發(fā)布:
樓主,有同感啊 看了有一個星期的書了,關于RTOS的認識和樓上一樣啊,現(xiàn)在還在努力中, 基本上樓主說的就是RTOS的執(zhí)行過程了,也苦于周圍沒人請教. 所以看了樓主的貼,真是深有感觸啊 一起加油!!!!!!! |
|
| 6樓: | >>參與討論 |
| 作者: seahai 于 2006/3/29 12:16:00 發(fā)布:
不錯 這種經(jīng)驗的文章,多多益善。支持樓主 |
|
| 7樓: | >>參與討論 |
| 作者: shiye 于 2006/3/29 12:19:00 發(fā)布:
關注中 關注中 |
|
| 8樓: | >>參與討論 |
| 作者: zxwwwwcom 于 2006/3/29 14:16:00 發(fā)布:
支持。! |
|
| 9樓: | >>參與討論 |
| 作者: superseed 于 2006/3/31 13:12:00 發(fā)布:
頂,偶也正學習中 |
|
| 10樓: | >>參與討論 |
| 作者: net_walker 于 2006/3/31 13:22:00 發(fā)布:
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 于 2006/4/1 11:07:00 發(fā)布:
re: 內(nèi)核在每個時鐘節(jié)拍(OSTimeTick())到來時并不實現(xiàn)調(diào)度的. OSTimeTick()做的一項重要工作主要是掃描每一個TCB的OSTCBDly延長節(jié)拍數(shù)是否減為0,如果是,則把該任務推入就緒態(tài)。 |
|
| 12樓: | >>參與討論 |
| 作者: smihtctecg 于 2006/4/2 21:49:00 發(fā)布:
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 于 2006/4/3 9:54:00 發(fā)布:
re 樓上只是說明了這個信號量是有中斷產(chǎn)生的,但這個信號量不一定要有中斷產(chǎn)生,別的任務也可以釋放該信號量。 |
|
| 14樓: | >>參與討論 |
| 作者: kelawood 于 2006/4/3 13:14:00 發(fā)布:
咳嗽 雖然大方向的東西明白了,不過很多細節(jié)上的東西會讓你郁悶致死的 |
|
| 15樓: | >>參與討論 |
| 作者: waitwait 于 2006/4/3 15:57:00 發(fā)布:
最近又明白了一些,跟大家共享 前一段時間對何時任務調(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 于 2006/4/3 17:23:00 發(fā)布:
好。頂。。。 |
|
| 17樓: | >>參與討論 |
| 作者: artblakey0 于 2006/4/3 19:43:00 發(fā)布:
請哪位大蝦賜告入門ARM的讀物 請哪位大蝦賜告入門ARM的讀物.萬分感謝! |
|
| 18樓: | >>參與討論 |
| 作者: smihtctecg 于 2006/4/4 8:04:00 發(fā)布:
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 于 2006/4/4 8:47:00 發(fā)布:
re: 樓上言之有理 |
|
| 20樓: | >>參與討論 |
| 作者: net_walker 于 2006/4/4 10:03:00 發(fā)布:
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 于 2006/4/4 14:02:00 發(fā)布:
有時間我也來學學 嗯~~ 有機會我也學學USOSII |
|
| 22樓: | >>參與討論 |
| 作者: huilily 于 2006/4/4 15:38:00 發(fā)布:
re 正在學習 關注 |
|
| 23樓: | >>參與討論 |
| 作者: pajoke 于 2006/4/4 19:41:00 發(fā)布:
沖50點啊!!!! 沖50點啊!!!! |
|
| 24樓: | >>參與討論 |
| 作者: smihtctecg 于 2006/4/4 21:42:00 發(fā)布:
re 本人設計的儀器使用了RTOS后,一片小飛的ARM7完成了競爭對手一片80C196+2片8X5X所作的工作,對其實時響應深有體會,當然實時性是由中斷來保證的。 唯一感到不便的是小飛只有2個32位的定時器,少了點。不象ATMEL有4個16位的定時器。正考慮在下一個大飛的系統(tǒng)中使用CPLD或FPGA產(chǎn)生RTOS所需的ticks中斷以及其它關鍵信號的中斷,以進一步提高各任務的實時響應時間。 |
|
| 25樓: | >>參與討論 |
| 作者: zusen 于 2006/4/5 0:43:00 發(fā)布:
~~~ 如果兩個任務用的是獨產(chǎn)的資源,你可以看作他們是同時運行的,當他們同時用到共同的資源時,那么,高優(yōu)先級的任務先用這個資源,比如兩個任務在T時刻同時在顯視器上顯視M與Y,M比Y優(yōu)先級高,那么就是說,他們在同一時刻在顯視器上作輸出,那么誰先呢,這就由優(yōu)先級作決定,兩個任務都就緒了,他就查誰的優(yōu)先級高,先做完高的,再做低的,這就會在 顯視器上先顯視M再到Y |
|
| 26樓: | >>參與討論 |
| 作者: 圓圈 于 2006/4/6 16:29:00 發(fā)布:
看邵貝貝的書,說的很明白的 |
|
| 27樓: | >>參與討論 |
| 作者: liuzs755 于 2006/4/10 22:46:00 發(fā)布:
不錯 做個記號 |
|
| 28樓: | >>參與討論 |
| 作者: 88296175 于 2006/4/20 10:28:00 發(fā)布:
做個記號 |
|
| 29樓: | >>參與討論 |
| 作者: mxp1122 于 2006/4/25 8:45:00 發(fā)布:
好 好 |
|
| 30樓: | >>參與討論 |
| 作者: sithui 于 2006/4/26 15:32:00 發(fā)布:
RTOS的設計目的就是讓就緒的高優(yōu)先級任務立即得到運行 因此,在所有可能讓任務狀態(tài)發(fā)生變化的地方都要調(diào)用任務調(diào)度函數(shù) |
|
| 31樓: | >>參與討論 |
| 作者: zlfox2 于 2006/4/26 17:09:00 發(fā)布:
佩服呀! 很不錯,多總結總有好處,發(fā)到網(wǎng)上: 一、讓別人受益; 二、讓自己受益; 大家都受益,支持,我會一直關注的,等我看懂一些之后定來交流 |
|
| 32樓: | >>參與討論 |
| 作者: am780717 于 2006/4/28 11:00:00 發(fā)布:
re 可不可以采用linux處理中斷的方式 |
|
| 33樓: | >>參與討論 |
| 作者: pjohn2004 于 2006/5/9 8:28:00 發(fā)布:
講得有點簡單,不過好懂。 |
|
| 34樓: | >>參與討論 |
| 作者: hgdljb 于 2006/5/10 8:47:00 發(fā)布:
頂---- 強人-- |
|
| 35樓: | >>參與討論 |
| 作者: dislin 于 2006/6/21 13:03:00 發(fā)布:
Ucos-II中斷怎么使用! |
|
| 36樓: | >>參與討論 |
| 作者: husteiraul 于 2007/1/18 13:06:00 發(fā)布:
想跟你討論一下 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |