您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > threadx学习重点笔记专业资料
threadx学习笔记(一)tx_ill.s文献用来解决初始化过程中汇编语言,它是面向解决器和开发工具。Void_tx_initialize_low_level{1、CPSCR|=FIQ_MODE,SETSP_fiq;2、CPSCR|=IRQ_MODE,SETSP_irp;3、CPSCR|=SVC_MODE,SETSP_svc;4、设立中断向量表IRQ_TABLE;5、设立内部TIMER线程堆栈起始地址,堆栈大小和优先级::tx_timer_stack_start,_tx_timer_stack_size,_tx_timer_priorit;6、设立初始化后未使用内存地址初始值_tx_initialize_unused_memory;}Tx_tcs.s负责在中断发生时对上次运营现场进行保存,它保存中断上下文,为了不覆盖R14_irq离得中断返回地址,TCS返回是通过跳到tx_irq_processing_return地址做到。Tx_TCR.S负责中断解决程序执行完后解决。Void_tx_thread_context_save{1、把表达中断嵌套个数变量_tx_thread_system_state++;2、if_tx_thread_system_state1,PUSHR0-R3,CPSR,R14inIRQstack,Btx_irq_processing_return;3、elseif_tx_thread_current_ptr=0判断与否有线程正在运营,ifnot,B_tx_irq_processing_return;4、else,PUSHContext_irqinthread’sstack,SP_thread=newSP,B_tx_irq_processing_return;}由于R13和R14在不同CPU模式下相应是不同物理寄存器,因此若要得到中断前线程堆栈指针,需要先返回到该线程运营模式,同步禁止中断,取值后再返回到终端模式。R14_irq保存是终端发生时PC值+8,R14_svc保存得失中断前线程自己返回地址。因此在中段上下文中,(R14_irq-4)应当存在中断地址,而R14_svc存在R14位置。Void_tx_thread_context_restore{1、_tx_thread_system_state--,if_tx_thread_system_state0,POPR0-R3,CPSR,R14fromIRQstack,BXR14;2、elseif_tx_thread_current_ptr=0?if=0CPSR|=VC_MODE,CPSR|=TX_INT_ENABLE,跳到线程调度程序B_tx_thread_schedule;3、if!=0,则判断线程抢占与否禁止if_tx_thread_preempt_disable=0?if!=0,POPContext_irqfromthread’sstack,BXR14;4、if=0,_tx_timer_time_slice=newvalue,_tx_thread_current_ptr=0,CPSR|=SVC_MODE,设立堆栈指针为系统指针SP=SP_svc,CPSR|=TX_INT_ENABLE;5、B_tx_thread_schedule;}Tx_tsr.s用于从线程退回到系统态,负责保存线程最小语境并退回到Threadx调度循环状态。它保存上下文是祈求上下文。Void_tx_thread_system_return{1、PUSHContext_request:inthread’sstack,CPSR|=TX_INT_DISABLE;2、_tx_thread_current_ptr-SP=SP,CPSR|=SVC_MODE;3、设立堆栈指针为系统指针SP=SP_svc,_tx_thread_current_ptr=0,CPSR|=TX_INT_ENABLE;4、B_tx_thread_schedule;}由于顾客模式不能直接更改CPSR来关断,因此要通过SWI指令进入特权模式,并且特权模式和顾客模式SP相应不同物理寄存器,因此要在转入系统模式获得顾客模式下SP,最后再回到特权模式。TX_TS.S负责调度和恢复就绪优先级最高线程最后语境。Void_tx_thread_schedule{1、while(_tx_thread_execute_ptr=0);2、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_ptr-tx_time_slice;4、If线程堆栈中断类型=1,restoreContext_irq,elserestoreContext_request;}Tx_tic.s用于开中断和关中断。Unint_tx_thread_interrupt_control(unintnew_posture){1、R1=CPSR;2、SWI;3、CPSR|=RO=newposture;4、R0=R1,R0为返回值;}移植该函数时,针对不同解决器,应盖依照准热爱寄存器CPSR中断禁止将来设立开关中断向量,重要修改TX_PORT.H中TX_INT_ENABLE和TX_INT_DISABLE.R0用来传递参数和成果。Tx_tsb.s负责创立每个线程初始堆栈构造,这个初始构造在线程创立时会引起中断上下文返回到_tx_thread_shell_entry函数开头。然后这个函数调用指定线程入口函数。其中断类型设立为1,表达中断上下文。Void_tx_thread_stack_build(TXTHREAD*thread_ptr,void(*function)(void)){tx_kernel_enter();进入threadx核tx_kernel_enter()voidtx_kernel_enter(void)所属文献调用者开关量demo.C启动代码无操作系统一方面从从量表直接进入该函数,在函数此前没有进行任何硬件及软件初始化!该函数重要包括_tx_initialize_low_level(),_tx_initialize_high_level(),tx_application_define(_tx_initialize_unused_memory),1、保证堆栈起始地址八字节对齐;2、中断地址存入线程调用入口地址PUSHfunction_ptr;3、R0-R12,R14初始值都设立为0,PUSH初始值;4、要存入堆栈CPSR值设立为顾客模式,开中断,标志位清零,R1=USER_MODE,PUSHR1;5、Thread_ptr-sp=newSP;}当解决一种低档中断时,tx_tpc.s决定与否发生抢占,它是可选,大多数端口都用不到。TX_TIMIN.S负责解决定期中断。这两个函数只要将它们翻译成相应ARM汇编语言就可以了。threadx学习笔记(二)1_tx_thread_schedule()。VOID_tx_initialize_kernel_enter(VOID){/*拟定编译器与否已经初始化过*/if(_tx_thread_system_state!=TX_INITIALIZE_ALMOST_DONE){/*没有初始化话执行下面程序*//*设立系统状态变量来表达现正在解决过程中注意该变量在后边中断嵌套中会使用*/_tx_thread_system_state=TX_INITIALIZE_IN_PROGRESS;/*进行某些基本硬件设立,启动程序等*/_tx_initialize_low_level();/*进行某些高档初始化*/_tx_initialize_high_level();}/*设立系统状态变量来表达现正在解决过程中注意该变量在后边中断嵌套中会使用*/_tx_thread_system_state=TX_INITIALIZE_IN_PROGRESS;/*调用初始化中提供应用程序把第一种未使用变量地址传送给它*/tx_application_define(_tx_initialize_unused_memory);/*设立系统壮伟进入线程调度做准备*/_tx_thread_system_state=TX_INITIALIZE_IS_FINISHED;/*进入线程循环开始执行线程*/_tx_thread_schedule();}_tx_initialize_low_level()voidtx_kernel_enter(void)所属文献调用者开关量tx_till.s启动代码无该函数实现对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);*/;/*设立各个模式下sp(堆栈指针)*/;/*WemustbeinSVCmodeatthispoint!*/;LDRa2,=|Image$$ZI$$Limit|;Getendofnon-initializedRAMareaLDRa3,[pc,#FIQ_STACK_SIZE-.-8];获得FIO堆栈地址(这里没有弄明白,有待?)MOVa1,#FIQ_MODE;设立FIQ_MODEMSRCPSR_c,a1;进入FIQ模式ADDa2,a2,a3;计算FIQ堆栈开始BICa2,a2,#3;将a2低两位清零保证堆栈开始为long对齐SUBa2,a2,#4;往回退一种字MOVsp,a2;建立FIQ堆栈指针(即FIQ模式sp)MOVsl,#0;Clearsl(R10)MOVfp,#0;Clearfp(R11)LDRa3,[pc,#SYS_STACK_SIZE-.-8];获得IRQ(systemstacksize)MOVa1,#IRQ_MODE;建立IRQ模式CPSRMSRCPSR_c,a1;进入IRQ模式ADDa2,a2,a3;计算IRQstack开始BICa2,a2,#3;将a2低两位清零保证堆栈开始为long对齐SUBa2,a2,#4;往回退一种字MOVsp,a2;建立IRQ堆栈指针MOVa1,#SVC_MODE;建立SVC模式CPSRMSRCPSR_c,a1;进入SVC模式LDRa4,[pc,#SYS_STACK_PTR-.-8];获得stack指针STRa2,[a4,#0];保存系统堆栈;;/*Savethesystemstackpointer.*/;_tx_thread_system_stack_ptr=(VOID_PTR)(sp);;LDRa2,[pc,#SYS_STACK_PTR-.-8];获得系统堆栈指针地址LDRa1,[a2,#0];获得系统堆栈指针ADDa1,a1,#4;增长一种long长度;;/*Pickupthefirstavailablememoryaddress.*/;;/*Allocatespaceforthetimerthread'sstack.*/;_tx_timer_stack_start=first_available_memory;;_tx_timer_stack_size=stack_size;;_tx_timer_priority=0;;LDRa2,[pc,#TIMER_STACK-.-8];获得定期堆栈指针地址LDRa4,[pc,#TIMER_STACK_
本文标题:threadx学习重点笔记专业资料
链接地址:https://www.777doc.com/doc-8762105 .html