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

下載本文檔

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

文檔簡介

1、threadx 學(xué)習(xí)筆記(一)tx_ill.s文件用來處理初始化過程中的匯編語言,它是面向處理器和 開發(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)先級: 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ā)生時對上次的運(yùn)行現(xiàn)場進(jìn)行保存,它保存中斷上下文,為了不覆蓋 R14_irq離得中斷返回地址,TCS的返回是通過跳 到_tx_irq_processing_return地址做到的。Tx_TCR.領(lǐng)責(zé)中斷處理程序 執(zhí)行完后的處理。Void _tx_thread_context_save1、把表示中斷嵌套個數(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模式下對應(yīng)的是不同的物理寄存器,所以若要得到中斷前的線程堆棧指針,需要先返回到該線程的運(yùn)行模式,同時禁止中斷,取值后再返回到終端模式。R14_irq保存的是終端發(fā)生時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é)保存線程的最小語境并退回到 Threadx 的調(diào)度循環(huán)狀

6、態(tài)。它保存的上下文是請求上下文。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)斷的,所以要通過SWI指令進(jìn)入特權(quán)模式,而且

7、特權(quán)模式和用戶模式的SP對應(yīng)不同的物理寄存器,所以要在轉(zhuǎn)入系統(tǒng)模式取得用戶模式下SP,最后再回到特權(quán)模式。TX_TS.領(lǐng)責(zé)調(diào)度和恢復(fù)就緒的優(yōu)先級最高的線程的最后語境。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 線程堆棧的中斷類型=1, restore Context_irq,elserestore Context_request;Tx_tic.s 用于開中斷和關(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ù)時,針對不同的處理器,應(yīng)蓋根據(jù)準(zhǔn)熱愛寄存器 CPSR勺中斷禁止未來設(shè)置開關(guān)中斷向量,主要修改TX_PORT.H的TX INT ENABLE

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

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

11、oC?O動代碼??無操作系統(tǒng)首先從從量表直接進(jìn)入該函數(shù),在函數(shù)以前沒有進(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)初始化過*/ ?if (_tx_thread_system_state != TX_INITIALIZE_ALM

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

13、_IN_PROGRESS?/*調(diào)用初始化中提供的應(yīng)用程序把第一個未使用的變量地址傳送給它*/?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)開始執(zhí)行線程*/?_tx_thread_schedule ();_tx_initialize_low_level ()void tx_kernel_enter (void )所屬文件??磯用者??開關(guān)量tx_till. s?啟動代碼?

14、?無該函數(shù)實(shí)現(xiàn)對FIQ、IRQ和SVC奠式下的sp寄存器的初始化,并對定時堆棧的基地 址、大小和定時優(yōu)先級變量進(jìn)行初始化。/*進(jìn)行一些基本硬件設(shè)置,啟動程序等*/*該函數(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è)置各個模式下的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堆棧地址(這里沒有弄明白, 有待?)?MOV a1 #FIQ_MODE 設(shè)置 FIQ_MODE?MSR CPSR_ca1 ;進(jìn)入 FIQ 模式?ADD a2 a2, a3 ;計(jì)算FIQ堆棧的開始?BIC a2, a2, #3 ;將a2的低兩位清零確保堆棧的的開始為l

16、ong對齊?SUB a2 a2, #4 ;往回退一個字?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 的開始?BIC a2, a2, #3 ;將a2的低兩位清零確保堆棧的的開始為long對齊?

17、SUB a2 a2, #4 ;往回退一個字?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 ;增加一個 long 長度 ;/* 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;獲得定時堆棧指針地址?LDR a4 pc,

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

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

21、屬文件??磯用者??開關(guān)量tx_till . s? IRQ 中斷?沈該函數(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)志位很重要(自己移植時加的,位置 是否恰當(dāng)?)?BL _tx_timer_interrupt ;定時中斷處理函數(shù) ?; J?; /*系統(tǒng)線程上下文環(huán)境恢復(fù)函數(shù)*/?B _tx_thread_context_restore_tx_timer_interrupt所屬文件??磯用者??開關(guān)量tx_timin . s?啟動代碼??無該函數(shù)主要是中斷后將系統(tǒng)時鐘加1,時間切片減1。定時部分比較多,沒有完全看明白。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)時鐘地址?LDR al a2, #0;獲得系統(tǒng)時鐘?ADD al al , #1 ;將系統(tǒng)時鐘加1?STR al a2, #0;存儲新的系統(tǒng)時鐘時間;;/* Test for time-slice expiration. */;if (_tx_timer_time_slice );?LDR a4 pc, #TIME_SLICE.- 8;獲得鏈表中的定時切片數(shù)地址?LDR a3 a4, #0;獲得定時切片數(shù)的值?CMP a3 #0 ;定時切片是否有效,0有效,=0無效?BEQ _tx_

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

29、ired flag. */;_tx_timer_expired_time_slice = TX_TRUEJ?LDR a4 pc, #EXPIRED_TIME_SLICE 8;獲得定時切片數(shù)是否為 0標(biāo)志地址?MOV a,1 #1 ;將標(biāo)志設(shè)為 1?STR al a4, #0;設(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;獲得定時列表的入口定時切片指針CMP a3 #0 ;鏈表中是否有定時切片存在?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)所屬文件??磯用者??開關(guān)量tx_ihl . c?啟動代

44、碼???沈主要時對一些與硬件無關(guān)的變量進(jìn)行初始化,其中主要實(shí)現(xiàn)了線程的初始化;定時 的初始化,這里定時也是一個線程,且優(yōu)先級為最高0;還有對信號量、隊(duì)列、時間標(biāo)志、塊池、和字節(jié)池的初始化。/*進(jìn)行一些高級的初始化*/?_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ù)*/?_tx_timer

45、_initialize ();?/*調(dià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)所屬文件??磯用者??開關(guān)量tx_ti .c?啟動代碼??無此函數(shù)主要實(shí)現(xiàn)對與線程有關(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)先級信息*/?_tx_thread_priority_map = 0;?_tx_thread_preempted_map = 0 ;?_tx_thread_highest_priohty = TX_MAX_PRIORITIE;S/*初始化the lowest-set bit表.這被用來當(dāng)線程被掛起和從新啟動時尋找下一 個準(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)前序號給臨時變量*/? temp = i ;? /*尋找字節(jié)中的最低比特位設(shè)置,即在一個字節(jié)中的最高優(yōu)先級*/ r?set_bit = 0;?While (!( temp & 1)?*把序號往右移動一位.并且增加set-bit 的位置.*/?temp = temp >> 1 ;?set_bit +;?/*預(yù)先求出對應(yīng)的線程優(yōu)先級 byte值所對應(yīng)的優(yōu)先級最高的的bit位*/*( lowest_set_ptr +) = set_bit ;/*例如priorityb_byte 的值為5即0x101那么所對應(yīng)的優(yōu)先級最高為 0,則?low

50、est_set_ptrpriorityb_byte=0*/*當(dāng)優(yōu)先級字節(jié)的值為i時,我們很快可以知道該字節(jié)的高優(yōu)先級為第_tx_thread_lowest_bitibit 位。*/?/*初始化優(yōu)先級頭指針隊(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)建線程的個數(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所屬文件??磯用者??開關(guān)量tx_timi . c?啟動代碼??無主要實(shí)現(xiàn)有定時器有關(guān)的一些變量的初始化,并建立了一個線程專門由于定時管 理。/*調(diào)用定時初始化函數(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)時鐘為0.*/?_tx_timer_system_clock = 0;?/*初始化時間切片的值為0以確保它是無效的? ? */?_tx_timer_time_slice

溫馨提示

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

評論

0/150

提交評論