threadx系統(tǒng)介紹
ThreadX是優(yōu)秀的硬實時操作系統(tǒng)(RTOS),適用于深嵌入式應(yīng)用中,具有規(guī)模小、實時性強、可靠性高、無產(chǎn)品版權(quán)費、易于使用等特點,并且支持大量的處理器和SoC,包括ARM、PowerPC、SH 4、MIPS、ADI DSP、TI DPS、Nios II等,因此廣泛應(yīng)用于消費電子、汽車電子、工業(yè)自動化、網(wǎng)絡(luò)解決方案、軍事與航空航天等領(lǐng)域中。 ThreadX RTOS和中間件支持Tensilica最新產(chǎn)品Diamond Standard 106Micro 32位微控制器IP核。
ThreadX RTOS支持全線Tensilica Xtensa可配置處理器IP核以及Diamond標準系列處理器IP核產(chǎn)品。新添加106Micro延續(xù)ThreadX 對全部Tensilica處理器系列支持。 ThreadX是Express Logic針對高要求實時應(yīng)用小面積速度快免版稅的RTOS。免版稅的業(yè)務(wù)模式令ThreadX對于高容量器件來說極具吸引力。ThreadX的簡單易用也使帶ThreadX的器件既能按時面市又不超預(yù)算,這些都是ThreadX在市場上成功并被大量使用的原因所在。
ThreadX已被廣泛的用戶接納,并且目前在超過4億5千萬電子產(chǎn)品中得到廣泛應(yīng)用。ThreadX配有Express LogicTCP/IP協(xié)議棧NetX、文件系統(tǒng)FileX、USB協(xié)議棧USBX以及GUI開發(fā)包PEGX,所有這些都支持Tensilica最新的Diamond Standard 106Micro產(chǎn)品。 低功耗Diamond Standard 106Micro是針對SoC(片上系統(tǒng))設(shè)計中簡單控制器應(yīng)用而設(shè)計,為那些將產(chǎn)品從8位/16位控制器移植到32位處理器上的設(shè)計工程師理想選擇。所有鉆石標準系列處理器都擁有優(yōu)化鉆石系列軟件工具支持和廣泛產(chǎn)業(yè)基礎(chǔ)架構(gòu)合作伙伴,這些合作伙伴將提供操作系統(tǒng)、設(shè)計服務(wù)、硬件原型和模擬仿真、庫和存儲器、EDA工具和外設(shè)等支持。
Tensilica為其鉆石標準系列處理器IP核提供了一個已經(jīng)通過驗證的基礎(chǔ)架構(gòu),該架構(gòu)包括由Tensilica直接提供軟件開發(fā)工具,以及由Bytetools公司、FS2公司、Macraigor Systems公司和Sophia Systems公司提供的JTAG探針支持、由ARM(Artisan)公司和Virage Logic公司提供的存儲器和庫、由Cadence公司、CoWare公司、Magma公司和Synopsys公司提供的流行的EDA工具支持和CoWare公司的CoWare Platform Architect上Diamond 106Micro模型。
threadx系統(tǒng)源碼分享
用來處理初始化過程中的匯編語言,它是面向處理器和開發(fā)工具的。
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、設(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)存地址的初始值_tx_initialize_unused_memory; }
Tx_tcs.s負責(zé)在中斷發(fā)生時對上次的運行現(xiàn)場進行保存,它保存中斷上下文,為了不覆蓋R14_irq離得中斷返回地址,TCS的返回是通過跳到__tx_irq_processing_return地址做到的。Tx_TCR.S負責(zé)中斷處理程序執(zhí)行完后的處理。
Void _tx_thread_context_save{
1、把表示中斷嵌套個數(shù)的變量_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模式下對應(yīng)的是不同的物理寄存器,所以若要得到中斷前的線程堆棧指針,需要先返回到該線程的運行模式,同時禁止中斷,取值后再返回到終端模式。R14_irq保存的是終端發(fā)生時PC值+8,R14_svc保存得失中斷前線程自己的返回地址。所以在中段上下文中,(R14_irq-4)應(yīng)該存在中斷地址,而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,跳到線程調(diào)度程序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,設(shè)置堆棧指針為系統(tǒng)指針SP=SP_svc,CPSR|=TX_INT_ENABLE;
5、B _tx_thread_schedule;}
Tx_tsr.s用于從線程退回到系統(tǒng)態(tài),負責(zé)保存線程的最小語境并退回到Threadx的調(diào)度循環(huán)狀態(tài)。它保存的上下文是請求上下文。
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、 設(shè)置堆棧指針為系統(tǒng)指針SP=SP_svc,_tx_thread_current_ptr=0,CPSR|=TX_INT_ENABLE;
4、 B _tx_thread_schedule;}
由于用戶模式不能直接更改CPSR來關(guān)斷的,所以要通過SWI指令進入特權(quán)模式,而且特權(quán)模式和用戶模式的SP對應(yīng)不同的物理寄存器,所以要在轉(zhuǎn)入系統(tǒng)模式取得用戶模式下SP,最后再回到特權(quán)模式。 TX_TS.S負責(zé)調(diào)度和恢復(fù)就緒的優(yōu)先級最高的線程的最后語境。
Void _tx_thread_schedule{
1、 while(_tx_thread_execute_ptr=0);
2、 CPSR|=TX_INT_DISABLE,_tx_threadx_current_ptr=_tx返回值;}
移植該函數(shù)時,針對不同的處理器,應(yīng)蓋根據(jù)準熱愛寄存器CPSR的中斷禁止未來設(shè)置開關(guān)中斷向量,主要修改TX_PORT.H中的TX_INT_ENABLE和TX_INT_DISABLE.R0用來傳遞的參數(shù)和結(jié)果。
Tx_tsb.s負責(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,PUSH初始值;
4、 要存入堆棧的CPSR值設(shè)置為用戶模式,開中斷,標志位清零,R1=USER_MODE,PUSH R1;
5、 Thread_ptr-》sp=new SP; }
當處理一個低級的中斷時,tx_tpc.s決定是否發(fā)生搶占,它是可選的,大多數(shù)端口都用不到。TX_TIMIN.S負責(zé)處理定時中斷。這兩個函數(shù)只要將它們翻譯成相應(yīng)ARM匯編語言就可以了。
評論
查看更多