在PROTEUS中使用ARM处理器及UCOS-II移植理解

合集下载

ucos_II移植总结

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();}第五步:对移植好的代码进行调试。

UCOS-II移植ARM的读书笔记

UCOS-II移植ARM的读书笔记

UCOS-II移植ARM的读书笔记导读:昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了,关键是我是第一次也是正式开始移植的学习之路啊,今天在工作之前先把昨天的笔记重新回顾一下,UCOS-II的移植需要提供2,真是很郁闷,昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了。

5555。

一个晚上工作的结果啊,关键是我是第一次也是正式开始移植的学习之路啊。

真是够倒霉的。

今天在工作真是很郁闷,昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了。

5555。

一个晚上工作的结果啊,关键是我是第一次也是正式开始移植的学习之路啊。

真是够倒霉的。

今天在工作之前先把昨天的笔记重新回顾一下,其实后来想想也许是件好事,可以让我今天在不借助其他的帮助的情况下自己看代码自己跟自己讲一遍,其实很多看起来是倒霉看起来是灰心的事情把我们的观点换一下那么就是一件好事。

这样的情况发生在我的身上已经挺多次了。

好啦,废话不说,开始补昨天的日记UCOS-II的移植需要提供2,3个文件分别介绍如下:一:OS_CPU.H1 与编译器有关的数据类型只是按照不同的编译器编写对应的数据类型的typedef对应于ARM7的数据类型的编写如下typedef unsigned char BOOLEAN; /* 布尔变量*/typedef unsigned char INT8U; /* 无符号8位整型变量*/typedef signed char INT8S; /* 有符号8位整型变量*/typedef unsigned short INT16U; /* 无符号16位整型变量*/typedef signed short INT16S; /* 有符号16位整型变量*/typedef unsigned int INT32U; /* 无符号32位整型变量*/typedef signed int INT32S; /* 有符号32位整型变量*/typedef float FP32; /* 单精度浮点数(32位长度)*/typedef double FP64; /* 双精度浮点数(64位长度)*/在上面定义的各种数据类型中按照ARM7的堆栈宽度选择INT32Utypedef INT32U OS_STK; /* 堆栈是32位宽度*/接下来一部分是为了兼容低版本UCOS的数据类型所编写的代码,在UCOS-II中暂不考虑2 与处理器相关的代码先定义中断的实现方式,预先设定的中断方式有三种,在ARM7中设置为方式2 #define OS_CRITICAL_METHOD 2 /* 选择开、关中断的方式*/接下来的一段是我暂时还没有完全搞懂的一部分,只知道是设定了12个软件中断的函数,当调用这些函数之前都会执行对应中断号的事情。

uCOS-II在ARM上的移植.

uCOS-II在ARM上的移植.

uCOS-II在ARM上的移植uCOS-II在ARM上的移植详细方法:/space.php?uid=170730&do=blog&id=4847移植工作介绍实际上uC/OS-II可以简单地看作是一个多任务调度器,在这个任务调度器上完善地添加了与多任务操作系统相关的一些系统服务,如信号量、邮箱等。

其90%的代码是用C语言写的,可以直接移植到有C语言编译器的处理器上。

移植工作主要都集中在多任务切换的实现上,因为这部分代码用来保存和恢复CPU现场(即写/读相关寄存器),不能用C语言,只能使用汇编语言完成。

uC/OS-II的全部源代码量大约是6000-7000行,共15个文件。

将 uC/OS-II 移植到ARM处理器上,需要修改三个与ARM体系结构相关的文件,代码量大约是500行。

以下分别介绍这三个文件的移植工作。

OS_CPU.H OS_CPU_A.ASMOS_CPU_C.COS_CPU.H 文件图1 ARM体系结构的寄存器位置·1----数据类型定义数据类型的修改与所用的编译器相关,不同的编译器使用不同的字节长度表示同一数据类型,比如int,同样在x86平台上,GNU的gcc编译为4 bytes,而MS VC++则编译为2 bytes。

·2-----堆栈单位在任务切换时,CPU现场的寄存器将保存在当前运行任务的堆栈中,所以OS_STK 数据类型应该与CPU的寄存器长度一致。

typedef unsigned int os STK;typedef unsigned char BOOLEAN; /* 布尔变量 */typedef unsigned char INT8U; /* 无符号8位整型变量 */typedef signed char INT8S; /* 有符号8位整型变量 */typedef unsigned short INT16U; /* 无符号16位整型变量 */typedef signed short INT16S; /* 有符号16位整型变量 */typedef unsigned int INT32U; /* 无符号32位整型变量 */typedef signed int INT32S; /* 有符号32位整型变量 */typedeffloat FP32; /* 单精度浮点数(32位长度) */typedefdouble FP64; /* 双精度浮点数(64位长度) */typedefINT32U OS_STK; /* 堆栈是32位宽度 */#define BYTE INT8S#define UBYTE INT8U#define WORD INT16S#define UWORD INT16U#define LONG INT32S#define ULONG INT32U·3-----堆栈增长方向void OS_TASK_SW(void; /* 任务级任务切换函数 */void OSStartHighRdy(void; /* 运行优先级最高的任务 */void OS_ENTER_CRITICAL(void; /* 关中断 */void OS_EXIT_CRITICAL(void; /* 开中断 */#defineOS_STK_GROWTH 1 /* 堆栈是从上往下长的 */#define USR32Mode 0x10/* 用户模式 */#define SYS32Mode 0x1f/* 系统模式 */#define NoInt 0x80#ifndef USER_USING_MODE#define USER_USING_MODE SYS32Mode /* 任务缺省模式 */#endif#ifndef OS_SELF_EN#defineOS_SELF_EN 0 /* 允许返回OS与任务分别编译、固化*/#endifOS_CPU_A用汇编编写任务开始函数OSStartHighRdyMSR CPSR_c,#(NoInt | SYS32ModeLDR R1,=OSRunningMOV R2,#1STRB R2,[R1] ;OSRunning=1BL OSTaskSwHook ;调用OSTaskSwHook(B __OSStartHighRdy ;运行最高优先级任务任务切换函数OS_TASK_SWSTMFD SP!,{LR} ;保存当前任务的PCSTMFD SP!,{R0-R12,LR} ;依次保存R0-R12、LR MRS R0,CPSRSTMFD SP!,{R0} ;保存CPSRLDR R1,=OSTCBCurLDR R1,[R1]STR SP,[R1] ;OSTCBCur->OSTCBStkPtr = SP(在当前任务控制块中保存当前任务的堆栈指针BL OSTaskSwHook ;调用OSTaskSwHook(LDR R3,=OSPrioCurLDR R4,=OSPrioHighRdyLDRB R4,[R4]STRB R4,[R3] ;OSPrioCur=OSPrioHighRdy 中断任务切换函数OSIntCtxSwBL OSTaskSwHook ;调用钩子函数OSTaskSwHook(MSR CPSR_c, #(NoInt | IRQ32ModeLDR R0, =OSTCBHighRdyLDR R0, [R0]LDR R1, =OSTCBCurSTR R0, [R1] ;OSTCBCur=OSTCBHighRdyLDR R0,=OSPrioCurLDR R1,=OSPrioHighRdyLDRB R1,[R1]STRB R1,[R0] ;OSPrioCur=OSPrioHighRdyLDR R0,=IRQStackLDR R0,[R0]SUB R0,R0,#4 ;MOV SP,R0 ;IRQ模式堆栈保留一个字MSR CPSR_c, #(NoInt | SYS32Mode ;进入系统模式LDR R2, =OSTCBHighRdyLDR R2, [R2]LDR R2, [R2] ;取得新任务堆栈指针OSTCBHighRdy->OSTCBStkPtr并存入R2中LDR R1,[R2] ;取得新任务的CPSR存入R1中LDR R3,[R2,#15*4] ;取得新任务的PC存入R3中STR R3,[R0] ;把新任务的PC存入IRQ 模式的堆栈中MSR CPSR_c, #(NoInt | IRQ32Mode ;进入IRQ模式MSR SPSR_cxsf,R1 ;把新任务的CPSR保存到IRQ模式的SPSR中MSR CPSR_c, #(NoInt | SYS32Mode ;进入系统模式ADD R2,R2,#4 ;调整新任务堆栈指针MOV SP,R2 ; 系统模式SP→|R0 |LDMFD SP!,{R0-R12,LR} ;恢复新任务的R0-R12,LR,系统模式SP→|PC |ADD SP,SP,#4 ;调整系统模式堆栈指针MSR CPSR_c, #(NoInt | IRQ32Mode ;进入IRQ模式LDMFD SP!,{PC}^ ;恢复新任务的CPSR、PC和IRQ 模式SP中断禁止和允许函数OS_ENTER_CRITICALSTMFD SP!,{R0}MRS R0,CPSRORR R0,R0,#NoIntMSR CPSR_cxsf,R0LDMFD SP!,{R0}MOV PC,LROS_EXIT_CRITICALSTMFD SP!,{R0}MRS R0,CPSRBIC R0,R0,#NoIntMSR CPSR_cxsf,R0LDMFD SP!,{R0}MOV PC,LR节拍中断函数OS_CPU_C.C 文件·1-------任务堆栈初始化在此讨论任务初始化时的堆栈设计,也就是在堆栈增长方向上如何定义每个需要保存的寄存器位置。

让新人快速实现μc∕os II在arm上的移植方法

让新人快速实现μc∕os II在arm上的移植方法
总之,本文介绍了μc/OS II在ARM处理器上的移植方法,包括ARM处理器基本架构、μc/OS II源代码结构、移植注意事项、系统内核移植、设备驱动程序移植和应用程序移植等内容。该移植方法简单可行,为初学者快速掌握μc/OS II移植提供了重要参考。在进行μc/OS II移植前,需要对ARM处理器的架构和特点有一定的了解。ARM处理器的指令集非常精简,只有32条指令,但由于其精简指令集架构(RISC)和良好的流水线设计,使得其效率非常高,能够以较低的功耗获得较高的性能。同时,ARM处理器还拥有较好的分支预测能力,能够快速准确地预测分支的执行情况,从而在执行过程中减少不必要的停顿,提高处理器的效率。
三、移植注意事项
在移植μc/OS II到ARM处理器上时,需要注意以下几个方面:
1.特定处理器的代码优化:根据具体的处理器型号进行代码优化,提高代码执行效率。
2.硬件驱动程序的移植:根据硬件接口规范编写相应的设备驱动程序,保证系统硬件正常工作。
3.中断向量表的更新:根据系统需求重新设置中断向量表,保证中断处理程序能够正确执行。
μc/OS II源代码结构比较清晰,其内核部分包括任务管理、时钟管理、事件管理、内存管理和中断管理等模块。应用程序部分包括文件系统、网络协议、通信协议等。需要注意的是,在移植时应根据具体系统硬件情况进行适当的修改和适配,以保证系统正常运行。
在进行移植时,需要注意以下几个方面:
1.特定处理器的代码优化:根据具体的处理器型号进行代码优化,例如利用ARM处理器特有的指令和指令集,优化代码,提高代码执行效率。
1.硬件平台的选择:不同的硬件平台会对系统的运行环境和性能产生决定性影响。因此,选择合适的硬件平台是成功移植μc/OS II的前提。
2.硬件驱动程序的编写:硬件驱动程序是实现设备与操作系统之间通信的关键部分。因此,编写硬件驱动程序时需要深入了解操作系统的相关接口和硬件规范。

μCOS-II在ARM处理器上的移植要点.

μCOS-II在ARM处理器上的移植要点.

卩COSI在ARM处理器上的移植要点1. 设置OS_CPU.H中与处理器和编译器相关的代码/******************************************************************* **与编译器相关的数据类型******************************************************************** /typedef un sig ned char BOOLEAN;typedef un sig ned char INT8U; 〃8 位无符号整数typedef sig ned char INT8S; 〃8 位有符号整数typedef un sig ned int INT16U; 〃16 位无符号整数typedef sig ned int INT16S; 〃16 位有符号整数typedef un sig ned long INT32U; 〃32 位无符号整数typedef sig ned long INT32S; 〃32 位有符号整数typedef float FP32; /单精度浮点数typedef double FP64; /双精度浮点数typedef un sig ned int OS_STK; //堆栈入口宽度为16 位#defi ne BYTE INT8S // 字节型#define UBYTE INT8U // 为了与uC/OS V1.xx.兼容#define WORD INT16S // ... uC/OS-ll.#defi ne UWORD INT16U#defi ne LONG INT32S#defi ne ULONG INT32U/******************************************************************** *与ARM处理器相关的代码********************************************************************/ #define OS_ENTER_CRITICAL( ARMDisablelnt( /* 关闭中断*/#define OS_EXIT_CRITICAL( ARMEnablelnt( /* 开启中断*//*设施堆栈的增长方向*/#define OS_STK_GROWTH 1 /*堆栈由高地址向低地址增长*/2. 用C语言编写六个操作系统相关的函数(OS_CPU_C.Cvoid *OSTaskStklnit (void (*task(void *pd,void *pdata, void *ptos, INT16U opt { un sig ned int *stk;opt = opt; /*因为'opt'变量没有用到,防止编译器产生警告*/stk = (unsigned int *ptos; /*装载堆栈指针*//*为新任务创建上下文*/*--stk = (un sig ned int task; /* pc */--stk = (un sig ned int task; /* Ir */--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 = (SVC32MODE|0x0; /* cpsr IRQ,关闭FIQ */*--stk = (SVC32MODE|0x0; /* spsr IRQ,关闭FIQ */ return ((void *stk;}void OSTaskCreateHook (OS_TCB *ptcbptcb=ptcb;〃防止编译时出现警告}void OSTaskDelHook (OS_TCB *ptcb{ptcb=ptcb;〃防止编译时出现警告}void OSTaskSwHook (voidvoid OSTaskStatHook (voidvoid OSTimeTickHook (void后5个函数为钩子函数,可以不加代码。

Proteus单片机仿真中的μC/OS-Ⅱ移植

Proteus单片机仿真中的μC/OS-Ⅱ移植
C OS—I 由美 国 人 J a . a rs e编 写 的 一 个 / I是 en J L bo s
3 u/ C OS—l移 植 过 程 l
 ̄/ c os—I I的绝 大 多 数 代 码 都 是 用 C 语 言 编 写 的 。

实 时 多任 务 操 作 系 统 。其 在 2 0 0 0年得 到 了美 国联 邦 航 空 管 理 局对 用 于商 用 飞 机 的符 合 R C O一1 8 T AD 7 B标 准 的
维普资讯


| l l l l l

Po 单片机仿 真中 的 F / rt u es C OS—l移植 l
一 桂 林 电子 科 技 大学 徐 模 辉
关键词
P o e s 嵌 入 式 实 时操 作 系统 rtu
t os—I 移 植 单 片机 仿 真 , c/ I
的 电子 设 计 开 发 环 境 。
运 用 操 作 系 统 是 非 常 必 要 的 。而 操 作 系 统 是 一 个 通 用 的
程 序 , 在 自己 的嵌 入 式 系 统 中 应 用 操 作 系 统 , 须 根 据 要 必
P oe s产 品 系 列 还 包 含 了革 命 性 的 VS 技 术 , 户 rtu M 用 可 以对 基 于微 控 制 器 的设 计 连 同所 有 的周 围 电子 器件 一 起
所 用 C U 的 不 同来 进行 移 植 。本 文 将 具 体 论 述 嵌 入 式 实 P
时多 任 务 操 作 系 统 C/ OS—I I在 5 1系 列 单 片 机 上 的 移 植 , 介 绍 在 P oe s软件 下 成 功 进 行 的 系统 仿 真 。 并 r tu
仿 真 ; 至可 以实 时 采用 诸 如 L D L D、 盘 、 S3 终 端 甚 E /C 键 R 22

uC OS - II 在ARM系统上的移植与实现.

uC OS - II 在ARM系统上的移植与实现.

uC OS - II 在ARM系统上的移植与实现摘要:使用ARM公司提供的ADS 开发工具,将uC/ OS - II 移植到ARM 处理器上,并将移植结果应用在跑马灯和数码管的实现上,运行正常,表明移植成功.关键词:uC/ OS - II ;ARM;移植0 引言在开发嵌入式系统时,一般选择基于ARM 和uC/ OS - II 的嵌入式开发平台,因为ARM 微处理器具有处理速度快、超低功耗、价格低廉、应用前景广泛等优点[1 ] . 将uC/ OS - II 移植到ARM 系统之后,可以充分结合两者的优势. 如果一个程序在一个环境里能工作,我们经常希望能将它移植到另一个编译系统、处理器或者操作系统上,这就是移植技术.移植技术可以使一种特定的技术在更加广泛的范围使用,使软件使用更加灵活,不局限于某一条件.uC/OS - II 是由Jean J . Labrosse 先生编写的完整的可移植、固化、裁剪的占先式实时多任务内核.uC/ OS - II 的源代码完全开放,这是其他商业实时内核无法比拟的[2 ] . 它是针对嵌入式应用设计的,在设计之初就充分考虑了可移植性,它的大部分源代码都是用高可移植性的ANSIC 编写的[3 ] . uC/ OS - II可以移植到从8 位到64 位的不同类型、不同规模的嵌入式系统,并能在大部分的8 位、16 位、32 位、甚至64 位的微处理器和DSP 上运行. 由于uC/ OS - II是一个实时操作系统,所以如果将它嵌入到ARM处理器上,就能够进一步简化ARM系统的开发.图1 uC/ OS - II 文件体系结构1 uC/ OS - II 的移植uC/OS - II 的文件系统结构包括核心代码部分、设置代码部分、与处理器相关的移植代码部分[4 ] . 结构如图1 所示.其中最上边的软件应用层是uC/ OS - II 上的代码. 核心代码部分包括7 个源代码文件和1 个头文件. 功能分别是内核管理、事件管理、消息队列管理、存储管理、消息管理、信号量处理、任务调度和定时管理. 设置代码部分包括2 个头文件,用来配置事件控制块的数目以及是否包含消息管理相关代码. 而与处理器相关的移植代码部分则是进行移植过程中需要更改的部分,包括1 个头文件OS CPU. H ,1 个汇编文件OS CPU A. S 和1 个C 代码文件.实际上将uC/ OS - II 移植到ARM 处理器上,需要完成的工作主要是以下三个与体系结构相关的文件:OS CPU. H ,OS CPU. C 以及OS CPU A. S[5 ] .1. 1 OS CPU. H 的移植文件OS CPU. H 中包括了用# define 语句定义的与处理器相关的常数、宏以及类型. 移植时主要修改的内容有:与编译器相关的数据类型的设定;用#define 语句定义2 个宏开关中断;根据堆栈的方向定义OS STK GROWTH等.在将uC/ OS - II 移植到ARM 处理器上时,首先进行基本配置和数据类型定义.重新定义数据类型是为了增加代码的可移植性,因为不同的编译器所提供的同一数据类型的数据长度并不相同,例如int型,在有的编译器中是16 位,而在另外一些编译器中则是32 位. 所以,为了便于移植,需要重新定义数据类型,如INT32U 代表无符号32 位整型. typedefunsigned int INT8U ,就是定义一个8 位的无符号整型数据类型. 其次就是对ARM 处理器相关宏进行定义,如ARM处理器中的退出临界区和进入临界区的宏定义,退出临界区宏定义[5 ] : #define OS EXITCRITICAL () ARMDisable Int ( ) / / 关中断,进入临界区宏定义# define OS ENTER CRITICAL ( ) AR2MEnableInt () / / 开中断. 最后就是堆栈增长方向的设定. 当进行函数调用时,入口参数和返回地址一般都会保存在当前任务的堆栈中,编译器的编译选项和由此生成的堆栈指令就会决定堆栈的增长方向[6 ] ,定义为# define OS STK GROWTH 1.图2 堆栈增长方向1. 2 OS CPU. C 的移植OS CPU. C 的移植包括任务堆栈初始化和相应函数的实现. 在这里,共有6 个函数:OSTaskStkInit( ) , OSSTaskCreateHook ( ) , OSTaskDelHook ( ) , OS2TaskSwHook( ) ,OSTaskStatHook ( ) , OSTimeTickHook () . 其中后面的5 个HOOK函数又称为钩子函数,主要是用来对uC/ OS - II 进行功能扩展. 这些函数为用户定义函数,由操作系统调用相应的HOOK函数去执行,在一般情况下,他们都没有代码,所以实现为空函数即可. 而函数OSTaskStkInit ( ) 对堆栈进行初始化,在ARM 系统中,任务堆栈空间由高到低依次为PC ,LR ,R12 ,R11 , ?,R1 ,R0 ,CPSR ,SPSR. 在进行堆栈初始化以后,OSTaskStkInit ( ) 返回新的堆栈栈顶指针.1. 3 OS CPU A. S 的移植OS CPU A. S 文件的移植需要对处理器的寄存器进行操作,所以必须用汇编语言来编写. 这个文件的实现集中体现了所要移植到处理器的体系结构和uC/ OS - II 的移植原理[6 ] . 它包括4 个子函数:OSStartHighRdy() , OSCtxSw() , OSIntCtxSw() ,OSTick2ISR() . 其中难点在于OSIntCtxSw() 和OSTickISR() 函数的实现,因为这两个函数的实现与移植者的移植思路以及相关硬件定时器、中断寄存器的设置有关.在实际的移植工作中,这两处也是比较容易出错的地方.OSIntCtxSw( ) 函数由OSIntExit ( ) 函数调用,而OSIntExit () 函数又由OSTickISR() 调用. OSIntCtxSw()函数最重要的作用就是它完成在中断ISR 中直接进行任务切换,从而提高了实时响应的速度. 它发生的时机是在ISR 执行到OSIntExit ( ) 时,如果发现有高优先级的任务因为等待time tick 的到来获得了执行• 7 2 • 第4 期李学桥等:uC/ OS - II 在ARM系统上的移植与实现的条件,就可以马上被调度执行,而不用返回被中断的那个任务之后再进行任务切换. 实现OSIntCtxSw() 的方法大致也有两种情况[7 ] :一是通过调整SP 堆栈指针的方法,根据所用的编译器对于函数嵌套的处理,通过精确计算出所需要调整的SP 位置来使得进入中断时所作的保护现场的工作可以被重用. 二是设置需要切换标志位的方法,在OSIntCtxSw( ) 里面不发生切换,而是设置一个需要切换的标志,等函数嵌套从进入OSIntExit ( ) = > OS ENTER CRITI2CAL() = > OSIntCtxSw( ) = > OS EXIT CRITICAL() = > OSIntExit ( ) 退出后,再根据标志位来判断是否需要进行中断级的任务切换.其次是对OSTickISR() 修改.OSTickISR() 首先在被中断任务堆栈中保存CPU寄存器的值,然后调用OSIntEnter () . 随后调用OSTimeTick() ,检查所有处于延时等待状态的任务,判断是否有延时结束就绪的任务. 最后调用OSIntExit ( ) . 如果在中断中(或其他嵌套的中断) 有更高优先级的任务就绪,并且当前中断为中断嵌套的最后一层,OSIntExit ( ) 将进行任务调度. 如果进行了任务调度,OSIntExit () 将不再返回调用者,而是用新任务的堆栈中的寄存器数值恢复CPU 现场,然后实现任务切换. 如果当前中断不是中断嵌套的最后一层,或中断中没有改变任务的就绪状态, OSIntExit ( ) 将返回调用者OSTickISR( ) ,OSTickISR() 返回被中断的任务. 最后就是退出临界区和进入临界区函数. 进入临界区时,必须关闭中断,用ARMDisableInt () 函数实现. 在退出临界区的时候恢复原来的中断状态,通过ARMEnableInt ( ) 函数来实现[7 ] . 至于进行任务级上下文切换,则是由汇编子程序OSCtxSw 实现.2 在ARM系统上的实现以跑马灯和数码管为例,说明uC/ OS - II 的移植过程:跑马灯是4 个小灯轮流变明变暗,很方便看出效果. 跑马灯在日常中使用很多,比如状态栏跑马灯、文字跑马灯、图片跑马灯、单片机跑马灯等[8 ] . 本文采用的是单片机跑马灯. 实现单片机跑马灯的程序中,只有地址口为低电平(接地) 时,发光管才会亮. 所以只要循环控制地址口的各个引脚的电平高低变化就可使LED 循环点亮:首先是全不亮,接着第1 个灯亮,第2 个灯亮,第3 个灯亮,第4 个灯亮,第5 个灯亮,最后所有的灯一起亮.笔者使用6 个共阳极LED 数码管来实现在7 段数码管上循环显示0~9 ,A~F 字符. 每个显示位的段选线与一个8 位并行口线对应相连,只要在显示位上的段选线上保持段码电平不变,则该位就能保持相应的显示字符. 这里的8 位并行口可以直接采用并行I/ O 口,也可以采用串入/ 并出的移位寄存器或是其他具有三态功能的锁存器等. 当采用动态显示接口时,在多位LED 显示时,为了简化电路,降低成本,将所有位的段选线并联在一起,由一个8 位I/ O口控制. 而共阴(或共阳) 极公共端分别由相应的I/ O 线控制,实现各位的分时选通. 由于各个数码管是共用同一个段码输出口分时轮流通电的,从而大大简化了硬件线路,降低了成本.对于数码管的实现分为3 个步骤:1) 制作LED 字符与码段对应表2) 扫描控制3 ( (U8 3 ) 0x02000006) = 0x3E; / 3 使能第一个数码管3 /3) 段码输出( (U8 3 ) 0x02000004) = seg7table[0 ] ;根据上面的LED 字符与码段对应表,控制相应的数字进行输出. 数码管扫描控制地址为0x02000006 ,8 位访问,比如Bit0 控制数码管0 ,并且低电平有效,Bit5 控制数码管5 ,低电平有效,数码管显示试验系统中采用的是动态显示接口,其中数码管扫描控制地址为0x02000006 ,位0 —5 分别对应一个数码管,将其中每位清0 来选择相应的数码管;地址0x02000004 为数码管的数据寄存器,控制数码管的段码输出.3 多任务应用程序uC/OS - II 的移植及跑马灯和数码管的实现如下[9 ] :首先是C 语言入口函数Main (所有C 程序的入口) . 它里面包括调用函数ARMTargetInit () 初始化ARM处理器,调用OSInit ( ) 进行uC/ OS - II 操作系统初始化,然后调用OSTaskCreate ( ) 函数创建任务TaskLED 和TaskSEG,最后调用ARMTargetStart () 函数启动时钟节拍中断,并且调用OSStart ( ) 启动系统任务调度,由于在程序当中使用for ( ; ;) ,这是一个永无止境的回路,所以装置可以一直进行下去,直到关闭装置.void Main(void){ARMTargetInit () ;uHALr printf (″uC/ OS - II # \ n″) ;OSInit () ;Sem1 = OSSemCreate(0) ;Sem2 = OSSemCreate(1) ;OSTaskCreate(TaskLED , (void 3 ) &IdLED , (OS STK 3 )&StackLED[ STACKSIZE - 1 ] , 5) ;OSTaskCreate(TaskSEG, (void 3 ) &IdSEG, (OS STK 3 )&StackSEG[ STACKSIZE - 1 ] , 6) ;ARMTargetStart () ;OSStart () ;return ;}4 结语使用创建好的模板Temp 新建一个工程Temp ,并将模板中的Core 和Assemble 文件夹中的文件加入到工程Temp 中. 1) 新建一个文件Temp. c ,并将其添加到Temp 工程的App 文件夹中. 2) 打开Temp. c文件,添加两个任务,它们的任务处理函数分别为TaskLED() 和TaskSEG() . 3) 在TaskLED( ) 函数中每隔50 个时钟节拍使所有跑马灯闪烁一次(即按顺序亮,然后全亮,最后全灭,顺序循环) . 4) 在TaskSEG() 函数中每隔50 个时钟节拍切换一次数码管显示(循环从0~F 显示) . 5) 编译工程Temp ,如果出错,则进行修改后再编译. 6) 将Temp 下载并运行,看结果. 正确的结果是将每隔1/ 2 s 切换一次数码管显示,每隔1/ 2 s使所有跑马灯闪烁一次. 经持续了2 h试验,没有出现错误,跑马灯和数码管正常运转,结果证明移植成功.参考文献:[1 ] 雷必成, 吴高标, 吴永良. 嵌入式实时操作系统uC/ OS- II 的移植探讨[J ] . 自动化技术与应用,2003 , (5) :1 —3.[2 ] 邵贝贝. 嵌入式实时操作系统uC/ OS - II[M] . 第2 版.北京:北京航空航天大学出版社,2003. 2 —30.[3 ] 叶丰桥,黄海. uC/ OS - II 在51XA 上的移植应用[J ] .工业控制计算机,2002 , (10) :1 —2.[4 ] 田泽. 嵌入式开发与应用实验教程[M] . 北京: 北京航空航天大学出版社,2004. 264 —270.[5 ] 陈赜. ARM嵌入式技术实践教程[M] . 北京:北京航空航天大学出版社,2005. 189 —203.[6 ] 王田苗. 嵌入式系统设计与实例开发[M] . 北京: 清华大学出版社,2003. 62 —89.[7 ] 朱华军. uC/ OS - II 操作系统在ARM处理器上的技巧[J ] . 计算机工程,2004 , (S1) :2 —3.[8 ] 苏中义,杨宇. 嵌入式系统[J ] . 嵌入系统,2004 , (3) :11[9 ] 曾鸣. uC/ OS - II 实时操作系统在嵌入式平台上进行移植的一般方法和技巧[ J ] . 今日电子, 2004 , (11) :2 —3.。

uCOS-II下基于ARM系列芯片的移植过程分析

uCOS-II下基于ARM系列芯片的移植过程分析

uC/OS-II下基于ARM系列芯片的移植过程分析前言PS:如果想转载本文请联系tony或者作者本人我。

请勿将本文用于任何商业用途。

本文也是写给自己的,以提供给自己随时查阅。

等我全部写完以后,会把我写的手稿上传到网站上。

总的来说:只是希望本文能对准备学习uCOS的人有点指引,对徘徊在如果移植uCOS的人有点抛砖引玉,对已经玩熟悉了uCOS的朋友,你们就当看看罗!呵呵!本人联系方式:zhenyang.mo#。

如果文中有任何错误请各位看官给本人发一下邮件提醒我一下!感谢感谢了!借个文章抬头问问tony:你那里还有STM32那个板子么?还在免费发放么?最近手痒的很,想玩玩STM32的冬冬了。

等我玩熟悉以后,我就写一些STM32的东东了!有的话,也发一份给偶吧,感谢感谢了!本文是完全基于自己写的,本人看到网上很多地方都提供什么什么芯片基于uCOS的移植代码,但是很少有人能详细讲解为什么要这样进行移植的说明文档。

本人不才想填补一下这部分的空缺。

在论坛上也看到了某位大侠的移植情景分析,写的真的非常好,不过就是对于那些刚入门的兄弟来说,还是太深奥了。

我希望各位看官能结合到我写的这篇文章,在看看那位大侠的情景分析,相信大家一定会收获不少东西的。

文章目录简介第一楼:综述+任务堆栈初始化过程分析(完成)第二楼:启动uC/OS-II的服务函数过程分析(完成)第三楼:任务级的任务切换服务函数过程分析(完成)第四楼:中断级的任务切换服务函数过程分析(完成)第五楼:ARM体系结构下的异常模式分析(完成)第六楼:ARM的启动代码和手动编写中断服务程序(附源代码)(完成)-必须掌握的重点知识源代码重新修正过。

第七楼:在ARM体系下uC/OS-II的中断函数编写(完成)本次就来讲解一下在IAR开发环境下,让整个系统工作在管理模式下的uCOS-II移植。

本文只讲解了OS_CPU_C.C和OS_CPU_A.A这两个文件。

着重给各位看官模拟仿真一下uCOS-II中的任务级上下文切换,本文以图文形势给大家分析。

在PROTEUS中使用ARM处理器及uC-OS-II移植理解——LPC2124.

在PROTEUS中使用ARM处理器及uC-OS-II移植理解——LPC2124.

在PROTEUS中使用ARM处理器及uC/OS-II移植理解——LPC2124LPC2124是基于一个支持实时仿真和跟踪的16/32位ARM7TDMI-S CPU的微处理器,并带有256k 的嵌入的高速Flash存储器和16k的片那静态RAM。

128位宽度的存储器接口和独特的加速结构使得32位代码能够在最大的时钟速率下运行。

对代码规模有严格控制的应用可使用16位Thumb模式,将使得代码规模降低超过30%,而性能的损失却很小。

LPC2124片那Boot装载程序实现在系统编程(ISP)和在应用编程(IAP)。

1ms可以编程512字节。

整片擦除只需要400ms。

此外还有4路A/D转换器,转换时间低于2.24us;2个32位定时器,6路PWM输出、RTC、看门狗和多个串行接口。

LPC系列微处理器的抗干扰能力强,在很多应用中得到了使用。

三.软件分析1.LPC的Memory Map、Remap和LPC2124的Bootblock程序Memory Map是把芯片中、芯片外的Flash、RAM、外设、BootBlock等进行统一编址,用地址来表示对象。

LPC系列ARM处理器的这个地址是出厂时,由厂家规定的,用户只能访问,而不能进行更改。

Remap和Boot,个人理解如下:在Reset信号周期内,LPC2124运行芯片内部自带的Bootblock程序,复位信号过后才是运行用户的程序。

LPC系列ARM处理器的Bootblock被固化在最高的Flash块中,运行时是被映射到0x7FFFE000~0x7FFFFFFF区域,这个程序是厂家写入的,它由任何复位硬件激活,在任何复位后都会先执行Boot装载程序。

之所以要把BootBlock程序放在Flash块的顶端,是因为各芯片的Flash大小不一致,厂家为了BootBlock在芯片中的位置固定,在编址的2G靠前的位置虚拟划分一个区域作为BootBlock区域。

这就是Remap。

在ARM处理器上移植uCOSII的中断处理.

在ARM处理器上移植uCOSII的中断处理.

在ARM处理器上移植uCOS II的中断处理uCOS II是一个源码公开、可移植、可固化、可剪裁和抢占式的实时多任务操作系统,其大部分源码是用ANSI C编写,与处理器硬件相关的部分使用汇编语言编写。

总量约200行的汇编语言部分被压缩到最低限度,以便于移植到任何一种其它的CPU上。

uCOS II最多可支持56个任务,其内核为占先式,总是执行就绪态的优先级最高的任务,并支持Semaphore (信号量)、Mailbox (邮箱)、MessageQueue(消息队列)等多种常用的进程间通信机制。

与大多商用RTOS不同的是,uCOS II 公开所有的源代码.并可以免费获得,只对商业应用收取少量License费用。

uCOS II移植跟OS_CUP_C.C、OS_CPU_A.S、OS_CPU.H 3个文件有关,中断处理的移植占据了很大一部分内容。

作为移植的一个重点,本文以标准中断(IRQ)为例讨论了移植中的中断处理。

1 uCOS II系统结构uCOS II的软硬件体系结构如图1。

应用程序处于整个系统的顶层.每个任务都可以认为自己独占了CPU,因而可以设计成为一个无限循环。

大部分代码是使用ANSI C语言书写的,因此uCOS II的可移植性较好。

尽管如此,仍然需要使用C和汇编语言写一些处理器相关的代码。

uCOS II的移植需要满足以下要求:1)处理器的C编译器可以产生可重入代码:可以使用C调用进入和退出Critical Code(临界区代码);2)处理器必须支持硬件中断,并且需要一个定时中断源;3)处理器需能容纳一定数据的硬件堆栈;4)处理器需有能在CPU寄存器与内存和堆栈交换数据的指令。

移植uCOS II的主要工作就是处理器和编译器相关代码以及BSP(Board Support Package)的编写。

uCOS II处理器无关的代码提供uCOS II的系统服务,应用程序可以使用这些API函数进行内存管理、任务间通信以及创建、删除任务等。

uCOS-II操作系统在ARM处理器上的实现

uCOS-II操作系统在ARM处理器上的实现

中国矿业大学本科生毕业论文姓名:学号:学院:专业:论文题目:uCOS-II操作系统在ARM处理器上的实现指导教师:职称:2010 年6 月中国矿业大学毕业论文任务书学院专业年级学生姓名任务下达日期:|毕业论文日期:毕业论文题目:uCOS-II操作系统在ARM处理器上的实现毕业论文主要内容和要求:本文首先将介绍嵌入式系统的历史、现状、发展方向和一些基本概念。

接着对ARM核芯片的应用领域、ARM指令集、寄存器组织做详细介绍。

然后将详细分析uCOS-II的特点与相关系统结构、任务的状态与调度、系统的通信机制。

接下来将简单介绍硬件开发环境和uCOS-II硬件和软件体系结构,提出移植过程中存在的主要问题,并给出移植过程。

移植过程主要集中在三个文件的重新编写上:OS_CPU.H , OS_CPU_A.ASM和OS_CPU_C.C。

文章将给出相关函数的模型和源代码,并附上注释和详细说明。

在确保系统正常运行的情况下,本文还提出了一种任务堆栈的改进方法,并给出了流程图。

院长签字:指导教师签字:指导教师评语(①基础理论及基本技能的掌握;②独立解决实际问题的能力;③研究内容的理论依据和技术方法;④取得的主要成果及创新点;⑤工作态度及工作量;⑥总体评价及建议成绩;⑦存在问题;⑧是否同意答辩等):成绩:指导教师签字:年月日评阅教师评语(①选题的意义;②基础理论及基本技能的掌握;③综合运用所学知识解决实际问题的能力;④工作量的大小;⑤取得的主要成果及创新点;⑥写作的规范程度;⑦总体评价及建议成绩;⑧存在问题;⑨是否同意答辩等):成绩:评阅教师签字:年月日中国矿业大学毕业论文答辩及综合成绩摘要随着计算机和通信技术的快速发展,嵌入式系统以其简洁、高效等优点越来越多地受到人们的广泛关注。

嵌入式产品己经成为了信息产业的主流,被广泛应用于移动计算设备、网络设备、工控设备、信息家电、汽车电子、娱乐设施、仪器仪表等领域。

开发一个嵌入式应用系统需要嵌入式硬件、实时操作系统及相应的软件工具。

在PROTEUS中使用ARM处理器及uCOSII移植理解——LPC2124

在PROTEUS中使用ARM处理器及uCOSII移植理解——LPC2124

在PROTEUS中使用ARM处理器及uC-OS-II移植理解——老公如果你只能在活一天,我愿用我的生命来延续你的生命,你要快乐的生活在提出分手的时候请不要说还爱我。

在PROTEUS中使用ARM处理器及uC/OS-II移植理解——LPC2124LPC2124是基于一个支持实时仿真和跟踪的16/32位ARM7TDMI-S CPU的微处理器,并带有256k 的嵌入的高速Flash存储器和16k的片那静态RAM。

128位宽度的存储器接口和独特的加速结构使得32位代码能够在最大的时钟速率下运行。

对代码规模有严格控制的应用可使用16位Thumb模式,将使得代码规模降低超过30%,而性能的损失却很小。

LPC2124片那Boot装载程序实现在系统编程(ISP)和在应用编程(IAP)。

1ms可以编程512字节。

整片擦除只需要400ms。

此外还有4路A/D转换器,转换时间低于;2个32位定时器,6路PWM输出、RTC、看门狗和多个串行接口。

LPC系列微处理器的抗干扰能力强,在很多应用中得到了使用。

三.软件分析1.LPC的Memory Map、Remap和LPC2124的Bootblock程序Memory Map是把芯片中、芯片外的Flash、RAM、外设、BootBlock等进行统一编址,用地址来表示对象。

LPC系列ARM处理器的这个地址是出厂时,由厂家规定的,用户只能访问,而不能进行更改。

Remap和Boot,个人理解如下:在Reset信号周期内,LPC2124运行芯片内部自带的Bootblock程序,复位信号过后才是运行用户的程序。

LPC系列ARM处理器的Bootblock被固化在最高的Flash块中,运行时是被映射到0x7FFFE000~0x7FFFFFFF区域,这个程序是厂家写入的,它由任何复位硬件激活,在任何复位后都会先执行Boot装载程序。

之所以要把BootBlock程序放在Flash块的顶端,是因为各芯片的Flash大小不一致,厂家为了BootBlock在芯片中的位置固定,在编址的2G靠前的位置虚拟划分一个区域作为BootBlock区域。

Proteus单片机仿真中的_C_OS_II移植

Proteus单片机仿真中的_C_OS_II移植

P r o t e u s单片机仿真中的μC/O S I I移植※■桂林电子科技大学 徐模辉 摘 要针对51系列单片机的特点,介绍嵌入式实时操作系统内核μC/OS-II在51系列单片机上的移植环境和条件;详细阐述在Keil uVision3开发环境下的移植步骤和移植过程;充分利用51系列单片机自身的硬件资源,结合外扩部分其他硬件,用Proteus软件成功进行了系统移植的硬件仿真;分析移植测试实验情况,验证μC/OS-II的实时性、稳定性和安全性。

 关键词Proteus 嵌入式实时操作系统 μC/OS-II 移植 单片机仿真引 言由于技术的进步,单片机系统硬件的规模越来越大,功能越来越强,为了对整个系统及其所操作的部件、装置等资源进行统一协调、指挥和有效控制,在嵌入式系统中运用操作系统是非常必要的。

而操作系统是一个通用的程序,要在自己的嵌入式系统中应用操作系统,必须根据所用CPU的不同来进行移植。

本文将具体论述嵌入式实时多任务操作系统μC/OS-II在51系列单片机上的移植,并介绍在Proteus软件下成功进行的系统仿真。

1 μC/OS-II介绍μC/OS-II是由美国人Jean brosse编写的一个实时多任务操作系统。

其在2000年得到了美国联邦航空管理局对用于商用飞机的符合R TCA DO-178B标准的认证,证明μC/OS-II具有足够的稳定性和安全性[1]。

μC/OS-II的移植对CPU芯片的要求[2]:①CPU支持中断,并能产生定时中断;②CPU支持一定容量的硬件堆栈;③CPU有将堆栈指针和其他寄存器读出和存储到堆栈或内存的指令;④编译器能产生可重入代码;⑤用C 语言就可以打开、关闭中断。

本设计采用51系列单片机,开发环境采用Keil公司的Keil uVision3,基本满足上述要求。

最后系统在Proteus6.9SP4软件下仿真。

2 Proteus仿真软件介绍Proteus软件是来自英国Labcenter electronics公司的EDA工具软件。

uCOS-II 在ARM 微处理器上的移植及编译 课程设计

uCOS-II 在ARM 微处理器上的移植及编译 课程设计

ARM原理与应用报告一、设计内容1.用ADS1.2 IDE软件进行程序代码编译设计,生成可执行的输出文件,并显示运行结果,实现uC/OS-II 内核在ARM处理器上移植。

2.uC/OS-II 在ARM 微处理器上的移植及编译。

二、设计目的与要求目的:ARM原理与应用课程设计是学生理论联系实际的重要实践教学环节,是对学生进行的一次专业训练,也是对学生掌握和应用嵌入式系统相关知识能力的有效测试。

通过ARM原理与应用课程设计,使学生初步了解嵌入式系统软件开发的一般过程和基本设计方法,使学生进一步巩固和加深所学的专业理论知识,培养学生文献查阅、报告撰写等基本技能;培养学生独立分析和解决工程实际问题的能力;培养学生的团队协作精神、创新意识、严肃认真的治学态度和严谨求实的工作作风。

要求:1) 了解uC/OS-II 内核的主要结构。

2) 掌握将uC/OS-II 内核移植到ARM 处理器上的基本方法。

3)在给定的设备(UP-TECH PXA270-S嵌入式开发平台、PC 机、WinXP、ADS1.2 集成开发环境、仿真器驱动程序、超级终端通讯程序)上加以实验,学会自己分析、找出解决问题的方法。

4)对设计中遇到的问题和困难,独立思考,查阅资料,分析、观察、判断、试验、再判断以寻找答案。

5)分析结果,写出设计总结报告论述自己的观点,并应将参考资料列在报告后面以备查询。

内容尽量翔实(如上机过程、环境搭建),其中必须有按自己所理解、用自己的语言所描述的内容。

三、设计环境或器材、原理与说明环境:硬件:PC机,博创UP-TECHPXA27-S目标板ARM7TDMI微处理器,串口线,并口JTAG 转换线;软件:MS.Virtual.PC.2004,Windows XP系统,ADS1.2 IDE编译环境,LPC2000 Flash Utility 烧写程序、超级终端通讯程序.原理与说明:1.《ARM原理与应用》课程设计题目涉及ARM应用的诸多方面,须经过思考和认真的学习,有一定难度,在深度方面主要要求学生对具体ARM指令的分析理解,目标板ARM处理器的硬件认识了解,ADS1.2 IDE软件的操作能力,解读uC/OS-II 内核的自学能力以及自我解决问题的能力。

在PROTEUS中使用ARM处理器及uCOS-II移植理解

在PROTEUS中使用ARM处理器及uCOS-II移植理解

在PROTEUS中使用ARM处理器及uC/OS-II移植理解Rein Lee 一.嵌入式系统概述通过本次嵌入式系统课程的学习,我了解了嵌入式系统的概念。

所谓嵌入式系统,是指用于执行独立功能的专用计算机系统,它由包括微处理器、定时器、微控制器、存储器、传感器等一系列微电子芯片与器件,和嵌入在存储器中的微型操作系统、控制应用软件组成,共同实时诸如实时控制、监视、管理、移动计算、数据处理等各种自动化处理任务。

嵌入式系统以应用为中心,以微电子技术、控制技术和通讯技术为基础,强调硬件软件的协同性与整合性,软件与硬件可裁减,以满足系统对功能、成本、体积和功耗等要求。

1.1 嵌入式系统的硬件特征嵌入式系统的硬件必须根据具体的应用任务,以功耗、成本、体积、可靠性、处理能力等为指标来选择。

嵌入式系统的核心是系统软件和应用软件。

由于存储空间有限,因而要求软件代码紧凑、可靠,大多对实时性有严格的要求。

早期的嵌入式系统设计方法,通常是采用“硬件优先”原则。

在粗略估计软件任务需求的情况下,首先进行硬件设计与实现。

然后在此硬件平台上,再进行软件设计。

因为很难充分利用硬件软件资源,取得最佳性能的效果。

同时,一旦在测试时发现问题,需求对设计进行修改时,整个设计流程将重新进行,对成本和设计周期的影响很大。

这种传统的设计方法只能改善硬件/软件各自的性能,在有限的设计空间不可能对系统做出较好的性能综合优化,在很大程度上依赖于设计者的经验和反复实验。

随着电子系统功能的日益强大和微型化,系统设计涉及的问题越来越多,难度也越来越大。

硬件和软件也不再是截然分开的两个概念。

因而出现了软硬件协同的设计方法。

在系统目标要求下,协同设计软硬件体系结构,以最大限度地挖掘系统软硬件能力,得到高性能低代价的优化设计方案。

1.2 嵌入式操作系统目前流行的嵌入式操作系统可以分为两类:一类是从运行在个人电脑上的操作系统向下移植到嵌入式系统中,形成的嵌入式系统,如微软公司的Windows CE,SUN公司的Java操作系统,嵌入式Linux等。

μCOS-II在ARM平台上移植的深入探讨.

μCOS-II在ARM平台上移植的深入探讨.

μC/OS-II在ARM平台上移植的深入探讨摘要:实现了一种全集成可变带宽中频宽带低通滤波器,讨论分析了跨导放大器-电容(OTA—C)连续时间型滤波器的结构、设计和具体实现,使用外部可编程电路对所设计滤波器带宽进行控制,并利用ADS软件进行电路设计和仿真验证。

仿真结果表明,该滤波器带宽的可调范围为1~26 MHz,阻带抑制率大于35 dB,带内波纹小于0.5 dB,采用1.8 V电源,TSMC 0.18μm CMOS工艺库仿真,功耗小于21 mW,频响曲线接近理想状态。

关键词:ButteμC/OS-II在ARM平台的移植是一个重要的学习过程,有助于提高对RTOS的认识与理解,从而提高嵌入式工作者的理论与技术水平。

μC/OS-II是一个小的实时内核,源代码公开,有详尽的解释。

正是因为其内核小,才便于研究、理解和掌握。

另外,参照TCP/IP协议、标准和一些公开的图书,在μC/OS-II上增加TCP/IP协议栈,蓝牙通信软件、红外通信协议也十分方便,商业价值得到了认可。

随着科技的发展,嵌入式应用的复杂性越来越高,同时ARM体系处理器的价格越来越低,ARM平台 + 实时操作系统的架构体系的使用会越来越广泛。

有鉴于此,本文对μC/OS-II在ARM平台下的移植进行了深入探讨。

1 操作系统μC/OS-II及S3C2410开发平台简介1.1 μC/OS-II简介μC/OS最早出自于1992年美国嵌入式系统专家Jean brosse在《嵌入式系统编程》杂志5月和6月上刊登的文章连载,并把μC/OS的源代码发表在该杂志的BBS上。

μC/OS-II是目前最新的版本。

μC/OS-II是专门为计算机的嵌入式应用而设计的,绝大部分代码用C语言编写。

CPU的相关部分采用汇编语言编写,总量在200行左右的汇编语言被压缩到最低限度,目的是便于移植到任何一种其他的CPU上去。

μC/OS-II具有执行效率高、占用空间小、实时性优良、可扩展等特点,最小内核可编译至2 KB。

μCOSII在CortexM核ARM处理器上的移植

μCOSII在CortexM核ARM处理器上的移植

μCOSII在Cortex-M3核ARM处理器上的移植目前,嵌入式技术已被广泛应用到汽车电子、无线通信、数码产品等各个领域。

嵌入式操作系统及嵌入式处理器技术发展迅猛,嵌入式操作系统典型代表有μCOS—II、μClinux、Winclow CE、VxWorks等;嵌入式处理器包括ARM、MIPS、PowerPC等。

随着软硬件技术的发展,人们开始意识到基于嵌入式操作系统的程序开发模式的便利性及可靠性,并且在程序开发过程中开始倾向于从传统超循环开发模式转向基于嵌入式操作系统的开发模式。

1 软硬件开发环境及处理器介绍1.1 软件硬开发环境本移植过程使用的软件环境是RealView MDK开发套件,此产品是ARM公司最新推出的针对各种嵌入式处理器的软件开发工具,该开发套件功能强大,包括了μVision3集成开发环境和 RealView编译器。

使用的硬件平台是深圳英蓓特公司推出的全功能评估板STMl03V100,其上所采用的处理器是ST意法半导体公司生产的32位哈佛结构ARM处理器STM32F103VBT6,该处理器内置ARM公司最新的Cortex—M3核,并且具有非常丰富的片上资源。

1.2 关于基于Cortex-M3的ARM处理器的介绍基于Cortex—M3核的ARM处理器支持两种模式,分别称为线程模式和处理模式。

程序可以在系统复位时或中断返回时两种情况下进入线程模式,而处理模式只能通过中断或异常的方式来进入。

处于线程模式中代码可以分别运行在特权方式下和非特权方式下。

处于处理模式中的代码总是运行在特权方式下。

运行在特权方式下的代码对系统资源具有完全访问权,而运行在非特权方式下的代码对系统资源的访问权受到一定限制。

处理器可以运行在Thumb状态或Debug状态。

在指令流正常执行期间,处理器处于Thumb状态。

当进行程序调试时,指令流可以暂停执行,这时处理器处于Debug状态。

处理器有两个独立的堆栈指针,分别称为MSP和PSP。

uCOS-II在arm上的移植

uCOS-II在arm上的移植

总结一下移植中浪费我时间的几个小错误吧,这完全是个人粗心导致的失误:
1、在os_cpu.h文件中需要用宏定义将OS_TASK_SW指向OSCtxSw函数,而我开始像以前一样直接将OSCtxSw函数与0号软终端链接起来,结果发现函数调用不成功。后来直接用宏定义将OS_TASK_SW define为OSCtxSw函数,初步调试通过,即验证OSCtxSw函数正确,但是到后来调用任务的时候却发现任务切换不正常,不得不重新将函数与中断结合起来,当然就不能还是0号中断了,而是改为一个比较保险的软终端,这个问题纠结了很长时间。
2)数据堆栈;
c51中,由于我们使用OS,采用的LARGE编译模式,所以数据堆栈的指针是“?C_XBP”, 栈的生长方向是向下的,栈空间分配在51的外部RAM(xdata)中。
3)C51中断中堆栈的保护;
研究中断中堆栈的保护的意义在于,因为uCOS中的任务切换,本身就是模拟一次中断的发生:保护Task1的CPU寄存器,SP切换到Task2的堆栈,弹出Task2的CPU寄存器。用C51写中断函数的时候,编译器会自动保护CPU的寄存器,所以中断返回时任务调度OSIntCtxSw(),就不用重新保护寄存器。
实时系统和前/后台系统;
前/后台系统:一个大循环,循环查询各种标志位。如果标志位置位,就执行相应的服务程序。标志位就是标志事件的发生,事件响应延时处于不可预测状态。最坏的情况是循环中所有其他的事件服务程序执行完,才响应当前事件。中断服务虽然能即时/优先响应,但是它们和主循环的通讯,也是通过置主循环中相应的标志位来完成的。
我主要想讲一下自己最近移植uCOS-II的心得,因为最近也在学习操作系统,所以这段日子对于uCOS-II的学习的确也让我对于操作系统有了一个实际深刻的认识。

实时操作系统uC/OS一Ⅱ在ARM上的移植—软件仿真

实时操作系统uC/OS一Ⅱ在ARM上的移植—软件仿真

实时操作系统uC/OS一Ⅱ在ARM上的移植—软件仿真实时操作系统uC/OS一Ⅱ在ARM上的移植—软件仿真摘要:介绍了实时操作系统uC/OS—II的特点,讨论了其在LPC2106上移植的可能性,成功通过软件仿真地将uC/OS—II移植到LPC2106上,并通过例程验证了移植代码的正确性。

注:本文是引用期刊“实时操作系统uC/OS—II在ARM上的移植,作者:王晓鸣、王树新、张宏伟”结合了网上的程序实现了对系统移植的软件仿真。

0:引言目前嵌入式系统在家电、移动电话、PDA等各种领域的应用日益广泛,程序设计也越来越复杂,这就需要采用一个通用的嵌入式操作系统来对其进行管理和控制。

移植了操作系统的嵌入式系统开发,可大大减轻程序员的负担,操作系统提供了多任务的管理功能,只需专注于每个任务的管理。

对于不同的应用,可以按照相同的步骤完成系统设计。

如果更换硬件平台,则只需要对操作系统进行少量的移植工作,与硬件无关的应用代码完全无需修改,同时,可增强代码的可读性、可维护性和可扩展性。

uC/OS—II是一个可裁减的、源代码开放的、结构小巧、可剥夺型的实时多任务内核,它提供任务调度、任务间的通信与同步、任务管理、时间管理和内存管理等基本功能。

将uC/OS—II移植到嵌入式处理器上,对于提高产品质量、缩短开发周期和降低成本等方面有着重要的意义。

本文主要介绍uC/OS—II 在飞利浦的一款AR M7TDMI的嵌入式处理器LPC2106应用。

1 嵌入式操作系统uC/OS—II1.1 uC/OS—II简介uC/OS—II是一种性能优良源码公开且被广泛应用的免费嵌入式操作系统,它结构小巧、具有基于优先级的抢占式实时多任务内核,绝大部分代码是用ANSI C语言编写的,与硬件相关部分用汇编语言编写,使之可供不同构架的微处理器使用。

只要有标准的ANSI C交叉编译器,有汇编器、链接器等软件工具,就可以将uC/OS—II嵌入到开发的产品中。

在PROTEUS中使用ARM处理器及uCOS-II移植理解

在PROTEUS中使用ARM处理器及uCOS-II移植理解

在PROTEUS中使用ARM处理器及uC/OS-II移植理解Rein Lee 一.嵌入式系统概述通过本次嵌入式系统课程的学习,我了解了嵌入式系统的概念。

所谓嵌入式系统,是指用于执行独立功能的专用计算机系统,它由包括微处理器、定时器、微控制器、存储器、传感器等一系列微电子芯片与器件,和嵌入在存储器中的微型操作系统、控制应用软件组成,共同实时诸如实时控制、监视、管理、移动计算、数据处理等各种自动化处理任务。

嵌入式系统以应用为中心,以微电子技术、控制技术和通讯技术为基础,强调硬件软件的协同性与整合性,软件与硬件可裁减,以满足系统对功能、成本、体积和功耗等要求。

1.1 嵌入式系统的硬件特征嵌入式系统的硬件必须根据具体的应用任务,以功耗、成本、体积、可靠性、处理能力等为指标来选择。

嵌入式系统的核心是系统软件和应用软件。

由于存储空间有限,因而要求软件代码紧凑、可靠,大多对实时性有严格的要求。

早期的嵌入式系统设计方法,通常是采用“硬件优先”原则。

在粗略估计软件任务需求的情况下,首先进行硬件设计与实现。

然后在此硬件平台上,再进行软件设计。

因为很难充分利用硬件软件资源,取得最佳性能的效果。

同时,一旦在测试时发现问题,需求对设计进行修改时,整个设计流程将重新进行,对成本和设计周期的影响很大。

这种传统的设计方法只能改善硬件/软件各自的性能,在有限的设计空间不可能对系统做出较好的性能综合优化,在很大程度上依赖于设计者的经验和反复实验。

随着电子系统功能的日益强大和微型化,系统设计涉及的问题越来越多,难度也越来越大。

硬件和软件也不再是截然分开的两个概念。

因而出现了软硬件协同的设计方法。

在系统目标要求下,协同设计软硬件体系结构,以最大限度地挖掘系统软硬件能力,得到高性能低代价的优化设计方案。

1.2 嵌入式操作系统目前流行的嵌入式操作系统可以分为两类:一类是从运行在个人电脑上的操作系统向下移植到嵌入式系统中,形成的嵌入式系统,如微软公司的Windows CE,SUN公司的Java操作系统,嵌入式Linux等。

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

嵌入式系统课程论文
在PROTEUS中使用ARM处理器及uC/OS-II移植理解
Rein Lee
一.嵌入式系统概述
通过本次嵌入式系统课程的学习,我了解了嵌入式系统的概念。

所谓嵌入式系统,是指用于执行独立功能的专用计算机系统,它由包括微处理器、定时器、微控制器、存储器、传感器等一系列微电子芯片与器件,和嵌入在存储器中的微型操作系统、控制应用软件组成,共同实时诸如实时控制、监视、管理、移动计算、数据处理等各种自动化处理任务。

嵌入式系统以应用为中心,以微电子技术、控制技术和通讯技术为基础,强调硬件软件的协同性与整合性,软件与硬件可裁减,以满足系统对功能、成本、体积和功耗等要求。

1.1 嵌入式系统的硬件特征
嵌入式系统的硬件必须根据具体的应用任务,以功耗、成本、体积、可靠性、处理能力等为指标来选择。

嵌入式系统的核心是系统软件和应用软件。

由于存储空间有限,因而要求软件代码紧凑、可靠,大多对实时性有严格的要求。

早期的嵌入式系统设计方法,通常是采用“硬件优先”原则。

在粗略估计软件任务需求的情况下,首先进行硬件设计与实现。

然后在此硬件平台上,再进行软件设计。

因为很难充分利用硬件软件资源,取得最佳性能的效果。

同时,一旦在测试时发现问题,需求对设计进行修改时,整个设计流程将重新进行,对成本和设计周期的影响很大。

这种传统的设计方法只能改善硬件/软件各自的性能,在有限的设计空间不可能对系统做出较好的性能综合优化,在很大程度上依赖于设计者的经验和反复实验。

随着电子系统功能的日益强大和微型化,系统设计涉及的问题越来越多,难度也越来越大。

硬件和软件也不再是截然分开的两个概念。

因而出现了软硬件协同的设计方法。

在系统目标要求下,协同设计软硬件体系结构,以最大限度地挖掘系统软硬件能力,得到高性能低代价的优化设计方案。

1.2 嵌入式操作系统
目前流行的嵌入式操作系统可以分为两类:一类是从运行在个人电脑上的操作系统向下移植到嵌入式系统中,形成的嵌入式系统,如微软公司的Windows CE,SUN公司的Java操作系统,嵌入式Linux等。

另一类是实时操作系统,如WindRiver公司的VxWorks,ISI的pSOS,ATI的Nucleus,和免费公开源代码的uC/OS-II等。

二.在Proteus中使用ARM处理器
由于Proteus中只支持LPC系列的ARM处理器,在这里只是简单的列举出LPC2124的一些特性:
LPC2124是基于一个支持实时仿真和跟踪的16/32位ARM7TDMI-S CPU的微处理器,并带有256k 的嵌入的高速Flash存储器和16k的片那静态RAM。

128位宽度的存储器接口和独特的加速结构使得32位代码能够在最大的时钟速率下运行。

对代码规模有严格控制的应用可使用16位Thumb模式,将使得代码规模降低超过30%,而性能的损失却很小。

LPC2124片那Boot装载程序实现在系统编程(ISP)和在应用编程(IAP)。

1ms可以编程512字节。

整片擦除只需要400ms。

此外还有4路A/D转换器,转换时间低于2.24us;2个32位定时器,6路PWM输出、RTC、看门狗和多个串
第 1 页共 7 页。

相关文档
最新文档