thread学习笔记_第1页
thread学习笔记_第2页
thread学习笔记_第3页
thread学习笔记_第4页
thread学习笔记_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、threadx 学习笔记(一)tx_ill.s文件用来处理初始化过程中的汇编语言,它是面向处理器和 开发工具的。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、设置中断向量表IRQ_TABLE;5、设置内部TIMER线程的堆栈起始地址,堆栈大小和优先级: tx timer stack start, tx timer stack size, tx timer priorit;6、设置初始化后未使用内存地址的初始

2、值_tx_initialize_unused_memory;Tx_tcs.s负责在中断发生时对上次的运行现场进行保存,它保存中断上下文,为了不覆盖 R14_irq离得中断返回地址,TCS的返回是通过跳 到_tx_irq_processing_return地址做到的。Tx_TCR.领责中断处理程序 执行完后的处理。Void _tx_thread_context_save1、把表示中断嵌套个数的变量_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 判断是否有线程正在运行, 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模式下对应的是不同的物理寄存器,所以若要得到中断前的线程堆栈指针,需要先返回到该线程的运行模式,同时禁止中断,取值后再返回到终端模式。R14_irq保存的是终端发生时PC值+8, R1

4、4_svc保存得失中断前线程自己的返回地址。所以在中段上下文中,(R14_irq-4)应该存在中断地址,而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 线程调度程序 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设置堆栈指针为系统 指针SP=SP_sv,c CPSR|=TX_INT_ENABLE;5、 B _tx_thread_schedule;Tx_tsr.s 用于从线程退回到系统态, 负责保存线程的最小语境并退回到 Threadx 的调度循环状

6、态。它保存的上下文是请求上下文。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、 ? 设置堆栈指针为系统指针SP=SP_sv,c_tx_thread_current_ptr=0,CPSR|=TX_INT_ENABLE;4、 ? B _tx_thread_schedule;由于用户模式不能直接更改CPS既关断的,所以要通过SWI指令进入特权模式,而且

7、特权模式和用户模式的SP对应不同的物理寄存器,所以要在转入系统模式取得用户模式下SP,最后再回到特权模式。TX_TS.领责调度和恢复就绪的优先级最高的线程的最后语境。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 用于开中断和关中断。Unint _tx_thread_interrupt_control(unint new _posture)1、? R1=CPSR;2、? SWI;3、4、? CPSR|=RO=new posture;? R0=R1,R0为返回值;移植该函数时,针对不同的处理器,应盖根据准热爱寄存器 CPSR勺中断禁止未来设置开关中断向量,主要修改TX_PORT.H的TX INT ENABLE

9、D TX INT DISABLE.R0来传递的参数和结果。Tx_tsb.s 负责创建每个线程的初始堆栈结构,这个初始的结构在线程 创建时会引起中断上下文返回到 _tx_thread_shell_entry 函数的开头。 然 后这个函数调用指定线程入口函数。其中断类型设置为 1 ,表示中断上 下文。Void _tx_thread_stack_build(TXTHREAD *thread_ptr,void (*function)(void)1、??保证堆栈起始地址八字节对齐;2、??中断地址存入线程调用的入口地址PUSH function_ptr;3、?? R0-R12,R14的初始值都设置为 0

10、, PUSH初始值;4、??要存入堆栈的CPSR直设置为用户模式,开中断,标 志位清零,R1=USER_MODE,PUSH R1;5、 ? Thread_ptr->sp=new SP;当处理一个低级的中断时,tx_tpc.s决定是否发生抢占,它是可选的, 大多数端口都用不到。TX_TIMIN.S负责处理定时中断。这两个函数只要 将它们翻译成相应 ARM汇编语言就可以了。threadx 学习笔记(二)-1tx_kernel_enter ();进入 threadx 核tx_kernel_enter ()void tx_kernel_enter (void )所属文件??矶用者??开关量dem

11、oC?O动代码??无操作系统首先从从量表直接进入该函数,在函数以前没有进行任何的硬件及软件的 初始化!该函数主要包含_tx_initialize_low_level (),_tx_initialize_high_level (),tx_application_define (_tx_initialize_unused_memory ), _tx_thread_schedule ()。VOID_tx_initialize_kernel_enter (VOID) ?/*确定编译器是否已经初始化过*/ ?if (_tx_thread_system_state != TX_INITIALIZE_ALM

12、OST_DONE ?*没有初始化的话执行下面程序*/*设置系统状态变量来表示现正在处理过程中注意该变量在后边的中断嵌套中会使用?*/?_tx_thread_system_state = TX_INITIALIZE_IN_PROGRESS?7*进行一些基本硬件设置,启动程序等 */?_tx_initialize_low_level (); ? ?7*进行一些高级的初始化*/ ?_tx_initialize_high_level (); ?/*设置系统状态变量来表示现正在处理过程中注意该变量在后边的中断嵌套中会使用*/?_tx_thread_system_state = TX_INITIALIZE

13、_IN_PROGRESS?/*调用初始化中提供的应用程序把第一个未使用的变量地址传送给它*/?tx_application_define (_tx_initialize_unused_memory );?/*设置系统壮伟进入线程调度做准备*/?_tx_thread_system_state = TX_INITIALIZE_IS_FINISHED;?/*进入线程循环开始执行线程*/?_tx_thread_schedule ();_tx_initialize_low_level ()void tx_kernel_enter (void )所属文件??矶用者??开关量tx_till. s?启动代码?

14、?无该函数实现对FIQ、IRQ和SVC奠式下的sp寄存器的初始化,并对定时堆栈的基地 址、大小和定时优先级变量进行初始化。/*进行一些基本硬件设置,启动程序等*/*该函数在文件tx_ill.s 文件中*/?_tx_initialize_low_level ();/* VOID _tx_initialize_low_level(VOID);?EXPORT _tx_initialize_low_level_tx_initialize_low_level;/*保存系统堆栈指针.*/;/* _tx_thread_system_stack_ptr = (VOID_PTR) A7 (SP); */;?/*

15、设置各个模式下的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 设置 FIQ_MODE?MSR CPSR_ca1 ;进入 FIQ 模式?ADD a2 a2, a3 ;计算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 ;进入 IRQ模式?ADD a2 a2, a3 ;计算 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 ;进入 SVC模式?LDR a4 pc, #SYS_STACK_PTR8;获得 stack 指针?STR a2 a4, #0;保存系统堆栈;;/* Save the system stack pointer. */;_tx_thread_system_stack_ptr = (VOID_PTR (sp); ;?LDR a2 pc, #SYS_STACK_PTR8;获得系统堆栈指针的地址?LDR al a2, #0;获得

18、系统堆栈指针?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;获得实际定时堆栈大小?STR al a2, #0;将定时堆栈的基地址放在堆栈指针地址所对应的内存中?STR a3 a4, #0;存储定时器堆栈大小?ADD a1 a1 , a3 ;新的空内存地址?LDR a2 pc, #TIMER_PRIORITY 8;获得定时器优先级地址?MOV a3 #0 ;获得定时器线程优先级?STR a3 a2, #0;存储定时器线程优先级;/*保存第一个变量内存地址.*/;_tx_initialize_unused_memory = (VOID_P

20、TR System Stack + Timer Stack; ;?LDR a3 pc, #UNUSED_MEMORY;获得没有使用的内存指针地址?STR al a3, #0;保存第一个空内存地址;/*建立周期性白定时中断.*/?STMDB LF ?/让 lr 入栈,保护 lr?BL?TargetInit? /TargetInit ()为 C语言编写的中断定 时函数?LDMIAlr ?/让 lr 出栈?在这里加上ARMS时器已实现周期性的中断;/* Done, return to caller. */ ;?MOV pc lr ; Return to caller;_tx_irq_handler所

21、属文件??矶用者??开关量tx_till . s? IRQ 中断?沈该函数是在定时中断后调用,该函数调用了 _tx_thread_context_save 函数(包含 在tx_tcs .s中),该函数又调用到 _tx_irq_processing_return函数处(包含在tx_till . s)?EXPORT_tx_irq_handler?EXPORT tx irq processing return _tx_irq_handler?; J?; /*调用函数保存线程上下文环境.*/?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?;清除中断标志位很重要(自己移植时加的,位置 是否恰当?)?BL _tx_timer_interrupt ;定时中断处理函数 ?; J?; /*系统线程上下文环境恢复函数*/?B _tx_thread_context_restore_tx_timer_interrupt所属文件??矶用者??开关量tx_timin . s?启动代码??无该函数主要是中断后将系统时钟加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;获得系统时钟地址?LDR al a2, #0;获得系统时钟?ADD al al , #1 ;将系统时钟加1?STR al a2, #0;存储新的系统时钟时间;;/* Test for time-slice expiration. */;if (_tx_timer_time_slice );?LDR a4 pc, #TIME_SLICE.- 8;获得链表中的定时切片数地址?LDR a3 a4, #0;获得定时切片数的值?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,;当没有定时切片时,将定时切片数标志位置1,表示链表中没有切片了;/* Set the time-slice exp

29、ired flag. */;_tx_timer_expired_time_slice = TX_TRUEJ?LDR a4 pc, #EXPIRED_TIME_SLICE 8;获得定时切片数是否为 0标志地址?MOV a,1 #1 ;将标志设为 1?STR al a4, #0;设立到时标志Jtx timer no time sliceJ;/* Test for timer expiration. */;if (* _tx_timer_current_ptr );J的地LDR a2 pc, #TIMER_CURRENT_PT网;获得的是_tx_timer_current_ptr址?而 TIMER_

30、DECLARE TX_INTERNAL_TIMER* _tx_timer_current_ptr ?LDR a1, a2, #0;获得当前的 _tx_timer_current_ptrLDR a3 a1, #0;获得定时列表的入口定时切片指针CMP a3 #0 ;链表中是否有定时切片存在?BEQ _tx_timer_no_timer;不存在,调用_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)所属文件??矶用者??开关量tx_ihl . c?启动代

44、码???沈主要时对一些与硬件无关的变量进行初始化,其中主要实现了线程的初始化;定时 的初始化,这里定时也是一个线程,且优先级为最高0;还有对信号量、队列、时间标志、块池、和字节池的初始化。/*进行一些高级的初始化*/?_tx_initialize_high_level ();?VOID_tx_initialize_high_level (VOID?/* Initialize the event log, if enabled. */?TX_EL_INITIALIZE?/*调用线程初始化函数.*/?_tx_thread_initialize ();?/*调用定时初始化函数*/?_tx_timer

45、_initialize ();?/*调用信号量初始化函数*/?_tx_semaphore_initialize ();?/*调用队列初始化函数*/?_tx_queue_initialize ();?/*调用事件标志初始化函数.*/?_tx_event_flags_initialize ();?/*调用block pool初始化函数.*/?_tx_block_pool_initialize ();?/*调用byte pool初始化函数.*/?_tx_byte_pool_initialize ();/*调用线程初始化函数.*/_tx_thread_initialize ();VOID_tx_thr

46、ead_initialize (VOID)所属文件??矶用者??开关量tx_ti .c?启动代码??无此函数主要实现对与线程有关的一些变量进行初始化。?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. */?/*初始化当前线程指针为空*/?_tx_thread_current_ptr = TX_NULL?/*初始化要执行线程指针为空.*/?_tx_thread_exec

48、ute_ptr = TX_NULL?/*初始化优先级信息*/?_tx_thread_priority_map = 0;?_tx_thread_preempted_map = 0 ;?_tx_thread_highest_priohty = TX_MAX_PRIORITIE;S/*初始化the lowest-set bit表.这被用来当线程被挂起和从新启动时寻找下一 个准备执行的线程*/?_tx_thread_lowest_bit 0 = 0 ;?lowest_set_ptr = &_tx_thread_lowest_bit 1;?or (i = 1 ; i < TX_THREAD

49、_MAX_BYTE_VALUBS)?*将当前序号给临时变量*/? temp = i ;? /*寻找字节中的最低比特位设置,即在一个字节中的最高优先级*/ r?set_bit = 0;?While (!( temp & 1)?*把序号往右移动一位.并且增加set-bit 的位置.*/?temp = temp >> 1 ;?set_bit +;?/*预先求出对应的线程优先级 byte值所对应的优先级最高的的bit位*/*( lowest_set_ptr +) = set_bit ;/*例如priorityb_byte 的值为5即0x101那么所对应的优先级最高为 0,则?low

50、est_set_ptrpriorityb_byte=0*/*当优先级字节的值为i时,我们很快可以知道该字节的高优先级为第_tx_thread_lowest_bitibit 位。*/?/*初始化优先级头指针队列.即将线程块对应的空间都初始化为空*/?priority_list_ptr = &_tx_thread_priority_list 0;?or (i = 0 ; i < TX_MAX_PRIORITIE;Si +)?*( priority_list_ptr+) = TX_NULL?/* I初始化以创建线程列表的头指针和以创建线程的个数*/?_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所属文件??矶用者??开关量tx_timi . c?启动代码??无主要实现有定时器有关的一些变量的初始化,并建立了一个线程专门由于定时管 理。/*调用定时初始化函数*/?_tx_timer_initialize ();?VOID_tx_timer_initialize (VOID)REG_1 UINT i; /* Working index variable */REG_2 TX_INTERNAL_TIMERtimer_ptr ; /* Working timer pointer */?/*初始化系统时钟为0.*/?_tx_timer_system_clock = 0;?/*初始化时间切片的值为0以确保它是无效的? ? */?_tx_timer_time_slice

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论