threadx学习笔记

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

t h r e a d x学习笔记(总23页) -CAL-FENGHAI.-(YICAI)-Company One1

-CAL-本页仅作为文档封面,使用请直接删除

threadx学习笔记(一)

tx_ill.s文件用来处理初始化过程中的汇编语言,它是面向处理器和开发工具的。

Void_tx_initialize_low_level{

1、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、设置初始化后未使用内存地址的初始值_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_state>1,PUSH R0-R3,CPSR,R14 in IRQ stack,B

__tx_irq_processing_return;

3、else if _tx_thread_current_ptr=0判断是否有线程正在运行,if not ,B _tx_irq_processing_return;

4、else,PU SH Context_irq in thread’s stack,SP_thread=new SP,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_state>0,POP R0-R3,CPSR,R14 from IRQ stack,BX R14;

2、else if _tx_thread_current_ptr=0?if =0

CPSR|=VC_MODE,CPSR|=TX_INT_ENABLE,跳到线程调度程序B _tx_thread_schedule;

3、if!=0,则判断线程抢占是否禁止 if

_tx_thread_preempt_disable=0?if!=0,POP Context_irq from thread’s stack,BX R14;

4、if=0,_tx_timer_time_slice=new

value,_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、PUSH Context_request:in thread’s stack,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_p

tr;

3、_tx_thread_current_ptr-

>TX_run_count++,_tx_timer_time_slice=_tx_thread_current_ptr-

>tx_time_slice;

4、If线程堆栈的中断类型=1,restore Context_irq,else restore

Context_request;

}

Tx_tic.s用于开中断和关中断。

Unint _tx_thread_interrupt_control(unint new _posture){

1、R1=CPSR;

2、SWI;

3、CPSR|=RO=new posture;

4、R0=R1,R0为返回值;

相关文档
最新文档