thread學(xué)習(xí)筆記_第1頁(yè)
thread學(xué)習(xí)筆記_第2頁(yè)
thread學(xué)習(xí)筆記_第3頁(yè)
thread學(xué)習(xí)筆記_第4頁(yè)
thread學(xué)習(xí)筆記_第5頁(yè)
已閱讀5頁(yè),還剩46頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、threadx 學(xué)習(xí)筆記(一)tx_ill.s文件用來(lái)處理初始化過(guò)程中的匯編語(yǔ)言,它是面向處理器和 開(kāi)發(fā)工具的。Void_tx_initialize_low_level1、CPSCR尸 FIQ_ MODE,SET SP_fiq;2、CPSCR|=IRQ_MODE,SET SP_irp;3、CPSCR|=SVC_MODE,SET SP_svc;4、設(shè)置中斷向量表IRQ_TABLE;5、設(shè)置內(nèi)部TIMER線程的堆棧起始地址,堆棧大小和優(yōu)先級(jí): tx timer stack start, tx timer stack size, tx timer priorit;6、設(shè)置初始化后未使用內(nèi)存地址的初始

2、值_tx_initialize_unused_memory;Tx_tcs.s負(fù)責(zé)在中斷發(fā)生時(shí)對(duì)上次的運(yùn)行現(xiàn)場(chǎng)進(jìn)行保存,它保存中斷上下文,為了不覆蓋 R14_irq離得中斷返回地址,TCS的返回是通過(guò)跳 到_tx_irq_processing_return地址做到的。Tx_TCR.領(lǐng)責(zé)中斷處理程序 執(zhí)行完后的處理。Void _tx_thread_context_save1、把表示中斷嵌套個(gè)數(shù)的變量_tx_thread_system_state+;2、 if _tx_thread_system_state>1,PUSH R0-R3,CPSR,R14 in IRQ stack,B _tx_ir

3、q_processing_return;3、 else if _tx_thread_current_ptr=0 判斷是否有線程正在運(yùn)行, if not ,B _tx_irq_processing_return;4、 else,PUSHContext_irq in thread s stack,SP_thread=new SP,B _tx_irq_processing_return;由于R13和R14在不同的CPU模式下對(duì)應(yīng)的是不同的物理寄存器,所以若要得到中斷前的線程堆棧指針,需要先返回到該線程的運(yùn)行模式,同時(shí)禁止中斷,取值后再返回到終端模式。R14_irq保存的是終端發(fā)生時(shí)PC值+8, R1

4、4_svc保存得失中斷前線程自己的返回地址。所以在中段上下文中,(R14_irq-4)應(yīng)該存在中斷地址,而R14_svc存在R14 的位置。Void _tx_thread_context_restore1、 _tx_thread_system_state-,if _tx_thread_system_state>0,POP R0-R3,CPSR,R14 from IRQ stack,BX R14;2、 else if _tx_thread_current_ptr=0?if =0CPSR|=VC_MODE,CPSR|=TX_INT_ENABLE 線程調(diào)度程序 B _tx_thread_sch

5、edule;3、if!=0,則判斷線程搶占是否禁止if_tx_thread_preempt_disable=0?if!=0,POP Context_irq from thread stack,BX R14;4、 if=0,_tx_timer_time_slice=newvalue,_tx_thread_current_ptr=0,CPSR|=SVC_MODE設(shè)置堆棧指針為系統(tǒng) 指針SP=SP_sv,c CPSR|=TX_INT_ENABLE;5、 B _tx_thread_schedule;Tx_tsr.s 用于從線程退回到系統(tǒng)態(tài), 負(fù)責(zé)保存線程的最小語(yǔ)境并退回到 Threadx 的調(diào)度循環(huán)狀

6、態(tài)。它保存的上下文是請(qǐng)求上下文。Void _tx_thread_system_return1、 ? PUSH Context_request:in thread s stack,CPSR|=TX_INT_DISABLE;2、 ? _tx_thread_current_ptr->SP=SP,CPSR|=SVC_MODE;3、 ? 設(shè)置堆棧指針為系統(tǒng)指針SP=SP_sv,c_tx_thread_current_ptr=0,CPSR|=TX_INT_ENABLE;4、 ? B _tx_thread_schedule;由于用戶模式不能直接更改CPS既關(guān)斷的,所以要通過(guò)SWI指令進(jìn)入特權(quán)模式,而且

7、特權(quán)模式和用戶模式的SP對(duì)應(yīng)不同的物理寄存器,所以要在轉(zhuǎn)入系統(tǒng)模式取得用戶模式下SP,最后再回到特權(quán)模式。TX_TS.領(lǐng)責(zé)調(diào)度和恢復(fù)就緒的優(yōu)先級(jí)最高的線程的最后語(yǔ)境。Void _tx_thread_schedule1 、 ? while(_tx_thread_execute_ptr=0);?CPSR|=TX_INT_DISABLE,_tx_threadx_current_ptr=_tx_thread_ execute_ptr;3 、 ?tx_thread_current_ptr->TX_run_count+,_tx_timer_time_slice=_tx_thread_current_

8、ptr->tx_time_slice;4、 ? If 線程堆棧的中斷類(lèi)型=1, restore Context_irq,elserestore Context_request;Tx_tic.s 用于開(kāi)中斷和關(guān)中斷。Unint _tx_thread_interrupt_control(unint new _posture)1、? R1=CPSR;2、? SWI;3、4、? CPSR|=RO=new posture;? R0=R1,R0為返回值;移植該函數(shù)時(shí),針對(duì)不同的處理器,應(yīng)蓋根據(jù)準(zhǔn)熱愛(ài)寄存器 CPSR勺中斷禁止未來(lái)設(shè)置開(kāi)關(guān)中斷向量,主要修改TX_PORT.H的TX INT ENABLE

9、D TX INT DISABLE.R0來(lái)傳遞的參數(shù)和結(jié)果。Tx_tsb.s 負(fù)責(zé)創(chuàng)建每個(gè)線程的初始堆棧結(jié)構(gòu),這個(gè)初始的結(jié)構(gòu)在線程 創(chuàng)建時(shí)會(huì)引起中斷上下文返回到 _tx_thread_shell_entry 函數(shù)的開(kāi)頭。 然 后這個(gè)函數(shù)調(diào)用指定線程入口函數(shù)。其中斷類(lèi)型設(shè)置為 1 ,表示中斷上 下文。Void _tx_thread_stack_build(TXTHREAD *thread_ptr,void (*function)(void)1、??保證堆棧起始地址八字節(jié)對(duì)齊;2、??中斷地址存入線程調(diào)用的入口地址PUSH function_ptr;3、?? R0-R12,R14的初始值都設(shè)置為 0

10、, PUSH初始值;4、??要存入堆棧的CPSR直設(shè)置為用戶模式,開(kāi)中斷,標(biāo) 志位清零,R1=USER_MODE,PUSH R1;5、 ? Thread_ptr->sp=new SP;當(dāng)處理一個(gè)低級(jí)的中斷時(shí),tx_tpc.s決定是否發(fā)生搶占,它是可選的, 大多數(shù)端口都用不到。TX_TIMIN.S負(fù)責(zé)處理定時(shí)中斷。這兩個(gè)函數(shù)只要 將它們翻譯成相應(yīng) ARM匯編語(yǔ)言就可以了。threadx 學(xué)習(xí)筆記(二)-1tx_kernel_enter ();進(jìn)入 threadx 核tx_kernel_enter ()void tx_kernel_enter (void )所屬文件??磯用者??開(kāi)關(guān)量dem

11、oC?O動(dòng)代碼??無(wú)操作系統(tǒng)首先從從量表直接進(jìn)入該函數(shù),在函數(shù)以前沒(méi)有進(jìn)行任何的硬件及軟件的 初始化!該函數(shù)主要包含_tx_initialize_low_level (),_tx_initialize_high_level (),tx_application_define (_tx_initialize_unused_memory ), _tx_thread_schedule ()。VOID_tx_initialize_kernel_enter (VOID) ?/*確定編譯器是否已經(jīng)初始化過(guò)*/ ?if (_tx_thread_system_state != TX_INITIALIZE_ALM

12、OST_DONE ?*沒(méi)有初始化的話執(zhí)行下面程序*/*設(shè)置系統(tǒng)狀態(tài)變量來(lái)表示現(xiàn)正在處理過(guò)程中注意該變量在后邊的中斷嵌套中會(huì)使用?*/?_tx_thread_system_state = TX_INITIALIZE_IN_PROGRESS?7*進(jìn)行一些基本硬件設(shè)置,啟動(dòng)程序等 */?_tx_initialize_low_level (); ? ?7*進(jìn)行一些高級(jí)的初始化*/ ?_tx_initialize_high_level (); ?/*設(shè)置系統(tǒng)狀態(tài)變量來(lái)表示現(xiàn)正在處理過(guò)程中注意該變量在后邊的中斷嵌套中會(huì)使用*/?_tx_thread_system_state = TX_INITIALIZE

13、_IN_PROGRESS?/*調(diào)用初始化中提供的應(yīng)用程序把第一個(gè)未使用的變量地址傳送給它*/?tx_application_define (_tx_initialize_unused_memory );?/*設(shè)置系統(tǒng)壯偉進(jìn)入線程調(diào)度做準(zhǔn)備*/?_tx_thread_system_state = TX_INITIALIZE_IS_FINISHED;?/*進(jìn)入線程循環(huán)開(kāi)始執(zhí)行線程*/?_tx_thread_schedule ();_tx_initialize_low_level ()void tx_kernel_enter (void )所屬文件??磯用者??開(kāi)關(guān)量tx_till. s?啟動(dòng)代碼?

14、?無(wú)該函數(shù)實(shí)現(xiàn)對(duì)FIQ、IRQ和SVC奠式下的sp寄存器的初始化,并對(duì)定時(shí)堆棧的基地 址、大小和定時(shí)優(yōu)先級(jí)變量進(jìn)行初始化。/*進(jìn)行一些基本硬件設(shè)置,啟動(dòng)程序等*/*該函數(shù)在文件tx_ill.s 文件中*/?_tx_initialize_low_level ();/* VOID _tx_initialize_low_level(VOID);?EXPORT _tx_initialize_low_level_tx_initialize_low_level;/*保存系統(tǒng)堆棧指針.*/;/* _tx_thread_system_stack_ptr = (VOID_PTR) A7 (SP); */;?/*

15、設(shè)置各個(gè)模式下的sp (堆棧指針)*/;/* We must be in SVC mode at this point! */;?LDR a2 =| Image$ZI$Limit | ; Get end of non - initialized RAM area?LDRa3, pc, #FIQ_STACK_SIZE- 8;獲得FIO堆棧地址(這里沒(méi)有弄明白, 有待?)?MOV a1 #FIQ_MODE 設(shè)置 FIQ_MODE?MSR CPSR_ca1 ;進(jìn)入 FIQ 模式?ADD a2 a2, a3 ;計(jì)算FIQ堆棧的開(kāi)始?BIC a2, a2, #3 ;將a2的低兩位清零確保堆棧的的開(kāi)始為l

16、ong對(duì)齊?SUB a2 a2, #4 ;往回退一個(gè)字?MOV sp a2 ;建立FIQ堆棧指針(即FIQ模式的sp)?MOV s, #0 ; Clear sl (R1。?MOV fp #0 ; Clear fp (R11)?LDR a3 pc, #SYS_STACK_SIZE 8 ?;獲得 IRQ (system stack size )?MOV a1 #IRQ_MODE 建立 IRQ模式的 CPSR?MSR CPSR_ca1 ;進(jìn)入 IRQ模式?ADD a2 a2, a3 ;計(jì)算 IRQ stack 的開(kāi)始?BIC a2, a2, #3 ;將a2的低兩位清零確保堆棧的的開(kāi)始為long對(duì)齊?

17、SUB a2 a2, #4 ;往回退一個(gè)字?MOV sp a2 ;建立IRQ堆棧指針?MOV a1 #SVC_MODE 建立 SVCf 式的 CPSR?MSR CPSR_ca1 ;進(jìn)入 SVC模式?LDR a4 pc, #SYS_STACK_PTR8;獲得 stack 指針?STR a2 a4, #0;保存系統(tǒng)堆棧;;/* Save the system stack pointer. */;_tx_thread_system_stack_ptr = (VOID_PTR (sp); ;?LDR a2 pc, #SYS_STACK_PTR8;獲得系統(tǒng)堆棧指針的地址?LDR al a2, #0;獲得

18、系統(tǒng)堆棧指針?ADD a1 a1 , #4 ;增加一個(gè) long 長(zhǎng)度 ;/* Pickup the first available memory address. */ ;/* Allocate space for the timer thread's stack. */;_tx_timer_stack_start = first_available_memory ;_tx_timer_stack_size = stack_size ;_tx_timer_priority = 0 ; ;?LDR a2 pc, #TIMER_STACK 8;獲得定時(shí)堆棧指針地址?LDR a4 pc,

19、#TIMER_STACK_SIZE 8;獲得定時(shí)堆棧大小地址?LDR a3 pc, #TIM_STACK_SIZE 8;獲得實(shí)際定時(shí)堆棧大小?STR al a2, #0;將定時(shí)堆棧的基地址放在堆棧指針地址所對(duì)應(yīng)的內(nèi)存中?STR a3 a4, #0;存儲(chǔ)定時(shí)器堆棧大小?ADD a1 a1 , a3 ;新的空內(nèi)存地址?LDR a2 pc, #TIMER_PRIORITY 8;獲得定時(shí)器優(yōu)先級(jí)地址?MOV a3 #0 ;獲得定時(shí)器線程優(yōu)先級(jí)?STR a3 a2, #0;存儲(chǔ)定時(shí)器線程優(yōu)先級(jí);/*保存第一個(gè)變量?jī)?nèi)存地址.*/;_tx_initialize_unused_memory = (VOID_P

20、TR System Stack + Timer Stack; ;?LDR a3 pc, #UNUSED_MEMORY;獲得沒(méi)有使用的內(nèi)存指針地址?STR al a3, #0;保存第一個(gè)空內(nèi)存地址;/*建立周期性白定時(shí)中斷.*/?STMDB LF ?/讓 lr 入棧,保護(hù) lr?BL?TargetInit? /TargetInit ()為 C語(yǔ)言編寫(xiě)的中斷定 時(shí)函數(shù)?LDMIAlr ?/讓 lr 出棧?在這里加上ARMS時(shí)器已實(shí)現(xiàn)周期性的中斷;/* Done, return to caller. */ ;?MOV pc lr ; Return to caller;_tx_irq_handler所

21、屬文件??磯用者??開(kāi)關(guān)量tx_till . s? IRQ 中斷?沈該函數(shù)是在定時(shí)中斷后調(diào)用,該函數(shù)調(diào)用了 _tx_thread_context_save 函數(shù)(包含 在tx_tcs .s中),該函數(shù)又調(diào)用到 _tx_irq_processing_return函數(shù)處(包含在tx_till . s)?EXPORT_tx_irq_handler?EXPORT tx irq processing return _tx_irq_handler?; J?; /*調(diào)用函數(shù)保存線程上下文環(huán)境.*/?B _tx_thread_context_save_tx_irq_processing_return ?; J

22、;/* At this point execution is still in the IRQ mode. The CPSR, point of;interrupt, and all C scratch registers are available for use. In;addition, IRQ interrupts may be re-enabled - with certain restrictions -;if nested IRQ interrupts are desired. Interrupts may be re-enabled over;small code sequen

23、ces where lr is saved before enabling interrupts and;restored after interrupts are again disabled. */ ?; J;/* For debug purpose, execute the timer interrupt processing here. In;a real system, some kind of status indication would have to be checked?; before the timer interrupt handler could be called

24、. */ ?; JBL? clearflag?;清除中斷標(biāo)志位很重要(自己移植時(shí)加的,位置 是否恰當(dāng)?)?BL _tx_timer_interrupt ;定時(shí)中斷處理函數(shù) ?; J?; /*系統(tǒng)線程上下文環(huán)境恢復(fù)函數(shù)*/?B _tx_thread_context_restore_tx_timer_interrupt所屬文件??磯用者??開(kāi)關(guān)量tx_timin . s?啟動(dòng)代碼??無(wú)該函數(shù)主要是中斷后將系統(tǒng)時(shí)鐘加1,時(shí)間切片減1。定時(shí)部分比較多,沒(méi)有完全看明白。IMPORT _tx_timer_time_slice?IMPORT _tx_timer_system_clock?IMPORT _tx

25、_timer_current_ptr?IMPORT _tx_timer_list_start?IMPORT _tx_timer_list_end?IMPORT _tx_timer_expired_time_slice?IMPORT _tx_timer_expired?IMPORT _tx_timer_thread?IMPORT _tx_thread_current_ptr?IMPORT _tx_thread_time_slice?IMPORT _tx_thread_resume?IMPORT _tx_thread_preempt_disable;?PRESERVE8?AREA C$code,C

26、ODE READONLY| x$codeseg| DATA;VOID_tx_timer_interrupt (VOID;?EXPORTtx_timer_interrupt_tx_timer_interrupt;/* Upon entry to this routine, it is assumed that context save has already;been called, and therefore the compiler scratch registers are available;for use. */J;/* Increment the system clock. */;_

27、tx_timer_system_clock +;;?LDR a2 pc, #SYSTEM_CLOCK8;獲得系統(tǒng)時(shí)鐘地址?LDR al a2, #0;獲得系統(tǒng)時(shí)鐘?ADD al al , #1 ;將系統(tǒng)時(shí)鐘加1?STR al a2, #0;存儲(chǔ)新的系統(tǒng)時(shí)鐘時(shí)間;;/* Test for time-slice expiration. */;if (_tx_timer_time_slice );?LDR a4 pc, #TIME_SLICE.- 8;獲得鏈表中的定時(shí)切片數(shù)地址?LDR a3 a4, #0;獲得定時(shí)切片數(shù)的值?CMP a3 #0 ;定時(shí)切片是否有效,0有效,=0無(wú)效?BEQ _tx_

28、timer_no_time_slice; =0 時(shí),跳至U _tx_timer_no_time_slice處;/*時(shí)間切片減1.*/;_tx_timer_time_slice -;;?SUB a3 a3, #1 ;時(shí)間切片值減1?STR a3 a4, #0;存儲(chǔ)新的時(shí)間切片值;;/*檢查是否到期.*/;if (_tx_timer_time_slice= 0);?CMP a3 #0 ; >0 還是=0?BNE _tx_timer_no_time_slice;如果 >0,;當(dāng)沒(méi)有定時(shí)切片時(shí),將定時(shí)切片數(shù)標(biāo)志位置1,表示鏈表中沒(méi)有切片了;/* Set the time-slice exp

29、ired flag. */;_tx_timer_expired_time_slice = TX_TRUEJ?LDR a4 pc, #EXPIRED_TIME_SLICE 8;獲得定時(shí)切片數(shù)是否為 0標(biāo)志地址?MOV a,1 #1 ;將標(biāo)志設(shè)為 1?STR al a4, #0;設(shè)立到時(shí)標(biāo)志Jtx timer no time sliceJ;/* Test for timer expiration. */;if (* _tx_timer_current_ptr );J的地LDR a2 pc, #TIMER_CURRENT_PT網(wǎng);獲得的是_tx_timer_current_ptr址?而 TIMER_

30、DECLARE TX_INTERNAL_TIMER* _tx_timer_current_ptr ?LDR a1, a2, #0;獲得當(dāng)前的 _tx_timer_current_ptrLDR a3 a1, #0;獲得定時(shí)列表的入口定時(shí)切片指針CMP a3 #0 ;鏈表中是否有定時(shí)切片存在?BEQ _tx_timer_no_timer;不存在,調(diào)用_tx_timer_no_time 將;_tx_timer_current_ptr +;;/* Set expiration flag. */;_tx_timer_expired = TX_TRUE ;?LDR a4 pc, #EXPIRED- 8 ;

31、 Pickup expriation flag address?MOV a3 #1 ; Build expired value?STR a3 a4, #0 ; Set expired flag?B _tx_timer_done ; Finished timer processing ;else;_tx_timer_no_timer ;/* No timer expired, increment the timer pointer. */;_tx_timer_current_ptr +; ;?ADD a1 a1 , #4 ; Move to next timer ;/* Check for wr

32、ap-around. */;if (_tx_timer_current_ptr= _tx_timer_list_end)?LDR a4 pc, #LIST_END.- 8 ; Pickup addr of timer list end?LDR a3 a4, #0 ; Pickup list end?CMP a1 a3 ; Are we at list end ?BNE _tx_timer_skip_wrap ; No, skip wrap - around logic ;/* Wrap to beginning of list. */;_tx_timer_current_ptr = _tx_t

33、imer_list_start ; ;?LDR a4 pc, #LIST_START- 8 ; Pickup addr of timerlist start?LDR al a4, #0 ; Set current pointer to list start ;_tx_timer_skip_wrap;?STR al a2, #0 ; Store newcurrent timer pointer ;_tx_timer_done; ;;/* See if anything has expired. */;if (_tx_timer_expired_time_slice ) | (_tx_timer_

34、expired );?LDR a4 pc, #EXPIRED_TIME_SLICE 8 ; Pickup addr of expired flag?LDR a3 a4, #0 ; Pickup time - slice expired flag?CMP a3 #0 ; Did a time - slice expire ?BNE _tx_something_expired ; If non-zero, time - slice expired?LDR a2 pc, #EXPIRED- 8 ; Pickup addr of other expired flag?LDR a1, a2, #0 ;

35、Pickup timer expired flag?CMP a1 #0 ; Did a timer expire ?BEQ _tx_timer_nothing_expired; No, nothing expired;_tx_something_expired ;?STR lr, sp, #-4! ; Save the lr register on the stack ;/* Did a timer expire? */;if (_tx_timer_expired );?LDR a2 pc, #EXPIRED- 8 ; Pickup addr of expired flag?LDR al, a

36、2, #0 ; Pickup timer expired flag?CMP al #0 ; Check for timer expiration?BEQ _tx_timer_dont_activate; If not set, skip timer activation;;/* Increment the preempt disable counter in preparation for;thread resumption. */;_tx_thread_preempt_disable +; ;?LDR a4 pc, #PREEMPT_DISABl-E8 ; Pickup addr of pr

37、eempt disable ?LDR a3 a4, #0 ; Pickup actual flag?ADD a3 a3 , #1 ; Incrment the preempt disable count?STR a3 a4, #0 ; Store it back;;/* Activate the system timer thread. */;_tx_thread_resume (&_tx_timer_thread );?LDR a1 pc, #TIMER_THREAD 8 ; Get timer thread control block addr ?BL _tx_thread_res

38、ume ; Call thread resume to wake up the?timer thread;_tx_timer_dont_activate;/* Did time slice expire? */;if (_tx_timer_expired_time_slice );?LDR a4 pc, #EXPIRED_TIME_SLICE 8 ; Pickup addr of time - slice expired?LDR a3 a4, #0 ; Pickup the actual flag?CMP a3 #0 ; See if the flag is set?BEQ _tx_timer

39、_not_ts_expiration; No, skip time - slice processing;/* Time slice interrupted thread. */;if (! _tx_thread_time_slice ();_tx_timer_time_slice = _tx_thread_current_ptr -> tx_time_slice ;?BL _tx_thread_time_slice ; Call time - slice processing?CMP al #0 ; Check return status?BNE _tx_timer_not_ts_ex

40、piration; If time - sliced , skip resetprocessing?LDR a2 pc, #CURRENT_PTR8 ; Pickup addr of current thread pointer?LDR al a2, #0 ; Pickup thread pointer?LDR a3 a1, #24 ; Pickup fresh time - slice for thread?(a fresh time slice was setup in?the_tx_thread_time_slice function )?LDR a4 pc, #TIME_SLICE.-

41、 8 ; Pickup addr of time-slice variable?STR a3 a4, #0 ; Setup new time - slice;_tx_timer_not_ts_expiration;?LDR a4 pc, #EXPIRED_TIME_SLICE 8 ; Pickup address of expiredtime - slice flag?MOV a1 #0 ; Clear value?STR al a4, #0 ; Clear time - slice expired flag ;?LDR lr, sp, #4 ; Recover lr register;_tx

42、_timer_nothing_expired;?MOV pc Ir ; Return to caller;TIME_SLICE?DCD _tx_timer_time_sliceSYSTEM_CLOCK?DCD _tx_timer_system_clockTIMER_CURRENT_PTR?DCD _tx_timer_current_ptrLIST_START?DCD _tx_timer_list_startLIST_END?DCD _tx_timer_list_endEXPIRED_TIME_SLICE?DCD _tx_timer_expired_time_sliceEXPIRED?DCD _

43、tx_timer_expiredTIMER_THREAD?DCD _tx_timer_threadCURRENT_PTR?DCD _tx_thread_current_ptrTHREAD_TIME_SLICE?DCD _tx_thread_time_sliceRESUME?DCD _tx_thread_resumePREEMPT_DISABLE?DCD _tx_thread_preempt_disable?END_tx_initialize_high_level ()VOID_tx_initialize_high_level (VOID)所屬文件??磯用者??開(kāi)關(guān)量tx_ihl . c?啟動(dòng)代

44、碼???沈主要時(shí)對(duì)一些與硬件無(wú)關(guān)的變量進(jìn)行初始化,其中主要實(shí)現(xiàn)了線程的初始化;定時(shí) 的初始化,這里定時(shí)也是一個(gè)線程,且優(yōu)先級(jí)為最高0;還有對(duì)信號(hào)量、隊(duì)列、時(shí)間標(biāo)志、塊池、和字節(jié)池的初始化。/*進(jìn)行一些高級(jí)的初始化*/?_tx_initialize_high_level ();?VOID_tx_initialize_high_level (VOID?/* Initialize the event log, if enabled. */?TX_EL_INITIALIZE?/*調(diào)用線程初始化函數(shù).*/?_tx_thread_initialize ();?/*調(diào)用定時(shí)初始化函數(shù)*/?_tx_timer

45、_initialize ();?/*調(diào)用信號(hào)量初始化函數(shù)*/?_tx_semaphore_initialize ();?/*調(diào)用隊(duì)列初始化函數(shù)*/?_tx_queue_initialize ();?/*調(diào)用事件標(biāo)志初始化函數(shù).*/?_tx_event_flags_initialize ();?/*調(diào)用block pool初始化函數(shù).*/?_tx_block_pool_initialize ();?/*調(diào)用byte pool初始化函數(shù).*/?_tx_byte_pool_initialize ();/*調(diào)用線程初始化函數(shù).*/_tx_thread_initialize ();VOID_tx_thr

46、ead_initialize (VOID)所屬文件??磯用者??開(kāi)關(guān)量tx_ti .c?啟動(dòng)代碼??無(wú)此函數(shù)主要實(shí)現(xiàn)對(duì)與線程有關(guān)的一些變量進(jìn)行初始化。?VOID_tx_thread_initialize (VOID)REG_1 UINT i; /* Working index variable */REG_2 UCHAR set_bit /* Lowest set bit ? */ HREG_3 UINT temp /* Working shift variable? */REG_4 UCHARowest_set_ptr ; /* Pointer in set bit array? */REG

47、_5 TX_THREAD_PTR?p?ority_list_ptr; /* Pointer in priority list */?/* Note: the system stack pointer and the system state variables are ?initialized by the low and high-level initialization functions, ?respectively. */?/*初始化當(dāng)前線程指針為空*/?_tx_thread_current_ptr = TX_NULL?/*初始化要執(zhí)行線程指針為空.*/?_tx_thread_exec

48、ute_ptr = TX_NULL?/*初始化優(yōu)先級(jí)信息*/?_tx_thread_priority_map = 0;?_tx_thread_preempted_map = 0 ;?_tx_thread_highest_priohty = TX_MAX_PRIORITIE;S/*初始化the lowest-set bit表.這被用來(lái)當(dāng)線程被掛起和從新啟動(dòng)時(shí)尋找下一 個(gè)準(zhǔn)備執(zhí)行的線程*/?_tx_thread_lowest_bit 0 = 0 ;?lowest_set_ptr = &_tx_thread_lowest_bit 1;?or (i = 1 ; i < TX_THREAD

49、_MAX_BYTE_VALUBS)?*將當(dāng)前序號(hào)給臨時(shí)變量*/? temp = i ;? /*尋找字節(jié)中的最低比特位設(shè)置,即在一個(gè)字節(jié)中的最高優(yōu)先級(jí)*/ r?set_bit = 0;?While (!( temp & 1)?*把序號(hào)往右移動(dòng)一位.并且增加set-bit 的位置.*/?temp = temp >> 1 ;?set_bit +;?/*預(yù)先求出對(duì)應(yīng)的線程優(yōu)先級(jí) byte值所對(duì)應(yīng)的優(yōu)先級(jí)最高的的bit位*/*( lowest_set_ptr +) = set_bit ;/*例如priorityb_byte 的值為5即0x101那么所對(duì)應(yīng)的優(yōu)先級(jí)最高為 0,則?low

50、est_set_ptrpriorityb_byte=0*/*當(dāng)優(yōu)先級(jí)字節(jié)的值為i時(shí),我們很快可以知道該字節(jié)的高優(yōu)先級(jí)為第_tx_thread_lowest_bitibit 位。*/?/*初始化優(yōu)先級(jí)頭指針隊(duì)列.即將線程塊對(duì)應(yīng)的空間都初始化為空*/?priority_list_ptr = &_tx_thread_priority_list 0;?or (i = 0 ; i < TX_MAX_PRIORITIE;Si +)?*( priority_list_ptr+) = TX_NULL?/* I初始化以創(chuàng)建線程列表的頭指針和以創(chuàng)建線程的個(gè)數(shù)*/?_tx_thread_created

51、_ptr= TX_NULL?_tx_thread_created_count = 0 ;?/* Clear the global preempt disable variable.? ? ? */?_tx_thread_preempt_disable = 0;VOID_tx_timer_initialize (VOID所屬文件??磯用者??開(kāi)關(guān)量tx_timi . c?啟動(dòng)代碼??無(wú)主要實(shí)現(xiàn)有定時(shí)器有關(guān)的一些變量的初始化,并建立了一個(gè)線程專門(mén)由于定時(shí)管 理。/*調(diào)用定時(shí)初始化函數(shù)*/?_tx_timer_initialize ();?VOID_tx_timer_initialize (VOID)REG_1 UINT i; /* Working index variable */REG_2 TX_INTERNAL_TIMERtimer_ptr ; /* Working timer pointer */?/*初始化系統(tǒng)時(shí)鐘為0.*/?_tx_timer_system_clock = 0;?/*初始化時(shí)間切片的值為0以確保它是無(wú)效的? ? */?_tx_timer_time_slice

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論