threadx系统介绍
ThreadX是优秀的硬实时操作系统(RTOS),适用于深嵌入式应用中,具有规模小、实时性强、可靠性高、无产品版权费、易于使用等特点,并且支持大量的处理器和SoC,包括ARM、PowerPC、SH 4、MIPS、ADI DSP、TI DPS、Nios II等,因此广泛应用于消费电子、汽车电子、工业自动化、网络解决方案、军事与航空航天等领域中。 ThreadX RTOS和中间件支持Tensilica最新产品Diamond Standard 106Micro 32位微控制器IP核。
ThreadX RTOS支持全线Tensilica Xtensa可配置处理器IP核以及Diamond标准系列处理器IP核产品。新添加106Micro延续ThreadX 对全部Tensilica处理器系列支持。 ThreadX是Express Logic针对高要求实时应用小面积速度快免版税的RTOS。免版税的业务模式令ThreadX对于高容量器件来说极具吸引力。ThreadX的简单易用也使带ThreadX的器件既能按时面市又不超预算,这些都是ThreadX在市场上成功并被大量使用的原因所在。
ThreadX已被广泛的用户接纳,并且目前在超过4亿5千万电子产品中得到广泛应用。ThreadX配有Express LogicTCP/IP协议栈NetX、文件系统FileX、USB协议栈USBX以及GUI开发包PEGX,所有这些都支持Tensilica最新的Diamond Standard 106Micro产品。 低功耗Diamond Standard 106Micro是针对SoC(片上系统)设计中简单控制器应用而设计,为那些将产品从8位/16位控制器移植到32位处理器上的设计工程师理想选择。所有钻石标准系列处理器都拥有优化钻石系列软件工具支持和广泛产业基础架构合作伙伴,这些合作伙伴将提供操作系统、设计服务、硬件原型和模拟仿真、库和存储器、EDA工具和外设等支持。
Tensilica为其钻石标准系列处理器IP核提供了一个已经通过验证的基础架构,该架构包括由Tensilica直接提供软件开发工具,以及由Bytetools公司、FS2公司、Macraigor Systems公司和Sophia Systems公司提供的JTAG探针支持、由ARM(Artisan)公司和Virage Logic公司提供的存储器和库、由Cadence公司、CoWare公司、Magma公司和Synopsys公司提供的流行的EDA工具支持和CoWare公司的CoWare Platform Architect上Diamond 106Micro模型。
threadx系统源码分享
用来处理初始化过程中的汇编语言,它是面向处理器和开发工具的。
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,PUSH 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=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、 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返回值;}
移植该函数时,针对不同的处理器,应盖根据准热爱寄存器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)){
1、 保证堆栈起始地址八字节对齐;
2、 中断地址存入线程调用的入口地址PUSH function_ptr;
3、 R0-R12,R14的初始值都设置为0,PUSH初始值;
4、 要存入堆栈的CPSR值设置为用户模式,开中断,标志位清零,R1=USER_MODE,PUSH R1;
5、 Thread_ptr-》sp=new SP; }
当处理一个低级的中断时,tx_tpc.s决定是否发生抢占,它是可选的,大多数端口都用不到。TX_TIMIN.S负责处理定时中断。这两个函数只要将它们翻译成相应ARM汇编语言就可以了。
评论
查看更多