ThreadX的移植(ARM7篇).pdf

所需积分/C币:48 2015-12-23 13:56:52 631KB PDF
43
收藏 收藏
举报

ThreadX 在 ARM7 上的移植。ThreadX 是由Express Logic公司开发和销售的实时操作系统(RTOS)。ThreadX是一个提供抢占式多任务调度、快速中断响应、内存管理、线程间通信、互斥、事件通知和线程同步功能的内核。
移植文件 ThreadX需要移植的函数主要有8个 //初始化处理器各模式下的SP指针,为 Timer线程与用户线程分配栈空间 tx initialize low level (tx ill. asm) //创建栈初始化数据 tx thread stack build (tx tsb. c) /控制处理器的中断禁止与使能 tx thread interrupt control(tx tic. asm) 线程切换时,保存现场 tx thread system return (tx tsr. asm) //中断时,保存现场 tx thread context save (tx tcs asm) //中断现场恢复 tx thread context restore (tx tcr. asm) //调度 tx thread schedule (tx ts asm) //操作系统心跳函数 tx timer interrup (t x tic) 他们之间的关系如图所示: Irq Interrupt ThreadX Kernel tx thread context save tx thread system return tx initialize low level QsEⅣVER (mchude tx timer interrupt tx thread interrupt control tx thread stack build tx thread context restore tx thread schedule 分类一下: tx initialize low level tx thread stack build 为系统提供初始化功能。 tx thread interrupt control 为系统提供中断控制功能。 tx thread system return tx thread context save tx thread context restore tx thread schedule tx timer interrupt 为系统提供线程切换功能 下面,我们来分类详述。 4 初始化 VOId tx initialize low level (VOID) Step:保存IR; Step2:设置SVC、IQ、ABT、UND、FIQ、SYS模式下的SP寄存器; Step3:为 Timer线程设置运行环境 tx timer stack start= Timer线程栈的起始地址 tx timer stack size= Timer线程栈的长度 Lx timer priority=0∥ Timer线程的优先级为最高 Step4:为用户线程设置运行环境 tx initialize unused memory=用户线程栈的起始地址 VOId tx thread stack build(TX THREAD*thread ptr, VOid(function ptr(VOID)) Stepl: thread ptr->tx stack end- thread ptr->tx stack end Step2:设置栈初始化数据,分布如图 3;///// HightAddr( StackBot七口m) 5 ////// thread ptr->tx stack end function ptr 6:!/f/ 0x1414141斗 R(1±)> 78g 0x12121212 B12 ;////1 x111111 R11≥ !!!!! 心xl010100 10 xD090909 R9> 11;/////// xD000 /// 12;///// <R了 13 x06D60606 14!!!!!!/1 0R05050505 且b !!!F 15F//!!!!!I x04040404 <R4> !!!!! 16: 0x03030303 L/////A 17:///!/1 0x02020202 <R2> 1日;////}/ x010100 <R1 19:f'!! 0H0000O0OO CRO> !!!! 20F//!!!!( Node sYs E Bit)R( Mode sYs2忌正t工国工t)|!!!!!! 21:///// thread ptr->tx stack ptr> Oxi !/ 22:///f//1 23;///f}/l owAddr (stacktop) !!!!!!!!!!!J!!J!!!!!!!!!!!!!!J!!!!!!!!!!!!!J!!J!!!!!!!!!! 25 Step3: thread ptr->tx stack ptr =thread ptr-> tx stack cnd-16*4 中断控制 UINT tx thread interrupt control(UINT new posture) Step1:保存CPSR原值 Step2: CPSR- new posture Sep3:返回CPSR原值 线程切换 线程切换是操作系统移植的核心工作。 线程切换涉及现场的保存、恢复。 Threadx的现场包括3种:中断嵌套语 境、中断上下文、请求上下文。 3种现场在栈中的分布如图 :////// Stack offset Contens ///.,,,,,,,,,,, ////0 <> 中断嵌套语境 ////4 F////8 th2> F///10 <R3 //12 ≮R(L14) l////! //..,∴,,∴I/// 6 Stack C「fet Contents Stack offset Contents 1 (indicates interrupt stack) 0 o(indicates solicited stack) CPSR 4 PSR r 12 r1 12 r5 16 16 r6 20 20 r3 24 r 24 [4 28 28 r5 32 10 32 rb 36 r11 36 40 r14 40 8 44 (previous top of stack) 44 r9 48 r10 52 r11 请求上下文 6 r12 r14(LR) 64 point of interrup 68 (previous top of stack) 中断上下文 保存或恢复哪种上下文? 首先看是否有中断嵌套?由变量 tx thread system state控制, x thread system state>0表示有中断嵌套 第二看是否有线程运行?由变量 tx thread current ptr控制, tx thread current ptr!-0表示有线程运行 最后看是否允许剥夺?由变量 x thread preempt disable控制 tx thread preempt disable==0表示允许剥夺 上述3种条件组合下有以下4种场景: 1.有中断嵌套 2.无中断嵌套,无线程运行 3.无中断嵌套,有线程运行,禁止剥夺 4.无中断嵌套,有线程运行,允许剥夺 上述4种场景对应到3种现场,其逻辑关系如图 进入中断 是否所嵌套?>N}<有线程执行? tx thread context saveD No 运行于特权模式 禁止中断 保存牛断嵌套语境 保存中断上下文 1.切换至非特杈模式 2.执行中断程序〈含tick 含心跳函数 tx timer Interrupt0 3.切换全siC模式,开中圆 否中断嵌套 有线程执行 允许剥夺? Yes No tx thread context restore( 运行于特权模 禁止中断 恢复中断嵌套话境 tx thread current ptr=0 执行上层中断 线程挂起 开断 禁止中断 current ptr 关中断 -execute_ ptr 存请求上下文 execute_ptr?>( No Ftx run count+ 线程堆栈类琅 (Yes)恢复中断上下文 tx thread schedule()水 tx timer time 运行于非权模式 time slice slice ptr->slice Yes tx time slice 恢复请求上下文 current ptr=0-tx thread system return () 运行于非特权模式 VOID tx thread systcm rcturn(VOID) Step1:禁止中断 Step2:保存请求上下文(0x0、xPSR、R4Rl1、 LR Sys); Step3 tx thread current ptr->start stack Step4: tx thread current ptr =0 Step5:跳转到_ tx thread schedule VOId tx thread context save(VOID) 保存R2、 LR irq、SPSR tx thread system state l t if( tx thread system state 1) ∥有中断嵌套 切换到系统模式; 保存中断嵌套语境(RO-R3、 LR sys) 执行中断服务程序; clsc if(tx thread current ptr) ∥无中断嵌套,有线程运行 释放 SP Irq; 切换到系统模式; 保存中断上下文(0x1、xPSR、RO-R12、 LR sys、 LR irq); Lx thread current plr->sLart stack=SP 执行中断服务程序 ∥无中断嵌套,无线程运行 释放 SP Irg: 切换到系统模式; 执行中断服务程序 VOid tx thread context restore (VOID) 禁止中断; tx thread system state-- if( Lx thread syslem state ! =0 ∥有中断嵌套 恢复中断嵌套语境(R0-R3、 LR sys) 切换到中断模式; 恢复中断嵌套语境(R12im、 SPSR irq、PC^) clsc if tx thread current ptr) ∥无中断嵌套,有线程运行 if( tx thread preempt disable) ∥无中断嵌套,有线程运行,禁止剥夺 切换到SVC模式,禁止中断

...展开详情
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
上传资源赚积分or赚钱
    最新推荐