久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12365|回復(fù): 0
收起左側(cè)

uC/OS-II學(xué)習(xí)筆記—任務(wù)的創(chuàng)建

[復(fù)制鏈接]
ID:51773 發(fā)表于 2013-7-18 20:09 | 顯示全部樓層 |閱讀模式
任務(wù)是操作系統(tǒng)處理的首要對象,在多任務(wù)運行環(huán)境,任務(wù)的管理需要考慮多方面的因素。最基本的任務(wù)管理功能是任務(wù)的創(chuàng)建。任務(wù)創(chuàng)建函數(shù)分兩種,一種是基本的創(chuàng)建函數(shù)OSTaskCreate,另一種是擴展的任務(wù)創(chuàng)建函數(shù)OSTaskCreateExt。兩個函數(shù)都實現(xiàn)了任務(wù)的創(chuàng)建,但是OSTaskCreateExt功能更強,帶有很多附加的功能。如果不需要使用附加的功能,OSTaskCreate也是可以勝任的,沒有哪個更好之說,完全根據(jù)需要選擇。
OSTaskCreate實現(xiàn)了創(chuàng)建任務(wù)最基本的功能,任務(wù)在創(chuàng)建之后,就準備好了運行需要的各種數(shù)據(jù)結(jié)構(gòu)。OSTaskCreate的代碼如下所示:
50.png
在創(chuàng)建一個任務(wù)的時候,需要給任務(wù)分配堆棧空間。堆棧是在操作系統(tǒng)的變量聲明中已經(jīng)分配了空間的,因此要將該空間分配給任務(wù),那么堆棧的地址應(yīng)該保存在什么地方呢:任務(wù)創(chuàng)建后堆棧又應(yīng)該初始化什么樣子呢?
51.png
可以看到,堆棧的初始化不是很好理解。因為opt在這里根本沒有使用,因此不需要過多的考慮。這段程序代碼出現(xiàn)在os_cpu.h中,說明它是和CPU密切相關(guān)的,當使用其他硬件環(huán)境時,需要修改該代碼。實際上,該代碼就是按順序向堆棧中壓入數(shù)據(jù),最后返回最新的堆棧棧頂指針。那么在堆棧中都壓入了哪些數(shù)據(jù)呢?如下圖所示是處理器的寄存器:
52.png
代碼注釋部分也提到了,上半部分數(shù)據(jù)在exception時是自動保存的,下班部分需要手動保存。那么哪些數(shù)據(jù)是自動保存的呢?如下圖所示:
53.png
以空閑任務(wù)的創(chuàng)建為例,在堆棧初始化之后,堆棧如下圖所示:
54.png
空閑任務(wù)的堆棧定義如下所示:
55.png
設(shè)置OS_TASK_IDLE_STK_SIZE這個宏的值是32,即:
56.png
STM32F407的堆棧是向低地址增長的,所以最開始堆棧頂?shù)奈恢迷谧罡叩刂稯STaskIdleStk[31]。所以將&OSTaskIdleStk[31]作為棧頂?shù)刂穫鬟f給堆棧初始化函數(shù)OSTaskStkInit。
任務(wù)調(diào)度函數(shù)OS_Sched將進行任務(wù)的調(diào)度, 即選擇優(yōu)先級最高的任務(wù)來運行。任務(wù)的地址、運行環(huán)境等內(nèi)容都保存于堆棧,OS_Sched將根據(jù)堆棧的內(nèi)容進行相關(guān)的操作。在操作系統(tǒng)初始化的時候,由于還沒有啟動多任務(wù),因此還不會調(diào)用OS_Sched。
從前面的基本代碼描述,可以清晰了解任務(wù)初始化的過程。首先,如果配置了對任務(wù)參數(shù)進行檢查,則檢查任務(wù)參數(shù)的有效性,尤其是對任務(wù)的優(yōu)先級進行判斷。當任務(wù)的優(yōu)先級在合適的范圍內(nèi)時,還需要判斷指定優(yōu)先級的任務(wù)是否有已經(jīng)被創(chuàng)建的,因為優(yōu)先級必須是唯一的。然后進行任務(wù)堆棧的初始化、任務(wù)控制塊的初始化,根據(jù)系統(tǒng)是否已經(jīng)啟動多任務(wù),決定是否此時進行一次任務(wù)調(diào)度。OSTaskCreate的流程如下圖所示:

57.png OSTaskCreate實現(xiàn)了創(chuàng)建任務(wù)的最基本功能,但是操作系統(tǒng)默認使用的是任務(wù)創(chuàng)建函數(shù)卻是OSTaskCreateExt,那么OSTaskCreateExt比OSTaskCreate多了哪些功能呢?
OSTaskCreateExt的函數(shù)參數(shù)就有9個,但是并非想象中的那么復(fù)雜。相對OSTaskCreate來說,最主要的是增加了堆棧檢查的功能,該函數(shù)的聲明如下所示:

58.png
59.png 這個函數(shù)是uC/OS-II的內(nèi)部函數(shù),用于采用擴展功能創(chuàng)建任務(wù)。
參數(shù)解析如下:
(#_#)task:任務(wù)的地址,操作系統(tǒng)根據(jù)該地址找到任務(wù),才能讓任務(wù)運行。這與OSTaskCreate是完全相同的。
(#_#)p_arg:任務(wù)參數(shù),以地址形式傳遞,可以是任何類型的地址。
(#_#)ptos:任務(wù)堆棧的棧頂。需要注意的是,如果OS_STK_GROWTH的值設(shè)置為1,堆棧是從高地址向低地址方向增長,棧頂應(yīng)為高地址,否則堆棧是從低地址向高地址方向增長。棧頂在低地址。
(#_#)prio:任務(wù)的優(yōu)先級。在uC/OS-II中,任務(wù)的優(yōu)先級必須唯一。
(#_#)id:任務(wù)的識別號ID,范圍為0~65536.
(#_#)pbos:任務(wù)堆棧的棧底地址。如果OS_STK_GROWTH設(shè)置為1,則堆棧是從高地址向低地址方向增長,pbos應(yīng)該在低地址端。反之,如果OS_STK_GROWTH設(shè)置為0,則堆棧是從低地址向高地址方向增長,pbos應(yīng)該在高地址端。
(#_#)stk_size:堆棧的大小。stk_size設(shè)置為可以壓入堆棧的最大數(shù)據(jù)量,和堆棧的數(shù)據(jù)類型無關(guān)。如果堆棧的類型OS_STK為32位整型,那么堆棧共有stk_size*4字節(jié)。如果堆棧的類型OS_STK為8位的整型,那么堆棧共有stk_size字節(jié)。
(#_#)pext:擴展塊的地址。如果支持浮點數(shù)計算,用戶內(nèi)存在上下文切換(任務(wù)切換)時需要保存和恢復(fù)浮點寄存器的內(nèi)容,這些內(nèi)容可以保存在擴展快中。
(#_#)opt:包含任務(wù)的附件信息。opt的低8位為uC/OS-II保留,高8位用戶可設(shè)置。低8位的每一位的含義與OS_TASK_OPT相同,因此系統(tǒng)定義了4個宏,如下所示:

60.png 返回值如下:
(#_#)OS_ERR_NONE:本函數(shù)成功運行。
(#_#)OS_PRIO_EXIT:如果任務(wù)優(yōu)先級已經(jīng)存在了,再創(chuàng)建相同優(yōu)先級的任務(wù)明顯是非法的。
(#_#)OS_ERR_PRIO_INVALID:如果優(yōu)先級參數(shù)非法,如大于最高值OS_LOWEST_PRIO。
(#_#)OS_ERR_TASK_CREATE_ISR:如果在中斷服務(wù)程序ISR中創(chuàng)建任務(wù)。
OSTaskCreateExt與OSTaskCreate的主要區(qū)別在于是用堆棧清除函數(shù)OS_TaskStkClr來清空堆棧。
我們需要知道OS_TaskStkClr是如何進行堆棧的清空的。如下所示:

61.png 它的3個參數(shù)分別為堆棧的棧底、堆棧的大小及選項opt,可以看到這3個參數(shù)都是傳遞給OSTaskCreateExt后直接傳遞給OS_TaskStkClr的。
可見,堆棧清除函數(shù)實現(xiàn)的功能就是將整個任務(wù)對應(yīng)的堆棧空間全部清0,這樣做是為了符合以后進行堆棧檢查的需要。如果不需要進行堆棧檢查,當然也不需要進行堆棧的清除操作,這是程序代碼第一行條件判斷語句存在的原因。另外,如果在堆棧清除函數(shù)中,發(fā)現(xiàn)opt未設(shè)置有OS_TASK_OPT_STK_CLR,就不應(yīng)執(zhí)行堆棧清除操作。
任務(wù)創(chuàng)建函數(shù)是非常重要的函數(shù),在操作系統(tǒng)的初始化中就調(diào)用了這個函數(shù)來創(chuàng)建了空閑任務(wù)和統(tǒng)計任務(wù)。OSTaskCreateExt的流程如下所示:

62.png 與OSTaskCreate相比,OSTaskCreateExt比OSTaskCreate增加了堆棧清除的功能,其他并無大的卻別。重復(fù)以下兩點:堆棧清除函數(shù)只是為堆棧檢查做準備的;操作系統(tǒng)采用的默認的任務(wù)創(chuàng)建函數(shù)是OS_TaskCreateExt。
任務(wù)創(chuàng)建函數(shù)執(zhí)行后,在正常情況下,對應(yīng)的任務(wù)就處于就緒態(tài),因為在創(chuàng)建的過程中, 調(diào)用了TCB初始化函數(shù),對就緒表和就緒組進行了操作和處理,標記了任務(wù)的就緒狀態(tài),而且也在就緒隊列插入了一個TCB。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区电影 | 精品久久久久一区二区国产 | 亚洲 欧美 精品 | 日本人做爰大片免费观看一老师 | 欧美日韩国产精品一区 | 亚洲一区二区三区在线免费 | 欧美精品一区二区三区在线播放 | 亚洲福利 | 久久久久亚洲国产| 成人区精品一区二区婷婷 | 国产高清在线精品 | 高清av电影| 狠狠爱一区二区三区 | 成人久久18免费网站麻豆 | 亚洲精品国产a久久久久久 午夜影院网站 | 成人av免费 | 一区二区三区中文字幕 | 超碰97干 | 久草新在线| 国产在线视频一区二区 | 亚洲系列第一页 | 国产激情视频网 | 欧美一区二区三区一在线观看 | 福利社午夜影院 | 久久久久国产 | 亚洲一区视频在线 | av免费网| 亚洲综合无码一区二区 | 九九热在线免费视频 | 国产91一区二区三区 | 欧美国产日韩一区 | 综合欧美亚洲 | 黄色一级电影在线观看 | 国产香蕉视频在线播放 | 欧美日韩电影免费观看 | 国产一区 | 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 亚洲欧美日韩中文字幕一区二区三区 | 日韩最新网址 | 成人在线中文字幕 | 成人福利视频 |