女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當(dāng)前位置:首頁 > > 充電吧
[導(dǎo)讀]嵌入式OS入門筆記-以RTX為案例:1.理論? ? 進程,英文稱呼很多Process, Task 等等,一般通用操作系統(tǒng)稱Process的比較多,各種稱呼涵義稍微有不一樣。一般而言,進程是對一個運行單

嵌入式OS入門筆記-以RTX為案例:

1.理論
? ? 進程,英文稱呼很多Process, Task 等等,一般通用操作系統(tǒng)稱Process的比較多,各種稱呼涵義稍微有不一樣。一般而言,進程是對一個運行單元的抽象,主要包括內(nèi)存(code,data,heap和stack),CPU狀態(tài)(PC,SP和寄存器值等)與其他OS管理相關(guān)的內(nèi)容。進程是一個運行中的程序。在RTX中,一個task就是一個進程。
一般我們有一個進程控制塊(Process control block,PCB),用于記錄進程的相關(guān)信息。在RTX上,這個控制塊叫做task control block(TCB),是一個結(jié)構(gòu)體,其中的成員記錄了關(guān)于該task的信息,其定義在rt_TypeDef.h中:

	typedef?struct?OS_TCB?{??
	??/*?General?part:?identical?for?all?implementations.????????????????????????*/??
	??U8?????cb_type;?????????????????/*?Control?Block?Type??????????????????????*/??
	??U8?????state;???????????????????/*?Task?state??????????????????????????????*/??
	??U8?????prio;????????????????????/*?Execution?priority??????????????????????*/??
	??U8?????task_id;?????????????????/*?Task?ID?value?for?optimized?TCB?access??*/??
	??struct?OS_TCB?*p_lnk;???????????/*?Link?pointer?for?ready/sem.?wait?list???*/??
	??struct?OS_TCB?*p_rlnk;??????????/*?Link?pointer?for?sem./mbx?lst?backwards?*/??
	??struct?OS_TCB?*p_dlnk;??????????/*?Link?pointer?for?delay?list?????????????*/??
	??struct?OS_TCB?*p_blnk;??????????/*?Link?pointer?for?delay?list?backwards???*/??
	??U16????delta_time;??????????????/*?Time?until?time?out?????????????????????*/??
	??U16????interval_time;???????????/*?Time?interval?for?periodic?waits????????*/??
	??U16????events;??????????????????/*?Event?flags?????????????????????????????*/??
	??U16????waits;???????????????????/*?Wait?flags??????????????????????????????*/??
	??void???**msg;???????????????????/*?Direct?message?passing?when?task?waits??*/??
	??struct?OS_MUCB?*p_mlnk;?????????/*?Link?pointer?for?mutex?owner?list???????*/??
	??U8?????prio_base;???????????????/*?Base?priority???????????????????????????*/??
	??U8?????ret_val;?????????????????/*?Return?value?upon?completion?of?a?wait??*/??
	??
	??/*?Hardware?dependant?part:?specific?for?CM?processor??????????????????????*/??
	??U8?????ret_upd;?????????????????/*?Updated?return?value????????????????????*/??
	??U16????priv_stack;??????????????/*?Private?stack?size,?0=?system?assigned??*/??
	??U32????tsk_stack;???????????????/*?Current?task?Stack?pointer?(R13)????????*/??
	??U32????*stack;??????????????????/*?Pointer?to?Task?Stack?memory?block??????*/??
	??
	??/*?Task?entry?point?used?for?uVision?debugger??????????????????????????????*/??
	??FUNCP??ptask;???????????????????/*?Task?entry?address??????????????????????*/??
	}?*P_TCB;

一個進程會有它自己的周期,會處在不同的進程狀態(tài)(state,見上面的state成員),不同的狀態(tài)有不同的意味,不同的狀態(tài)間可以相互轉(zhuǎn)換。
在RTX中,task的狀態(tài)是在rt_Task.h中定義的,一共有10種:

	/*?Values?for?'state'???*/??
	#define?INACTIVE????????0??
	#define?READY???????????1??
	#define?RUNNING?????????2??
	#define?WAIT_DLY????????3??
	#define?WAIT_ITV????????4??
	#define?WAIT_OR?????????5??
	#define?WAIT_AND????????6??
	#define?WAIT_SEM????????7??
	#define?WAIT_MBX????????8??
	#define?WAIT_MUT????????9

簡單說來,可以分為4大類,inactive(進程被清理),ready(就緒),running(執(zhí)行)和waiting(等待)。狀態(tài)3至9都可以歸為等待狀態(tài),區(qū)別在于他們等待的東西不同,從等待狀態(tài)觸發(fā)到就緒狀態(tài)的條件不同。


進程的創(chuàng)建和消滅都是主要都牽涉到內(nèi)存分配,排程器的安排,TCB的處理等等,需要具體的OS具體的分析,我們這里貼一下RTX進程創(chuàng)建的源代碼:

	OS_TID?rt_tsk_create?(FUNCP?task,?U32?prio_stksz,?void?*stk,?void?*argv)?{??
	??/*?Start?a?new?task?declared?with?"task".?*/??
	??P_TCB?task_context;??
	??U32?i;??
	??
	??/*?Priority?0?is?reserved?for?idle?task!?*/??
	??if?((prio_stksz?&?0xFF)?==?0)?{??
	????prio_stksz?+=?1;??
	??}??
	??task_context?=?rt_alloc_box?(mp_tcb);??
	??if?(task_context?==?NULL)?{??
	????return?(0);??
	??}??
	??/*?If?"size?!=?0"?use?a?private?user?provided?stack.?*/??
	??task_context->stack??????=?stk;??
	??task_context->priv_stack?=?prio_stksz?>>?8;??
	??/*?Pass?parameter?'argv'?to?'rt_init_context'?*/??
	??task_context->msg?=?argv;??
	??/*?For?'size?==?0'?system?allocates?the?user?stack?from?the?memory?pool.?*/??
	??rt_init_context?(task_context,?prio_stksz?&?0xFF,?task);??
	??
	??/*?Find?a?free?entry?in?'os_active_TCB'?table.?*/??
	??i?=?rt_get_TID?();??
	??os_active_TCB[i-1]?=?task_context;??
	??task_context->task_id?=?i;??
	??DBG_TASK_NOTIFY(task_context,?__TRUE);??
	??rt_dispatch?(task_context);??
	??os_tsk.run->ret_val?=?i;??
	??return?((OS_TID)i);??
	}

基本就是填TCB,分配內(nèi)存空間,確定優(yōu)先級和排程相關(guān)設(shè)置,這里就不深入分析。消滅進程的源代碼也是類似的。

2.進程相關(guān)的基本操作
進程在RTX里的基本形式是:

	__task?void?task(void){????
	????for(;;){????
	????????//...??????
	????????}????
	}

進程相關(guān)操作就是RTX提供的圍繞這樣一個task的一些基本操作,例如創(chuàng)建,消滅等等。
從應(yīng)用角度來說,了解以下進程基本操作就足夠了:
最主要的是這個:
os_tsk_create(task_name,priority);
把函數(shù)名填入,和進程的優(yōu)先度,優(yōu)先度后面的筆記會介紹。
如果留心看源代碼,其實源代碼的create操作要求一共4個參數(shù)(FUNCP task, U32 prio_stksz, void *stk, void *argv)。我們最基本的這個創(chuàng)建函數(shù)并沒有接受后兩個參數(shù)。如果實在有需要,有以下另外三個相關(guān)的操作:
os_tsk_create_ex(task_name,priority,para);
這個是用于傳遞一個初始參數(shù)para給相關(guān)進程的。例如你有一個LED_On的進程,而你有4個LED,你只有在創(chuàng)建進程時才能決定,你點亮的是哪個LED,那么就可以用這個操作,通過傳遞參數(shù)來決定具體要亮哪個LED。
os_tsk_create_user(task_name,priority,&stack,sizeof(stack));
這個是用來給進程創(chuàng)建自定義stack的。需要傳遞stack的地址和大小。
os_tsk_create_user_ex(task_name,priority,&stack,sizeof(stack),para);
這個明顯就是上面兩個的結(jié)合。
以上這些創(chuàng)建操作,返回類型都是OS_TID,進程ID,實際值從0到255。 所以可以先聲明一個該類型的值,然后創(chuàng)建進程時讓其返回該值。

2.消滅
os_tsk_delete(taskID);
填入你要消滅的進程的進程ID,TID。
如果要消滅進程本身,用:
os_tsk_delete_self();
注意,RTX的消滅進程并不清理互斥鎖或者信號燈的占有的。所以在消滅一個進程前,確定進程釋放了所有資源。內(nèi)存資源會被這兩個操作釋放,所以不用擔(dān)心。

3.雜項
如果想要知道當(dāng)前進程的ID,使用以下操作:
os_get_TID();
還有一個非常重要的:
os_sys_init(first_task);
這個操作初始化整個RTX,如果不在main中執(zhí)行這一操作,一切都是空談。該操作會創(chuàng)建第一個進程,也就是first_task。

一般而言,進程可以創(chuàng)造別的進程,也可以消滅別的進程。但進程只能夠消滅本身,而不能創(chuàng)造本身。所以就需要有一個操作去創(chuàng)建第一個進程,然后別的進程可由這個第一個進程去創(chuàng)造。

3.一個完整的例子
一下是一個從初始化,到創(chuàng)建第一個進程,到第一個進程創(chuàng)建別的進程,最后消滅自己的一個例子:

	OS_TID?taskID1;???
	OS_TID?taskID2;???
	??
	__task?void?init?(void)?{??
	????//Necessary?Initialization??
	????//...??
	????//Create?a?task??
	????taskID1?=?os_tsk_create(task1,?0);??
	????taskID2?=?os_tsk_create(task2,?0);??
	????????os_tsk_delete_self?();?//?Delete?the?init(self)?task??
	}??
	??
	int?main(void)??
	{??
	????//Necessary?Initialization??
	????//...??
	????????os_sys_init(init);??
	??
	}

這個簡單的例子足夠應(yīng)付最基本使用RTX的需求了。

關(guān)于RTX的排程,優(yōu)先度,內(nèi)存分配和一些OS原語,在后面的筆記會記錄。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉