μCOS-II在S3C44BOX处理器上的移植_第1页
μCOS-II在S3C44BOX处理器上的移植_第2页
μCOS-II在S3C44BOX处理器上的移植_第3页
μCOS-II在S3C44BOX处理器上的移植_第4页
μCOS-II在S3C44BOX处理器上的移植_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、    C/OS-II在S3C44BOX处理器上的移植摘要:介绍实时操作系统C/OS-II的特点和内核结构,给出C/OS-II在Samsung嵌入式S3C44BOXARM7微处理器上的移植的步骤及详细相关代码,同时阐述C/OS-II在应用中应注意的问题。关键词:C/OS-IIS3C44BOX移植实时操作系统C/OS-II功能强大,支持56个用户任务,其内核为占先式,支持信号量、邮箱、消息队列等多种常用的进程间通信机制,现已成功应用到众多商业嵌入式系统中,是一个成熟稳定的实时内核。与大多商用RTOS不同的是,摘要:介绍实时操作系统C/OS-II的特点和内核

2、结构,给出C/OS-II在Samsung嵌入式S3C44BOXARM7微处理器上的移植的步骤及详细相关代码,同时阐述C/OS-II在应用中应注意的问题。    关键词:C/OS-II S3C44BOX 移植 实时操作系统C/OS-II功能强大,支持56个用户任务,其内核为占先式,支持信号量、邮箱、消息队列等多种常用的进程间通信机制,现已成功应用到众多商业嵌入式系统中,是一个成熟稳定的实时内核。与大多商用RTOS不同的是,C/OS-II公开所有的源代码,90%的代码使用标准的ANSI C语言书写,程序可读性强、移植性好;同时它可免费获得,即使商业应用也只收取

3、少量的许可费用。因此,对C/OS-II实时操作系统的学习研究、开发、应用具有重要意义。SamsungS3C44B0X微处理器是三星公司专为手持设备和其它嵌入式应用提供的高性价比的微控制器解决方案。它使用ARM公司的16位/32位RISC结构,内核是ARM7TDMI,工作在66MHz,片上集成了以下部件:8K Cache、外部存储器控制器、LCD控制器、4个DMA通道、2个UART、1个多主I2C总线控制器、1个I2C总线控制器,以及5通道PWM定时器和1个内部定时器、8通道12位ADC等,能够与常用的外围设备实现无缝连接,功能强大。目前,国内应用较为广泛。1 C/OS-II实时操作系统结构图1

4、说明了C/OS-II的软硬件体系结构。应用程序处于整个系统的顶层,每个任务都可以认为自已独占了CPU,因而可以设计成为一个无限循环。C/OS-II处理器无关的代码提供了C/OS-II的系统服务,应用程序可以使用这些API函数进行内存管理、任务间通信及创建、删除任务等。大部分的C/OS-II代码是使用ANSI C语言书写的,因此C/OS-II的可移植性好,然而仍需要使用C和汇编语言写一些处理器相关代码。C/OS-II的移植需要满足以下要求:处理器的C编译器可以产生可重入代码;可以使用C调用进入和退出临界区代码;处理器必须支持硬件中断,并且需要一个定时中断源; 处理器需要能够容纳一定数据的硬件堆栈

5、;处理器需要有能够在CPU寄存器与内核和堆栈交换数据的指令。S3C44B0X处理器完全满足上述要求。2 实时内核C/OS-II在S3C44B0X上的移植我们使用ARM SDT编译器,移植C/OS-II主要包括以下几个步骤。(1)设置OS_CPU.H中与处理器和编译器相关的代码*与编译器相关的数据类型*typedef unsigned char BOOLEAN;typedef unsigned char INT8U; /*8位无符号整数*/typedef signed char INT8S; /*8位有符号整数*/typedef unsigned short INT16U; /*16位有符号整数

6、*/typedef signed short INT16S; /*16位无符号整数*/typedef unsigned long INT32U; /*32位无符号整数*/typedef signed long INT32S; /*32位有符号整数*/typedef float FP32; /*单精度浮点数*/typedef double FP64; /*双精度浮点数*/typedef unsigned int OS_STK;/*堆栈入口宽度为16位*/与ARM处理器相关的代码:#define OS_ENTER_CRITICAL () ARMEnableInt() /*开启中断*/#define

7、 OS_STK_GROWTH 1 /*堆栈由高地址向低地址增长*/(2)用C语言编写6个操作系统相关的函数(OS_CPU_C.C)void OSTaskStkInit(void(task)(void *pd),void *pdata,void *ptos,INT16Uopt) unsigned int *stk;opt =opt; /*因“opt”变量没有用到,防止编译器产生警告*/stk =(unsigned int *)ptos; /*装载堆栈指针*/*为新任务创建上下文*/*-stk=(unsigned int)task; /*lr*/*-stk=(unsigned int)task /

8、*pc*/*-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|); /*cpsrIRQ,*-stk=(SVC32MODE|0x0); /*spsr IRQ,关闭FIQ*/retu

9、rn(void*)stk);后5个函数是钩子函数,可以不加代码:void OSTaskCreateHook(OS_TCB *ptcb)void OSTaksDelHool (OS_TCB *ptcb)void OSTaskSwHook(void)void OSTaskStatHook(void)(3)用汇编语言编写4个与处理器相关的函数(OS_CPU.ASM)OSStartHighRdy() ;运行优先级最高的就绪任务LDR r4,addr_OSTCBCur ;得到当前任务的TCB地址LDR r5,addr_OSTCBHighRdy ;得到高优先级任务的TCB地址LDR r5,addr_OST

10、CBHighRdy ;得到高优先级任务的TCB地址LDR r5,r5 ;得到堆栈指针LDR sp,r5 ;切换到新的堆栈STR r5,r4 ;设置新的当前任务的TCB地址LDMFD sp!,r4MSR CPSR_cxsf,r4LDMFD sp!,r0-r12,lr,pc ;开始新的任务ENDOSCtxsw() 任务级的任务切换函数STMFD sp!,lr ;保存PC指针STMFD sp!,lr ;保存lr指针STMFD sp!,r0-r12 ;保存寄存器文件和返回地址MRS r4,CPSRSTMFD sp!,r4 ;保存当前PSRMRS r4,SPSRSTMFD sp!,r4;OSPrioCu

11、r=OSPrioHighRdyLDR r4,addr_OSPrioCurLDR r5,addr_OSPrioHighRdyLDRB r6,r5STRB r6,r4;得到当前任务的TCB地址LDR r4,addr_OSTCBCurLDR r5,r4STR sp,r5 ;保存栈指针在占先任务的TCB上;取得高优先级任务的TCB地址LDR r6,addr_OSTCBHighRdyLDR r6,r6LDR sp,r6 ;得到新任务的堆栈指针;OSTCBCur=OSTCBHighRdySTR r6,r4;得到当前新任务的TCB地址LDMFD sp!,r4MSR SPSR_cxsf,r4LDMFD sp!

12、,r4MSR SPSR_cxsf,r4LDMFD sp!,r0-r12,lr pcOSIntCtxSw() ;中断级的任务切换函数LDMIA sp!,al-vl,lrSUBS pc,lr,#4SUB lr,lr,#4MOV r12,lrMRS lr,SPSRAND lr,lr,#0XFFFFFE0ORR lr,lr,#0XD3MSR CPSR_CXSF,lrOSTickISR() ;中断服务函数STMDB sp!,r0-r11,lrMRS r0,CPSRORR r0,r0,#0x80; ;设置中断禁止标志MSR CPSR_cxsf,r0 ;中断结束LDR r0,I_ISPCLDR r1,=BI

13、T_TIMER0STR r1,r0BL IrqStartBL osTimeTickBL IrqFinishLDR r0,=need_to_swap_contextLDR R2,R0CMP r2,#1LDREQ pc,=_CON_SW完成上述工作后,C/OS-II就可以运行在ARM处理器上了。3 使用C/OS-II系统应注意的问题C/OS-II和Linux等分时操作系统不同,不支持时间片轮转法。它是一个基于优先级的实时操作系统。每一个任务的优先级必须不同(分析它的源码会发现,C/OS-II把任务的优先级当作任务在标识来使用,如果优先级相同,任务将无法区分)。进入就绪态的优先级最高的任务首先得到C

14、PU的使用权,只有等它交出CPU的使用权后,其它任务才可以被执行。所以,它只能就是多任务,不能就是多进程,至少不是我们所熟悉的那种多进程。C/OS-II对共享资源提供了保护的机制。C/OS-II是一个支持多任务的操作系统。我们可以把一个完整的程序划分成几个任务,不同的任务执行不同的功能。对于共享资源(比如串口),C/OS-II也提供了很好的解决办法,一般情况下使用的是信号量方法。我们创建一个信号量并对它进行初始化,当一个任务需要使用一个共享资源时,它必须先申请得到这个信号量。在这个过程中即使有优先权更高的任务进入了就绪态,因为无法得到信号量,也不能使用该资源。在C/OS-II中称为优先级反转。

15、简单地说,就是高优先级任务必须等待低优先级任务的完成。在上述情况下,在两个任务之间发生优先级后转是无法避免的。所以不在使用C/OS-II时,必须对所开发的系统了解清楚才能选择对于某种共享资源是否使用信号量。C/OS-II内存管理不够完善。在分析许多C/OS-II的应用实例中发现,任务栈空间和内存分区的创建采用了定义全局数组的方法,这样实现起来固然简单,但不够灵活有效。编译器会将全局数组作为未初始化的全局变量,放到应用程序映像的数据段。数组的大小是固定的,生成映像后不可能在使用中动态地改变。对于任务栈空间来说,数组定义大了会造成内存浪费;定义小了任务栈溢出,会造成系统崩溃。对于内存分区,在不知道系统初始化后给用户留下了多少自由内存空间的情况下,很难定义内存分区所使用数组的大小

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论