嵌入式系统RTEOSμCOSII的移植
ucosII多核移植和扩展的原理以及注意事项

uC/OS-II是源码开放、可固化、可移植、可裁剪、可剥夺的实时多任务OS 内核,适用于任务多、对实时性要求较高的场合。
uC/OS-II适合小型系统,具有执行效率高、占用空间小、实时性优良和可扩展性等特点,最小内核可编译至2K。
uC/OS-II内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能。
所谓RTOS移植,就是使一个实时内核能在某个微处理器或微控制器上运行。
大部分的uC/OS-II代码试用C写的,但仍需要用C和ASM写一些与处理器相关的代码,这是因为uC/OS-II在读写处理器寄存器时只能通过ASM实现。
要是uC/OS-II正常运行,处理器必须满足一定的条件:处理器的C编译器能产生可重入代码;用C语言就可以打开和关闭中断;处理器支持中断,并能产生定时中断;处理器支持能够容纳一定量数据的硬件堆栈;处理器有将SP和其他CPU reg读出和存储到堆栈或内存中的指令;uC/OS-II移植工作主要包括以下三个方面的内容:(1)修改与处理器核编译器相关的代码:主要在includes.h中,修改数据类型定义说明,OS_ENTER_CRITICAL()、OS_EXIT_CRITICAL()和堆栈增长方向定义OS_STK_GROWTH。
(2)用C语言编写10个移植相关的函数:主要在OS_CPU_C.C中,包括堆栈初始化OSTaskStkInit()和各种回调函数。
(3)编写4个汇编语言函数:主要在OS_CPU_A.ASM中,包括:_OSTickISR //时钟中断处理函数_OSIntCtxSW //从ISR中调用的任务切换函数_OSCtxSW //从任务中调用的任务切换函数_OSStartHighRdy //启动最高优先级的任务uC/OS-II移植的关键问题:(1)临界区访问:uC/OS-II需要先禁止中断再访问代码临界段,并且在访问完毕后重新允许中断,这就使得uC/OS-II能够保护临界段代码免受多任务或ISR的破坏。
嵌入式操作系统μC/OS-Ⅱ的运行机制与移植

( ) c语言可以打开和关闭中断。 2用
收到本 文时间 : 0 2 6年 2月 1 0 4日
维普资讯
结构和严谨的代码风格 , 非常适合嵌入式操作系统
的初学者。它可 以让我们 以最快 的速度来 了解操
作系统的概念、 结构 和模块工作原理 , 并可 由浅人
们以各 自不同的特色分布于通信 、 航空航天、 汽车、 医疗、 电子消费等不同领域 ; 它们性能卓越 、 功能完
备、 技术成熟 、 服务周全。通过使用这样的操作系 统。 可以缩短产品的开发周期 , 降低开发成本 , 同时
S iS iu n Ch n Yu qa h h g a g e n i
( eat n f l t nc n o m n ao n i eig u a e nvrt, unzo 50 7 ) D pr t e r i adC m u i tnE g er ,SnY t nU ie i G agh u 25 me o E c o s ci n n s s移植  ̄ / S需要 的条件 CO
I / S I是专 门为中低端嵌入式应用设计  ̄ 0 —I C
的可剥夺型实时操作系统内核, 主体用标准的 A . N s c语言写成 , I 可移植性好。 目 已被成功地移植 前 到 MC 、 S 、P U D P C U上 , 包括 8位 、 l 6位、2位及 6 3 4 位。要成功移植  ̄ / S I, C O — I处理器必须满足以下 要求 : () 1处理器的 c编译器能产生可重人代码。
深逐步推广到商用操作系统上。 自 19 92年以来 ,
v / S I 已经被应用到数 以百计 的产品中。对  ̄ O —I C 于那些对操作系统感兴趣的爱好者来说 ,C O — I/ S  ̄ I也是一个很好 的研究样本。 I
ucos_II移植总结

Ucos_II移植总结:之前已经基本算是成功的移植过ucos-II(内存管理部分没有处理),但是由于可恶的硬盘故障,让我的劳动成果付诸东流。
其间的一些移植经验没有及时总结,现在想来颇有点从头再来的悲壮!鉴于之前的教训,这次,边移植边总结,以防重蹈覆辙。
还好之前的移植过程已经解决了部分棘手的难题,现在复现一下权当是复习一下arm和ucos_II了。
这次的移植还是基于SEP4020芯片,其中的一些引导代码和中断处理代码还是照搬已经写好的代码吧,现在已经没有自己动手写的激情了!下面按照自己的移植步骤一步步总结吧:第一步:创建工程,将基本的启动代码照搬过来,建立一个最小系统,能够在开发板上运行成功。
第二步:将ucos-II源代码copy过来。
第三步:对基本的语法错误进行改正。
对工程进行编译,根据提示进行基本语法的改正。
主要包括:INCLUDES.h中头文件的调用第四步:对需要自己手动编写的函数首先要清空,防止编译报错,然后一步步手动编写代码。
1、临界段代码:os_cpu.h中OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()两个宏重新定义为我们自己写的开关中断函数。
Os_cpu_a.s文件添加如下代码:AREA MCUINIT , CODE, READONLYENTRY;/* 开启IRQ中断*/;voidEnableInterrupt(void);{EXPORT EnableInterruptEnableInterruptmrs r0,CPSRbic r0, r0, #0x80 ;set bit7 to 0msr CPSR_cxsf,r0movpc,lr ;Return to caller;};/* 关闭IRQ中断*/;voidDisableInterrupt(void);{EXPORT DisableInterruptDisableInterruptmrs r0,CPSRorr r0, r0, #0x80 ;set bit7 to 1msr CPSR_cxsf,r0movpc,lr ;Return to caller;}END2、OS_CPU_A.S文件代码编写AREA MCUINIT , CODE, READONLYENTRY;/* 开启IRQ中断*/;voidEnableInterrupt(void);{EXPORT EnableInterruptEnableInterruptmrs r0,CPSRbic r0, r0, #0x80 ;set bit7 to 0msr CPSR_cxsf,r0movpc,lr ;Return to caller;};/* 关闭IRQ中断*/;voidDisableInterrupt(void);{EXPORT DisableInterruptDisableInterruptmrs r0,CPSRorr r0, r0, #0x80 ;set bit7 to 1msr CPSR_cxsf,r0movpc,lr ;Return to caller;};任务切换代码OSCTXSWEXPORT OS_TASK_SW_ARMOS_TASK_SW_ARMSTMFD sp!, {lr} ; save pcSTMFD sp!, {lr} ; save lrMRS r14, SPSRSTMFD sp!, {r14} ; save current PSRSTMFD sp!, {r0-r12} ; save register file and ret address ;; OSPrioCur = OSPrioHighRdyIMPORT OSPrioCurIMPORT OSPrioHighRdyLDR r4, =OSPrioCurLDR r5, =OSPrioHighRdyLDRB r6, [r5]STRB r6, [r4]; Get current task TCB addressIMPORT OSTCBCurLDR r4, =OSTCBCurLDR r5, [r4]STR sp, [r5] ; store sp in preempted taskss TCB; Get highest priority task TCB addressIMPORT OSTCBHighRdyLDR r6, =OSTCBHighRdyLDR r6, [r6]LDR sp, [r6] ; get new tasks stack pointer; OSTCBCur = OSTCBHighRdySTR r6, [r4] ; set new current task TCB address;LDMFD sp!, {r0-r12} ; YYY+LDMFD sp!, {r14} ; YYY+; LDR r14, =0x000000D3MSR CPSR_cxsf, r14 ; YYY+;调试时屏掉此句才会跑的通,待解决LDMFD sp!, {lr,pc} ; YYY+;OS启动时开始运行创建的最高优先级任务; void OSStartHighRdy(void); ; Start the task with the highest priority;;EXPORT OSStartHighRdyOSStartHighRdyIMPORT OSTCBCurIMPORT OSTCBHighRdyIMPORT OSRunningLDR r4, =OSTCBCur ; Get current task TCB addressLDR r5, =OSTCBHighRdy ; Get highest priority task TCB addressLDR r5, [r5] ; get stack pointerLDR sp, [r5] ; switch to the new stackSTR r5, [r4] ; set new current task TCB address;OSRunning = 1 'TURE'LDR r4, =0x01 ; Get current task TCB addressLDR r5, =OSRunning ; Get highest priority task TCB addressSTRB r4, [r5];LDMFD sp!, {r0-r12} ; start the new taskLDMFD sp!, {r14} ; get new state from top of the stackMSR CPSR_cxsf, r14 ; CPSR should be SVC32ModeLDMFD sp!, {lr,pc};中断级任务切换EXPORT OSIntCtxSwOSIntCtxSwIMPORT OSTCBCurIMPORT OSPrioCurIMPORT OSTCBHighRdyIMPORT OSPrioHighRdyIMPORT OSTaskSwHookBL OSTaskSwHook;OSTCBCur = OSTCBHighRdyLDR r4, =OSTCBCurLDR r5, =OSTCBHighRdyLDR r6, [r5]STR r6, [r4];OSPrioCur = OSPrioHighRdyLDR r4, =OSPrioCurLDR r5, =OSPrioHighRdyLDRB r6, [r5]STRB r6, [r4];sp = OSTCBHighRdy->OSTCBStkPtrLDR r6, =OSTCBHighRdyLDR r6, [r6]LDR sp, [r6] ; get new tasks stack pointerLDMFD sp!,{r0, r1};在timedly中断服务程序中,函数开始压栈两个寄存器,为保证堆栈中数据一致,需出栈对齐;resume registersLDMFD sp!, {r0-r12} ; start the new taskLDMFD sp!, {r14} ; get new state from top of the stack; LDR r14, =0x000000D3MSR CPSR_cxsf, r14 ; CPSR SVC32Mode调试时屏掉此句才会跑的通,待解决LDMFD sp!, {lr,pc}END中断服务程序代码IRQ_DOstmfd sp!, {r0,r1}ldr r0, =IRQ_R1str r1, [r0]ldmfd sp!, {r0}ldr r1, =IRQ_R0str r0, [r1] ;保存R0和R1寄存器(因为这两个寄存器再后面要用到)add r13, r13, #4 ;restore the sp_irq top to original irq topsub r14, r14, #4mov r0, r14 ;LR_irq(R14)减4并保存在R0mrs r1, spsrorr r1, r1, #0x80 ;将SPSR_irq的中断屏蔽位置‘1’(屏蔽中断),并保存再R1 中msr cpsr_cxsf, r1 ;将模式切换到中断前的模式;---------------------------------------------------------------------------------------------bic r1, r1, #0x80 ;将原先保存的SPSR_irq的R1的中断屏蔽位清零(允许中断)stmfd sp!, {r0}stmfd sp!, {r14}stmfd sp!, {r1} ;依次将R0,R14,R1的值压入中断前模式下的堆栈(当前R0,R14,R1中存放的分别是LR_irq-4,中断前模式下的LR,SPSR_irq)ldr r0, =IRQ_R1ldr r1, [r0]stmfd sp!, {r1}ldr r1, =IRQ_R0ldr r0, [r1]stmfd sp!, {r0}ldmfd sp!, {r0,r1} ;恢复原先保存的R0和R1stmfd sp!, {r0-r12} ;将r0--r12全部压入中断以前模式下的堆栈;; Get current task TCB addressIMPORT OSTCBCurLDR r4, =OSTCBCur;及时保存当前任务中断,因为可能会进行任务切换LDR r5, [r4]STR sp, [r5] ; store sp in preempted taskss TCB;-----------------------------IMPORT int_vector_handlerbl int_vector_handler ;跳转到中断源判断和中断处理程序;----------------------------- ;restore the registerldmfd sp!, {r0-r12} ;恢复原先保存的R0-R12ldmfd sp!, {r14}msr cpsr_cxsf, r14ldmfd sp!, {r14} ;将原先保存的SPSR_irq恢复到CPSR中ldmfd sp!, {pc}3、堆栈初始化函数OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt) {unsignedint *stk;opt = opt; /* 'opt' is not used, prevent warning */stk = (unsigned int *)ptos; /* Load stack pointer *//* build a context for the new task */*--stk = (unsigned int) task; /* pc */*--stk = (unsigned int) task; /* lr */*--stk = (0x60000053); /* cpsr IRQ, FIQ disable*/*--stk = 0; /* r12 */*--stk = 0; /* r11 */*--stk = 0; /* r10 */*--stk = 0; /* r9 */*--stk = 0; /* r8 */*--stk = 0; /* r7 */*--stk = 0; /* r6 */*--stk = 0; /* r5 */*--stk = 0; /* r4 */*--stk = 0; /* r3 */*--stk = 0; /* r2 */*--stk = 0; /* r1 */*--stk = (unsigned int) pdata; /* r0 */// *--stk = (0x0); /* spsr IRQ, FIQ disable */return ((void *)stk);}4、timertick函数void Timer_IRQ_Service1(void){U32 dummyread;U8 y;dummyread = *(RP)TIMER_T1ISCR;/* timerflag = 1;*///OSIntNesting = OSIntNesting + 1;clear_reg( TIMER_T1CR, 0);//关闭通道1中断OSTimeTick ();set_reg( TIMER_T1CR, 0);//使能通道1中断OS_ENTER_CRITICAL();if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Sched. only if all ISRs done & not locked */y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to HPT ready to run */OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);if (OSPrioHighRdy != OSPrioCur) { /* No CtxSw if current task is highest rdy */OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++; /* Increment context switch counter *///OS_TASK_SW(); /* Perform a context switch */OSIntCtxSw();}}OS_EXIT_CRITICAL();}第五步:对移植好的代码进行调试。
嵌入式操作系统μCoS-Ⅱ的移植

2 I S Ⅱ的 移 植 分 析  ̄ CO -
2. 移 植 概 述 1
Байду номын сангаас
1 C 一 oS Ⅱ简 介
/ O 一  ̄ S Ⅱ是 一 个 基 于 优 先 级 的抢 占式 实 时 多 C
所谓 移植 , 就是 使一 个实 时 内核能 在其 他 的微 处理 器或 微控 制器 上运 行 。为 了方便 移植 , 大部 分
任务 操作 系统 , 它包含 了实时 内核 、 任务 管理 、 间 时
C S Ⅱ是 用 C语 言编写 的 , O一 但与 硬 件 有关 的 代码
仍需要 用 汇 便 语 言 编 写 。t O — 在 设 计 之 初 已  ̄ SI C I
管理 、 信号 量 、 内存管 理等 , 用 于 8位 1 可 6位 和 3 2
维普资讯
第2 卷 第1 3 期
金 陵 科 技 学 院 学 报
Vo12 N o. . 3. 1
27 月 0 年3 0
JU N LO N IGIS I E O R A F LN T1 T 里 J I N =
Q
Ma.2 0 r ,0 7
随着 现代化 技术 的发 展 , 入式 系统 的应用 范 嵌 围越来 越广 泛 , 于嵌 入式 技术 的产 品从尖 端 复杂 基
自己 的 需 要 对 C S Ⅱ进 行 裁 剪 。t O —I 代 O  ̄ S I源 C
码 公开 , 部分 是 用 A IC编 写 的 , 有 与 处 理 大 NS 只
T ePo tn fEmb d e e ai gS se p h ri go e d d Op r tn y tm  ̄ COS Ⅱ -
GAO iyig Cu — n
( hnd n e i e nl y C egu 109 C i ) C egu i rt o T c o g, hnd 05 , h a U v sy f h o 6 n
嵌入式实时操作系统μCOS-Ⅱ的移植

嵌入式实时操作系统μCOS-Ⅱ的移植1、引言嵌入式系统由于它具有软件代码小、高度自动化、响应速度快等特点已经使它在许多领域得到广泛的应用[3]。
从家里的洗衣机、电冰箱,到作为交通工具的自行车、小汽车,到办公室里的远程会议系统等。
嵌入式系统通常由硬件环境和操作系统构成。
在嵌入式操作系统的统一调度管理下实现对所有系统资源的合理利用和分配,达到提高系统性能和有效利用有限资源的目的。
μCOS-Ⅱ作为一个源码开放的嵌入式实时操作系统,同时具有良好的可移植性、可裁剪性、可剥夺性、稳定性和可靠性等优点,使其成为许多嵌入式操作系统的首选。
本文将μCOS-Ⅱ在Freescale的8位处理器芯片HC9S08上移植实现。
2、μCOS-Ⅱ系统结构μCOS-Ⅱ是一个完整的可移植可固化可裁剪的抢占式实时多任务内核。
可以在不需要做很大修改的基础上方便的移植到多种处理器上。
条件是:该处理器要具有一定数量的堆栈,能够使用软件中断,产生定时器中断,此外,编译器要支持可重入代码,并且要能使用汇编实现对处理器内部寄存器的相关操作[2][4]。
通过μCOS-Ⅱ的管理,使多个任务之间相互协调,分时的占用CPU,实现充分利用资源和实时等相应的功能。
任务通常是一个死循环,用来完成某一特定的功能;一个任务相当于一个线程。
μCOS-Ⅱ可以管理多达64个任务,每个任务都具有一个唯一的合法优先级。
但是,优先级最低的那个任务已经被系统定义为空闲任务,用户不能使用。
用户可以通过函数OSTaskCreate()来创建任务,通过OSTaskDel()来删除任务。
任务可能有以下五种状态:睡眠态、就绪态、运行态、等待状态、中断服务态。
利用不同的系统函数可以实现任务在各状态之间的转换。
μCOS-Ⅱ通过对就绪表的操作总是选择在就绪任务中优。
μCOS-II移植

图标按钮(或者选择 (6)单击 )单击Context Variable图标按钮 或者选择 图标按钮 【Processor Views】->【Variables】)打开变量观 】 【 】 打开变量观 察窗口, 察窗口,通过此窗口可以观察局部变量和全局变 量。 取消断点, (7)可以单步运行程序,可以设置 取消断点, )可以单步运行程序,可以设置/取消断点 或者全速运行程序,停止程序运行, 或者全速运行程序,停止程序运行,观察变量的 判断蜂鸣器及LED1~LED4的控制是否正 值,判断蜂鸣器及 ~ 的控制是否正 确。
步骤 仿真器和MagicARM2410 (1)连接 )连接EasyJTAG-H仿真器和 仿真器和 实验箱,然后安装EasyJTAG-H仿真器 若已经安 实验箱,然后安装 仿真器(若已经安 仿真器 装过,此步省略),短接蜂鸣器跳线JP9。 装过,此步省略 ,短接蜂鸣器跳线 。 (2)启动 )启动ADS 1.2,打开实验工程文件 , Demo_uCOSII。(本范例在ADS文件夹中操作 Demo_uCOSII。(本范例在ADS文件夹中操作) 。(本范例在 文件夹中操作) (3)Make ug (4)Debug (5)全速运行程序,程序将会在 )全速运行程序,程序将会在main.c的主函 的主函 数中停止(因为 因为main函数起始处默认设置有断点。 函数起始处默认设置有断点。 数中停止 因为 函数起始处默认设置有断点
/************************************ ** Function name: DelayNS *************************************/ void DelayNS(uint32 dly) { uint32 i; for(; dly>0; dly--) for(i=0; i<50000; i++); }
UCOS-II的详细移植笔记两种处理器的移植比较(S1C33209S3C44BOX)

UCOS-II的详细移植笔记两种处理器的移植比较(S1C33209S3C44BOX)UC/OS-II的详细移植笔记两种处理器的移植比较(S1C33209&&S3C44BOX) [原创 2007-05-20 23:03:21] 字号:大中小UC/OS-II的移植步骤分析zqcumt 07-4-15关于UC/OS-II的移植网上介绍的已经很多了,比较流行的几款处理器(例如ARM)在网上都可以直接下载移植好的代码。
由于最近选修了一门嵌入式系统的课,用的处理器是EPSON公司的S1C33系列,做实验的时候要进行操作系统的移植,这个周末花了一天半的时间学习了一下,因为毕业设计的时候做过ARM上的移植,于是将两者比较了一下,给出一般的移植要点。
由于将来实验还要设计到GUI的移植以及文件系统的移植和网络协议的移植,我会将自己的学习笔记都记录下来。
大家下载到源码后,针对Intel 80x86的代码在uCOS-II\Ix86L目录下。
代码是80x86实模式,且在编译器大模式下编译的。
移植部分的代码可在下述文件中找到:OS_CPU.H, OS_CPU_C.C, 和OS_CPU_A.ASM。
大家可以参考这个例子,对它进行修改。
INCLUDES.H 是主头文件,在所有后缀名为.C的文件的开始都包含INCLUDES.H文件。
使用INCLUDES.H的好处是所有的.C文件都只包含一个头文件,程序简洁,可读性强。
缺点是.C文件可能会包含一些它并不需要的头文件,额外的增加编译时间。
与优点相比,多一些编译时间还是可以接受的。
用户可以改写INCLUDES.H文件,增加自己的头文件,但必须加在文件末尾。
/////////////////////////////////////////////////////////////////// ////////////一、(1)OS_CPU.H文件的移植 (针对S1C33209)//////////////////////////////////////////////////////////////////////////OS_CPU.H 文件中包含与处理器相关的常量,宏和结构体的定义。
嵌入式操作系统μC/OS—Ⅱ的移植分析

C OSI / -设置 I 与 应用有关的代码
o s CF H G
—
oS M BOX C 0S 0 C oS 1AS C 1 K oS S EM C OS TI E C M
I NCL UDE S H
O 一Ⅱ为每个任务设 置独立堆栈 , 以快速实现 任务切换 。 S 可
软件
CU P
I I
时钟
图 1 应 用 g / 一Ⅱ 的 系 统 结 构 C OS
22 1 编 写 0S CP H 文 件 -_ U.
OS
.
移植  ̄ / S CO 一Ⅱ的S M、 P 或DS 等必须 满 足 以下条件 :① 处 C / U C P
理器 的C 编译 器能 产 生可 重入代 码 ;② 能用C 言打 开 和关 闭 语
软件 的编 写 , 分析 归纳 了 ̄ / S 并 C O 一Ⅱ移 植 要 点 。
关 键 词 : C O — I移 植 ; 译 器 ;  ̄ / S I; 编 目标 系统
中 图 分 类 号 :P 编 号 :6 2 7 0 (O 8 0 — 10 0 17 — 8 0 2O )4 0 3 — 2
—
⑤编写4 个汇编语言函数( SC U AA M) O — P _ .S 。
COSI / — 的应用程序或软件 I
“c0 — 与处 理 器无 关 的 代码 ,sI I
U Co S IH I UCoS I I C 0S CoDER C
作 系统 。 含了实 时内核 、 务管理 、 间管 理 、 务 间通 信同步 包 任 时 任
( SC UH)②声明9 O— P . ; 个数据类 型( S C UH ; O _ P .)③用#en声 df e i
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可重入代码举例
程序1:可重入型函数 void swap(int *x, int *y) { int temp; temp=*x; *x=*y; *y=temp; }
非可重入代码举例
程序2:非可重入型函数 int temp; void swap(int *x, int *y) { temp=*x; *x=*y; *y=temp; }
OSStartHighRdy()
函数
*OS_CPU_A.ASM
进入多任务环境时运行优先 级最高的任务,
OSIntCtxSw()
函数
*OS_CPU_A.ASM 中断退出时的任务切换函数
OSTic实kIS际R(上) ,还有一个文件中很断重服务要程,序它就*O是S_ICRPQU_.AIN.ACSM,它时定钟节义拍了中一断个服务汇程编序宏,
移植规划(续)
支持的指令集
带T变量的ARM7处理器核具有两个指令集: 标准32位ARM指令集 16位Thumb指令集
两种指令集有不同的应用范围。 为了最大限度地支持芯片的特性,任务应当可以使 用任意一个指令集并可以自由切换,而且不同的任务 应当可以使用不同的指令集
移植μC/OS-II
概述
要移植一个操作系统到一个特定的CPU体系结 构并不是一件很容易的事情,它对移植者有以下 要求:
2.要移对参植O考S一A原RM个公理司操要的作《有A系R较M体统深系到结入构一的》个文了档特解定;的CPU体系结构 上并不是一件很容易的事情,它对移植者有以下要求:
31.参对考《所目嵌使标入式用 体实的系时操编结作译构系统器要μ要有C/O有很S-I较深I 》深了一入解书 的;了解; 2. 对OS原理要有较深入的了解; 43.. 对对需所参要使考移 用ADS植的软件的编自操译带的作器编系要译器统有和要较连接有深器相入手册当的的了了解解;; 4. 对需要移植的操作系统要有相当的了解; 55.. 对对具具参考体体《使 使嵌入用用式的的实时芯芯操片片作系也也统要要μC一一/OS定定-II的的》了了一书解解。。
OS_STK_GROWTH
常量
OS_CPU.H
定义堆栈的增长方向
OS_TASK_SW
函数
OS_CPU.H
任务切换时执行的代码
OSTaskStkInit()
函数
OS_CPU_C.C 任务堆栈初始化函数
OSInitHookBegin()、 OSInitHookEnd()、
…
函数
OS_CPU_C.C
μC/OS-II在执行某些操作时 调用的用户函数,一般为空
不可重入函数被中断破坏
如何使函数具有可重入性
使Swap()函数具有可重入性的条件:
把Temp定义为局部变量 调用Swap()函数之前关中断,调用
后再开中断 用信号量禁止该函数在使用过程中
被再次调用
概述 ——移植需要编写的文件
根据μC/OS-II的要求,移植μC/OS-II到一个新的体 系结构上需要提供2个或3个文件:
因为第4点的影响是全局性的,它决定移植代码的框架和功能。 参考具所体以芯片重的点数介据绍手第册4和点使。用手册
主要内容
移植规划 μC/OS-II的移植 嵌入式系统的初始化
C/OS-II的文件结构
μC/OS-II移植 ——μC/OS-II硬件软件体系结构
应用程序 (用户代码)
μC/OS-II (与处理器无关代码)
OS_CORE.c OS_FLAG.c
...
μC/OS-II配置 (与应用相关)
OS_CFG.H INCLUDES.H
μC/OS-II移植 (与处理器相关代码)
软件
硬件
CPU定时器移植时需要 Nhomakorabea写的代码
用于产生 系统时钟
移植C/OS-II满足的条件
处理器的C编译器能产生可重入代码 在程序中可以打开或者关闭中断 处理器支持中断,并且能产生定时中断(通常在10—
100Hz之间) 处理器支持能够容纳一定量数据的硬件堆栈(通常是几
千字节) 处理器有将堆栈指针和其他CPU寄存器的内容存储和读
出到堆栈(或者内存)的指令
什么是可重入代码
可重入的代码指的是一段可以被多个任 务同时调用,而不必担心会破坏数据的 代码(比如:一个函数)
即:可重入型函数在任何时候都可以被 中断执行,过一段时间以后又可以继续 运行,而不会因为在函数中断的时候被 其他的任务重新调用,而影响函数中的 数据
1. 对目标体系结构要有很深了解; 2. 对OS原理要有较深入的了解; 3. 对所使用的编译器要有较深入的了解; 4. 对需要移植的操作系统要有相当的了解; 5. 对具体使用的芯片也要一定的了解
概述
要移植一个操作系统到一个特定的CPU体系结构 上并不是一件很容易的事情,它对移植者有以下要求:
1. 对目标体系结构要有很深了解;
它是μC/OS-II for ARM7通用的中断服务程序的汇编与C函数接口代码。时钟
OS_CPU.H(C语言头文件) OS_CPU_C.C(C程序源文件) OS_CPU_A.ASM(汇编程序源文件)
其中OS_CPU_A.ASM在某些情况下不需要,但极 其罕见。不需要OS_CPU_A.ASM的必须满足以下苛 刻条件:
1.可以直接使用C语言开关中断; 2.可以直接使用C语言编写中断服务程序; 3.可以直接使用C语言操作堆栈指针; 4.可以直接使用C语言保存CPU的所有寄存器。
概述 ——移植代码包括的主要内容
移植内容
类型
所属文件
描述
BOOLEAN、INT8U、INT8S、 …
数据类型
OS_CPU.H
与编译器无关的数据类型
OS_STK
数据类型
OS_CPU.H
堆栈的数据类型
OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()
宏
OS_CPU.H
开关中断的代码
移植规划(续)
任务模式的取舍
ARM7处理器核具有上述七种模式,其中除用户 模式外其它均为特权模式。其中管理、中止、未定义、 中断和快中断模式与相应异常相联系,任务使用这些 模式不太适合。
系统模式除了是特权模式外,其它与用户模式一样, 因而可选为任务使用的模式只有用户模式和系统模式。
为了尽量减少任务代码错误对整个程序的影响,缺 省的任务模式定为用户模式,可选为系统模式,同时 提供接口使任务可以在这两种模式间切换。