基于ARM的移植_第1页
基于ARM的移植_第2页
基于ARM的移植_第3页
基于ARM的移植_第4页
基于ARM的移植_第5页
已阅读5页,还剩26页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

湖北工业大学商贸学院毕业设计I摘要随着ARM技术的广泛应用,建立基于ARM构架的嵌入式操作系统已成为当前研究的热点。本课题的研究内容就是利用移植技术将UC/OSII移植到ARM系统。将UC/OSII移植到ARM系统之后,可以充分结合两者的优势。UC/OSII的文件系统结构包括核心代码部分、设置代码部分、与处理器相关的移植代码部分。核心代码部分包括7个源代码文件和1个头文件功能分别是内核管理、事件管理、消息队列管理、存储管理、消息管理、信号量处理、任务调度和定时管理设置代码部分包括2个头文件,用来配置事件控制块的数目以及是否包含消息管理相关代码而与处理器相关的移植代码部分则是进行移植过程中需要更改的部分,包括1个头文件OSCPUH,1个汇编文件OSCPUAS和1个C代码文件实际上将UC/OSII移植到ARM处理器上,需要完成的工作主要是以下三个与体系结构相关的文件OSCPUH,OSCPUC以及OSCPUAS。关键词ARM嵌入式操作系统移植UC/OSII湖北工业大学商贸学院毕业设计IIABSTRACTALONGWITHTHEEXTENSIVEAPPLICATIONOFARMTECHNOLOGYBASEDONARMARCHITECTURE,THEEMBEDDEDOPERATINGSYSTEMHASBECOMEAHOTSPOTOFCURRENTRESEARCHESTHERESEARCHCONTENTISTHEUSEOFTRANSPLANTINGUC/OSIITRANSPLANTEDINTOARMSYSTEMUC/OSIITRANSPLANTEDINTOARMSYSTEM,CANCOMBINETHEADVANTAGESOFTHETWOUC/OSIIFILESYSTEMSTRUCTUREINCLUDESPARTOFTHECORECODE,SETTHECODEPORTION,APROCESSORASSOCIATEDWITHTRANSPLANTCODESECTIONPARTOFTHECORECODEINCLUDES7SOURCECODEFILESANDTHE1HEADERFILESFUNCTIONARECOREMANAGEMENT,EVENTMANAGEMENT,MESSAGEQUEUEMANAGEMENT,STORAGEMANAGEMENT,MESSAGEMANAGEMENT,SIGNALPROCESSING,TASKSCHEDULINGANDTIMEMANAGEMENTSETTINGCODEPORTIONINCLUDESTHEFIRST2DOCUMENTS,USEDTOCONFIGUREEVENTCONTROLBLOCKNUMBERSANDWHETHERITCONTAINSMESSAGEMANAGEMENTCODEANDAPROCESSORASSOCIATEDWITHTRANSPLANTCODEISPARTOFTHETRANSPLANTPROCESSNEEDTOCHANGEPARTS,INCLUDINGTHE1HEADERFILESOSCPUH,1OSCPUAFILESSAND1CCODEFILESTHEACTUALADMIRALUC/OSIITRANSFERREDTOTHEARMPROCESSOR,WORKTOBEFINISHEDBASICALLYISTHEFOLLOWINGTHREEARCHITECTUREDEPENDENTFILEOSCPUH,OSCPUCANDOSCPUASKEYWORDARMEMBEDDEDOPERATINGSYSTEMPORTINGUC/OSII湖北工业大学商贸学院毕业设计III目录引言11UC/OSII简介211UC/OSII的工作流程212UC/OSII的体系结构313UC/OSII工作原理42UC/OS内核调度521UC/OSII内核结构522任务控制块(OS_TCB)623就绪表(READYLIST)724任务状态825任务转换1026任务调度分析1027UC/OSII的初始化123UC/OSII的移植1331OSCPUH的移植1332OSCPUC的移植1433OSCPUAS的移植1434硬件平台154在嵌入式系统上的实现1741开/关中断的实现1742OSSTARTHIGHRDY的实现1843任务级上下文切换的实现1844中断级上下文切换的实现195多任务应用程序21结束语23参考文献24致谢25附录26湖北工业大学商贸学院毕业设计1引言在开发嵌入式系统时,一般选择基于ARM和UC/OSII的嵌入式开发平台,因为ARM微处理器具有处理速度快、超低功耗、价格低廉、应用前景广泛等优点将UC/OSII移植到ARM系统之后,可以充分结合两者的优势如果一个程序在一个环境里能工作,我们经常希望能将它移植到另一个编译系统、处理器或者操作系统上,这就是移植技术移植技术可以使一种特定的技术在更加广泛的范围使用,使软件使用更加灵活,不局限于某一条件UC/OSII是由JEANJLABROSSE先生编写的完整的可移植、固化、裁剪的占先式实时多任务内核UC/OSII的源代码完全开放,这是其他商业实时内核无法比拟的它是针对嵌入式应用设计的,在设计之初就充分考虑了可移植性,它的大部分源代码都是用高可移植性的ANSIC编写的与硬件相关部分用汇编语言编写,使之可供不同构架的微处理器使用。只要有标准的ANSIC交叉编译器,有汇编器、链接器等软件工具,就可以将C/OSII嵌入到开发的产品中。UC/OSII可以移植到从8位到64位的不同类型、不同规模的嵌入式系统,并能在大部分的8位、16位、32位、甚至64位的微处理器和DSP上运行由于UC/OSII是一个实时操作系统,所以如果将它嵌入到ARM处理器上,就能够进一步简化ARM系统的开发。UC/OSII是面向中小型嵌入式系统,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,包含全部功能模块的内核大约为10KB。如果经过裁减只保留核心代码,则可压缩到3KB左右。严格地说,UC/OSII只是一个实时操作系统内核,它仅仅包含了任务调度、任务管理、时间管理、内存管理和任务间的通信和同步等基本功能,没有提供输入输出管理、文件系统、网络等额外的服务。嵌入式技术发展至今已经进入到了嵌入式INTERNET的阶段,越来越多的嵌入式设备实现了通过以太网技术接入互联网。将嵌入式设备接入以太网的关键是在嵌入式设备上实现嵌入式TCP/IP协议。相比普通的TCP/IP协议,嵌入式TCP/IP协议具有代码精简、很好的可裁减性和很强的移植性等特点。嵌入式系统是先进的计算机技术、半导体技术、电子技术、和各个行业的具体应用相结合的产物,它是以计算机应用为中心、以计算机技术为基础,软硬件可裁减的专用计算机系统。在嵌入式系统中使用操作系统(嵌入式操作系统)已是大势所趋,目前嵌入式操作系统的种类繁多,但UC/OSII以其源代码开放、价格便宜、可移植性强等特点,被广泛使用。湖北工业大学商贸学院毕业设计21UC/OSII简介C/OSII是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。C/OSII的前身是C/OS,最早出自于1992年美国嵌入式系统专家JEANJLABROSSE在嵌入式系统编程杂志的5月和6月刊上刊登的文章连载,并把C/OS的源码发布在该杂志的BBS上。C/OS和C/OSII是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU上。用户只要有标准的ANSI的C交叉编译器,有汇编器、连接器等软件工具,就可以将C/OSII嵌入到开发的产品中。C/OSII具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB。C/OSII已经移植到了几乎所有知名的CPU上。严格地说UC/OSII只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于UC/OSII良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。UC/OSII目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。11UC/OSII的工作流程UC/OSII的工作流程如图11所示首先进行操作系统初始化,主要完成任务控制块TCB初始化然后就可以开始创建新任务、初始化任务堆栈区最后调用OSSTART函数,启动多任务调度。在多任务调度开始后,启动时钟节拍源开始计时。此节拍源为系统提供周期性的时钟中断信号、实现延时和超时确认。当时钟中断来临时,系统把当前正在执行的任务挂起,保护现场,进行中断处理,判断有无任务延时到期。若有,则使该任务进入就绪态,并对所有进入就绪态的任务的优先级进行比较,通过任务切换去执行最高优先级的任务。若没有别的任务进入就绪态,则恢复现场继续执行原任务。另一种调度方式是任务级的调度,即通过发软中断命令或依靠处理器在任务执行中调度。如任务要等待信号量或一个正在执行的任务被挂起时,就需要在此湖北工业大学商贸学院毕业设计3任务中调度,找出目前处于就绪态的优先级最高的任务去执行。当没有任何任务进入就绪态时,就去执行空任务。图11UC/OSII的工作流程图12UC/OSII的体系结构对UC/OSII的移植实际上就是对与处理器有关的代码进行重写或修改。移植工作包括以下几部分内容用DEFINE设置1个常量的值OS_CPUH文件中声明10个数据类型OS_CPUH文件中用DEFINE声明3个宏OS_CPUH文件中用C语言编写6个简单的函数OS_CPUC文件中编写4个汇编语言函数OS_CPUASM文件中。虽然UC/OSII的大部分代码是用C语言编写但还存在一些与处理器相关的汇编语言代码,从而实现对处理器寄存器的访问以及堆栈的操作。UC/OSII操作系统的移植主要是对OS_CPUH,OS_CPUASM,OS_CPUC等3个源程序的编写。OS_CPUH中包括了用DEFINE定义的与处理器相关的常量和类型定义,与UC/OSII所定义的变量类型相一致定义允许和禁止中断宏OS_ENTER_CRITICAL和OS_EXIT_CRITICAL来保护临界段代码免受多任务或中断服务例程的破坏。定义栈的增长方向,GCC的C语言编译器仅支持从上往下增长,并且必须是满递减堆栈,OS_STK_GROWTH的值定义为1。OS_CPUASM中要求编写4个简单的汇编函数1OSSTARTHIGHRDY作用是运行最高优先级的就绪任务。2OSCTXSW是实现CPU在正常运行时任务间的切换,即对当前任务堆栈的保存和对高优先级任务堆栈的弹出,使最高优先级任务获取CPU的控制权。3OSINTCTXSW是在中断服务程序中执行任务切换。4OSTICKISR是系统时钟的中断服务程序,该程序执行频率为10100HZ,主要功能是检查是否有由于延时而被挂起的任务成为就绪任务。如果有,就调用湖北工业大学商贸学院毕业设计4OSINTCTXSW进行任务切换,从而运行高优先级的任务因为UC/OSII在每一个节拍都要检查有没有更高优先级的任务在等待执行,若有,就要进行任务切换。所以,时钟节拍率越高,系统的额外负荷就越重OS_CPUC中要求编写6个与操作系统相关的函数OSTASKSTKINIT,OSTASKCREATEHOOK,OSTASKDELHOOK,OSTASKSTATHOOK及OSTMIETICKHOOK。其中,唯一必须移植的是任务堆栈初始化函OSTASKSTKINIT,这个函数在任务创建时被调用,负责初始化任务的堆栈结构并返回新堆栈的指针。13UC/OSII工作原理UC/OSII是一种基于优先级的可抢先的硬实时内核。在UC/OSII里,每个任务都有一个任务控制块TASKCONTROLBLOCK,这是一个比较复杂的数据结构。在任务控制块的偏移为0的地方,存储着一个指针,它记录了所属任务的专用堆栈地址。在UC/OSII内,每个任务都有自己的专用堆栈,彼此之间不能侵犯。这点要求程序员再他们的程序中保证。一般的做法是把他们申明成静态数组。而且要申明成OS_STK类型。当任务有了自己的堆栈,那么就可以将每一个任务堆栈在那里记录到前面谈到的任务控制快偏移为0的地方。以后每当发生任务切换,系统必然会先进入一个中断,这一般是通过软中断或者时钟中断实现。然后系统会先把当前任务的堆栈地址保存起来,仅接着恢复要切换的任务的堆栈地址。由于哪个任务的堆栈里一定也存的是地址(还记得我们前面说过的,每当发生任务切换,系统必然会先进入一个中断,而一旦中断CPU就会把地址压入堆栈),这样,就达到了修改PC为下一个任务的地址的目的。湖北工业大学商贸学院毕业设计52UC/OS内核调度在多任务系统中,内核是负责管理各个任务,或者说是为每个任务分配CPU时间,同时负责任务之间的通讯。内核所提供的基本服务是任务切换。之所以使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理它们。内核本身也增加了应用程序的额外负荷,代码空间增加ROM的用量,内核本身的数据结构增加了RAM的用量。但更主要的是,每个任务要有自己的栈空间,这一块吃起内存来是相当厉害的。内核本身对CPU的占用时间一般在2到5个百分点之间。UC/OSII内核调度特点1只支持基于优先级的抢占式调度算法,不支持时间片轮训;264个优先级,只能创建64个任务,用户只能创建56个任务;3每个任务优先级都不相同;4不支持优先级逆转;5READY队列通过内存映射表实现快速查询。效率非常高;6支持时钟节拍;7支持信号量,消息队列,事件控制块,事件标志组,消息邮箱任务通讯机制;8支持中断嵌套,中断嵌套层数可达255层,中断使用当前任务的堆栈保存上下文;9每个任务有自己的堆栈,堆栈大小用户自己设定;10支持动态修改任务优先级;11任务TCB为静态数组,建立任务只是从中获得一个TCB,不用动态分配,释放内存;12任务堆栈为用户静态或者动态创建,在任务创建外完成,任务创建本身不进行动态内存分配;13任务的总个数(OS_MAX_TASKS)由用户决定;140优先级最高,63优先级最低;15有一个优先级最低的空闲任务,在没有用户任务运行的时候运行。21UC/OSII内核结构1、UC/OSII是以源代码形式提供的实时操作系统内核,其包含的文件结构如下基于UC/OSII操作系统进行应用系统时,设计任务的主要任务是将系统合理划分成湖北工业大学商贸学院毕业设计6多个任务,并由RTOS进行调度,任务之间使用UC/OSII提供的系统服务进行通信,以配合实现应用系统的功能。上图中应用代码部分主要是设计人员设计的业务代码。基于UC/OSII操作系统进行应用系统时,设计任务的主要任务是将系统合理划分成多个任务,并由RTOS进行调度,任务之间使用UC/OSII提供的系统服务进行通信,以配合实现应用系统的功能。上图中应用代码部分主要是设计人员设计的业务代码。与前后台系统一样,基于UC/OSII的多任务系统也有一个MAIN主函数,MAIN函数由编译器所带的C启动程序调用。在MAIN主函数中主要实现UC/OSII的初始化OSINIT、任务创建、一些任务通信方法的创建、UC/OSII的多任务启动OSSTART等常规操作。另外,还有一些应用程序相关的初始化操作,例如硬件初始化、数据结构初始化等。在使用UC/OSII提供的任何功能之前,必须先调用OSINIT函数进行初始化。在MAIN主函数中调用OSSTART启动多任务之前,至少要先建立一个任务。否则应用程序会崩溃。OSINIT初始化UC/OSII所有的变量和数据结构,并建立空闲任务OS_TASKIDLE,这个任务总是处于就绪态。22任务控制块(OS_TCB)任务控制块(TCB)是一个数据结构OS_TCB,一旦一个任务创建,就有一个和它关联应用软件(用户代码)UC/OSII内核文件与处理器类型无关的代码OS_CORECOS_TASKCOS_FLAGCOS_TIMECOS_MBOXCUCOSIICOS_MEMCUCOSIIHOS_MUTEXCOS_SEMCOS_QCUC/OSII配置文件与应用程序有关OS_CFGHINCLUDESH移植UC/OSII(与处理器类型有关的代码)OS_CPUHOS_CPU_CCOS_CPU_AASMCPU定时器图21UC/OSII的文件结构软件硬件湖北工业大学商贸学院毕业设计7的TCB被赋值。当任务的CPU使用权被剥夺时,它用来保存该任务的状态。这样,当任务重新获得CPU使用权时,可以从TCB中获取任务切换前的信息,准确的继续运行。任务控制块包含了许多任务信息,主要有OSTCBSTKPTR指向当前任务堆栈栈顶的指针。UC/OSII允许每个任务有自己的堆栈,每个任务堆栈的大小可以不一样。OSTCBNEXT和OSTCBPREV指向OS_TCB双向链表的前、后连接。OSTCBEVENTPTR指向事件控制块的指针;OSTCBDLY保存任务的延时节拍数,或允许等待事件发生的最多节拍数。OSTCBPRIO任务的优先级;文件OS_CFGH中定义的最多任务数OS_MAX_TASKS决定了分配给用户程序的任务控制块的数目。所有的任务控制块都放在任务控制块数组OSTCBTBL中。UC/OSII初始化时,所有OS_TCB都被链接成单向空任务链表。任务一旦建立,就将链表开头的OS_TCB赋给该任务。一旦任务被删除,OS_TCB就还给空任务链表。任务建立时,函数OS_TCBINIT初始化任务控制块。23就绪表(READYLIST)UC/OSII采用内存映射的方式来实现READY队列的加入,查找,删除功能,效率非常高。但是也因此只能支持64个任务,每个任务都有自己的优先级,不能和其他任务优先级向同。每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRDYGRP和OSRDYTBL在OSRDYGRP中,任务按优先级分组,8个任务为一组。OSRDYGRP中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRDYTBL中的相应元素的相应位也置位。就绪表OSRDYTBL数组的大小取决于OS_LOWEST_PRIO(见文件OS_CFGH)。为确定下次该哪个优先级的任务运行了,内核调度器总是将OS_LOWEST_PRIO在就绪表中相应字节的相应位置是按以下规则给出的当OSRDYTBLI中的任何一位是1时,OSRDYGRP的第I位置1I从0到7使任务进入就绪态OSRDYGRP|OSMAPTBLPRIO3OSRDYTBLPRIO3|OSMAPTBLPRIO湖北工业大学商贸学院毕业设计8任务优先级的低三位用于确定任务在总就绪表OSRDYTBL中的所在位。接下去的三位用于确定是在OSRDYTBL数组的第几个元素。OSMAPTBL是在ROM中的(见文件OS_COREC)屏蔽字,用于限制OSRDYTBL数组的元素下标在0到7之间,如果一个任务被删除了,则用程序清单36中的代码做求反处理。程序清单L36从就绪表中删除一个任务IF(OSRDYTBLPRIO3以上代码将就绪任务表数组OSRDYTBL中相应元素的相应位清零,而对于OSRDYGRP,只有当被删除任务所在任务组中全组任务一个都没有进入就绪态时,才将相应位清零。也就是说OSRDYTBLPRIO3所有的位都是零时,OSRDYGRP的相应位才清零。为了找到那个进入就绪态的优先级最高的任务,并不需要从OSRDYTBL0开始扫描整个就绪任务表,只需要查另外一张表,即优先级判定表OSUNMAPTBL。OSRDYTBL中每个字节的8位代表这一组的8个任务哪些进入就绪态了,低位的优先级高于高位。利用这个字节为下标来查OSUNMAPTBL这张表,返回的字节就是该组任务中就绪态任务中优先级最高的那个任务所在的位置。这个返回值在0到7之间。确定进入就绪态的优先级最高的任务是用以下代码完成的。找出进入就绪态的优先级最高的任务YOSUNMAPTBLOSRDYGRPXOSUNMAPTBLOSRDYTBLYPRIO(Y图32堆栈增长方向32OSCPUC的移植OSCPUC的移植包括任务堆栈初始化和相应函数的实现在这里,共有6个函数OSTASKSTKINIT,OSSTASKCREATEHOOK,OSTASKDELHOOK,OS2TASKSWHOOK,OSTASKSTATHOOK,OSTIMETICKHOOK其中后面的5个HOOK函数又称为钩子函数,主要是用来对UC/OSII进行功能扩展这些函数为用户定义函数,由操作系统调用相应的HOOK函数去执行,在一般情况下,他们都没有代码,所以实现为空函数即可而函数OSTASKSTKINIT对堆栈进行初始化,在ARM系统中,任务堆栈空间由高到低为PC,LR,R12,R11,R1,R0,CPSR,SPSR在进行堆栈初始化以后,OSTASKSTKINIT返回新的堆栈栈顶指针33OSCPUAS的移植OSCPUAS文件的移植需要对处理器的寄存器进行操作,所以必须用汇编语言来编写这个文件的实现集中体现了所要移植到处理器的体系结构和UC/OSII的移植原理它包括4个子函数OSSTARTHIGHRDY,OSCTXSW,OSINTCTXSW,OSTICK2ISR其中难点在于OSINTCTXSW和OSTICKISR函数的实现,因为这两个函数的实现与移植者湖北工业大学商贸学院毕业设计15的移植思路以及相关硬件定时器、中断寄存器的设置有关在实际的移植工作中,这两处也是比较容易出错的地方OSINTCTXSW函数由OSINTEXIT函数调用,而OSINTEXIT函数又由OSTICKISR调用OSINTCTXSW函数最重要的作用就是它完成在中断ISR中直接进行任务切换,从而提高了实时响应的速度它发生的时机是在ISR执行到OSINTEXIT时,如果发现有高优先级的任务因为等待TIMETICK的到来获得了执行等UC/OSII在ARM系统上的移植与实现的条件,就可以马上被调度执行,而不用返回被中断的那个任务之后再进行任务切换实现OSINTCTXSW的方法大致也有两种情况一是通过调整SP堆栈指针的方法,根据所用的编译器对于函数嵌套的处理,通过精确计算出所需要调整的SP位置来使得进入中断时所作的保护现场的工作可以被重用二是设置需要切换标志位的方法,在OSINTCTXSW里面不发生切换,而是设置一个需要切换的标志,等函数嵌套从进入OSINTEXITOSENTERCRITI2CALOSINTCTXSWOSEXITCRITICALOSINTEXIT退出后,再根据标志位来判断是否需要进行中断级的任务切换其次是对OSTICKISR修改OSTICKISR首先在被中断任务堆栈中保存CPU寄存器的值,然后调OSINTENTER随后调用OSTIMETICK,检查所有处于延时等待状态的任务,判断是否有延时结束就绪的任务最后调用OSINTEXIT如果在中断中或其他嵌套的中断有更高优先级的任务就绪,并且当前中断为中断嵌套的最后一层,OSINTEXIT将进行任务调度如果进行了任务调度,OSINTEXIT将不再返回调用者,而是用新任务的堆栈中的寄存器数值恢复CPU现场,然后实现任务切换如果当前中断不是中断嵌套的最后一层,或中断中没有改变任务的就绪状态,OSINTEXIT将返回调用者OSTICKISR,OSTICKISR返回被中断的任务最后就是退出临界区和进入临界区函数进入临界区时,必须关闭中断,ARMDISABLEINT函数实现在退出临界区的时候恢复原来的中断状态,通过ARMENABLEINT函数来实现至于进行任务级上下文切换,则是由汇编子程序OSCTXSW实现34硬件平台研发人员在构建系统选择硬件时,当缺乏完整或精确的信息时,就成为复杂且困难的工作。硬件成本是一个主要考虑的内容。当考虑成本时,我们需要考虑产品的整个成本,而不仅是CPU的成本。因为好的CPU一旦加上总线逻辑和延时电路,并使之与外设一起工作,那么这个硬件系统可能会变成非常昂贵的产品。如果你正在寻找嵌入式软件湖北工业大学商贸学院毕业设计16系统,那么应首先确定硬件平台,即确定微处理器CPU的型号。AT89S51是一个低功耗,高性能CMOS8位单片机,片内含4KBYTESISPINSYSTEMPROGRAMMABLE的可反复擦写1000次的FLASH只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFLASH存储单元,AT89S51在众多嵌入式控制应用系统中得到广泛应用。主要性能特点有1、4KBYTESFLASH片内程序存储器;2、128BYTES的随机存取数据存储器(RAM);3、32个外部双向输入/输出(I/O)口;4、5个中断优先级、2层中断嵌套中断;5、6个中断源;6、2个16位可编程定时器/计数器;7、2个全双工串行通信口;8、看门狗(WDT)电路;9、片内振荡器和时钟电路;10、与MCS51兼容;11、全静态工作0HZ33MHZ;12、三级程序存储器保密锁定;13、可编程串行通道;14、低功耗的闲置和掉电模式。图33PDIP封装的AT89S51管脚图湖北工业大学商贸学院毕业设计174在嵌入式系统上的实现C/OSII的移植条件是只要该处理器有堆栈,有CPU内部寄存器入栈、出栈指令;使用的C编译器支持内嵌汇编(INLINEASSEMBLY)或者该C语言可扩展,可连接汇编模块,使得关中断、开中断能在C语言程序中实现。MC9328MX1符合其移植条件。UC/OSII的移植集中在3个文件,OS_CPUH,OS_CUP_AS,OS_CPU_CC。其中OS_CPUH主要包含编译器相关的数据类型的定义、堆栈类型的定义以及几个宏定义和函数说明。而OS_CPU_CC中则包含与移植有关的C函数,包括堆栈的初始化函数和一些钩子(HOOK)函数的实现。OS_CPU_AS中则包含与移植有关的汇编语言函数,包括开/关中断、上下文切换、时钟中断服务程序等。移植中关键的功能模块实现如下文所述。41开/关中断的实现UC/OSII和其它所有的实时内核一样,在访问操作系统的临界区之前必须关闭中断,访问之后开中断。这可以保证UC/OSII的临界区代码不会被多个任务或中断服务程序同时访问,避免造成共享数据(UC/OSII的全局变量)的不一致性。开/关中断有3种实现方法,最简单的方法是仅用该内核提供的关中断指令实现宏ENTER_CRITICAL_SECTION,仅用开中断指令实现宏EXIT_CRITICAL_SECTION。这种方法可以减少中断延迟时间,但它可能存在一点小问题,就是如果程序在调用ENTER_CRITICAL_SECTION之前,中断已经被禁止,那么在调用EXIT_CRITICAL_SECTOIN之后,中断被允许,这可能不是程序所期望的。这种简单的实现方法对某些情况不适用。在大部分情况下,第1种实现方法可以满足应用的要求,用以下的汇编子程序可以实现关中断ENTERCRITICALSTMFDSP,R0,LRMRSR0,CPSRORRR0,R0,I_BITORF_BITMSRCPSR_C,R0LDMFDSP,R0,PC用类似的方法可以实现开中断。湖北工业大学商贸学院毕业设计1842OSSTARTHIGHRDY的实现操作系统初始化后,开始执行系统内第1个最高优先级的任务。对于第1个执行的任务,不需要进行上下文保存,只需恢复任务上下文即可。第1个任务的执行是通过调用汇编子程序OSSTARTHIGHRD实现的。此子程序首先调用钩子函数OSTASKSWHOOK,完成用户扩展的操作系统功能,然后将OSRUNNING的值置为真,表示开始任务的执行,从而保证任务切换操作的正确执行。紧接着从具有最高优先级的任务控制块中取得任务的堆栈指针,初始化堆栈指针寄存器SP。然后恢复CPSR,恢复其它的寄存器,开始执行最高优先级的任务。程序如下OSSTARTHIGHRDYCALLOSTASKSWHOOKBLOSTASKSWHOOKSETOSRUNNINGTOTRUEMOVR0,1LDRR1,OSRUNNINGSTRBR0,R1GETSTACKPTRFORTASKTORESUMELDRR1,OSTCBHIGHRDYLDRR1,R1LDRSP,R1,0OSTCBSTKPTRISAT0RESTORESAVEDCONTEXTSAVECURRENTTASKCONTEXTSTMFDSP,R14SAVETASKPCSTMFDSP,R0R12,R14SAVELRANDOTHERREGISTERS湖北工业大学商贸学院毕业设计19MRSR0,CPSRSAVECURRENTCPSRSTMFDSP,R0CMNCTXSWSTORESTACKPTROFTASKLIVESINOSTCBCUROSTCBSTKPTRLDRR1,OSTCBCURLDRR1,R1STRSP,R1,0OSTCBSTKPTRISAT0CALLUSERDEFINABLEOSTASKSWHOOKBLOSTASKSWHOOKSETCURRENTTASKTONEWTASKLDRR2,OSTCBHIGHRDYLDRR3,OSTCBCURLDRR4,OSPRIOHIGHRDYLDRR5,OSPRIOCURLDRR0,R2LDRBR1,R4STRR0,R3STRBR1,R5GETSTACKPTRFORTASKTORESUMELIVESINOSTCBHIGHRDYOSTCBSTKPTRLDRSP,R0,0OSTCBSTKPTRISAT0RESTORESAVEDCONTEXTSWITCHTOIRQMODEWITHIRQDISABLEDADDSP,SP,415ADJUSTSTACKPOINTEROFIRQMODEMOVR12,SPSAVETHESPTOTRANSFERITTOSYSMODEMSRCPSR_C,ARM_MODE_SYSORI_BITSWITCHTOSYSMODEWITHIRQDISABLEDADDSP,SP,8ADJUSTSTACKBECAUSEOFSTACKINGOFOSINTEXITLDMFDSP,R14POPLR_SYSLDMDBR12,R0R12CONTAINSTHEINITIALADDRESSOFSYSTEMMODESTMFDSP,R0STORERETURNADDRESSPCSTMFDSP,R14STORELR_SYSMOVR14,R12TRANSFERSTACKPOINTEROFIRQLDMDBR14,R0R12STMFDSP,R0R12STORER0R12LDMDBR14,R0STMFDSP,R0STORESPSRBCMNCTXSW湖北工业大学商贸学院毕业设计215多任务应用程序实时多任务操作系统RTOS是嵌入式应用软件的基础和开发平台。目前在中国大多数嵌入式软件开发还是基于处理器直接编写,没有采用商品化的RTOS,不能将系统软件和应用软件分开处理。RTOS是一段嵌入在目标代码中的软件,用户的其它应用程序都建立在RTOS之上。不但如此,RTOS还是一个可靠性和可信性很高的实时内核,将CPU时间、中断、I/O、定时器等资源都包装起来,留给用户一个标准的API,并根据各个任务的优先级,合理地在不同任务之间分配CPU时间。RTOS是针对不同处理器优化设计的高效率实时多任务内核,优秀商品化的RTOS可以面对几十个系列的嵌入式处理器MPU、MCU、DSP、SOC等提供类同的API接口,这是RTOS基于设备独立的应用程序开发基础。因此基于RTOS上的C语言程序具有极大的可移植性。据专家测算,优秀RTOS上跨处理器平台的程序移植只需要修改15的内容。在RTOS基础上可以编写出各种硬件驱动程序、专家库函数、行业库函数、产品库函数,和通用性的应用程序一起,可以作为产品销售,促进行业内的知识产权交流,因此RTOS又是一个软件开发平台。RTOS是嵌入式系统的软件开发平台RTOS最关键的部分是实时多任务内核,它的基本功能包括任务管理、定时器管理、存储器管理、资源管理、事件管理、系统管理、消息管理、队列管理、旗语管理等,这些管理功能是通过内核服务函数形式交给用户调用的,也就是RTOS的API。RTOS的引入,解决了嵌入式软件开发标准化的难题。随着嵌入式系统中软件比重不断上升、应用程序越来越大,对开发人员、应用程序接口、程序档案的组织管理成为一个大的课题。引入RTOS相当于引入了一种新的管理模式,对于开发单位和开发人员都是一个提高。基于RTOS开发出的程序,具有较高的可移植性,实现90以上设备独立,一些成熟的通用程序可以作为专家库函数产品推向社会。嵌入式软件的函数化、产品化能够促进行业交流以及社会分工专业化,减少重复劳动,提高知识创新的效率。我们以跑马灯和数码管这两种方式组合一起工作为例,说明UC/OSII的移植过程假定跑马灯是8个小灯轮流变明变暗,很方便看出效果跑马灯在日常中使用很多,比如状态栏跑马灯、文字跑马灯、图片跑马灯、单片机跑马灯等本文采用的是单片机跑马灯在实现单片机跑马灯的程序中,只有地址口为低电平接地时,发光管才会亮所以只要循环控制地址口的各个引脚的电平高低变化就可使LED循环点亮首先是全不亮,接着跑湖北工业大学商贸学院毕业设计22马灯按从左到右,从右到左,从两边到中间,从中间到两边将依次运行。设定使用共阳极LED数码管来实现在数码管上循环显示09每个显示位的段选线与一个8位并行口线对应相连,只要在显示位上的段选线上保持段码电平不变,则该位就能保持相应的显示字符这里的8位并行口可以直接采用并行I/O口,也可以采用串入/并出的移位寄存器或是其他具有三态功能的锁存器等当采用动态显示接口时,在多位LED显示时,为了简化电路,降低成本,将所有位的段选线并联在一起,由一个8位I/O口控制而共阴或共阳极公共端分别由相应的I/O线控制,实现各位的分时选通由于各个数码管是共用同一个段码输出口分时轮流通电的,从而大大简化了硬件线路,降低了成本对于数码管的实现分为3个步骤1制作LED字符与码段对应表2扫描控制3U830X020000060X3E/3使能第一个数码管3/3段码输出U830X02000004SEG7TABLE0图51跑马灯流程图湖北工业大学商贸学院毕业设计23结束语本程序运行效果本程序运行后,可以看到跑马灯按,从左到右,从右到左,从两边到中间,从中间到两边将依次运行。并且在运行过程中,可以看到数码管依次从1901的顺序显示数字符号。本程序主要是将数码管及跑马灯放在一起显示,它主要说明了,如何将在单系中运行多个看似并行运行的子系统本程序在此将跑马灯子程序放入到一个头文件中,对于一个大的工程这样将有益于程序文件的管理。UC/OSII的移植可以利用任务的共同特征进行适当的任务合并,可以简化系统任务模型、减小系统复杂度、消除某些任务的切换开销从而减少系统总体开销。任务合并可分为根据时间一致合并,将同一事件激活的优先级相同的函数合并在1个任务中;根据控制一致合并,根据函数一致合并,将几个使用相同数据的函数合并,使原来共享的数据成为任务内的局部数据,从而减少互斥。目前有许多厂商提供面向嵌入式应用领域的实时操作系统,提供实时内核、输入/输出管理器、窗口系统、文件系统、网络、语言接口库、调试器和交叉平台编译器的软件包。从中可以看到,采用正确的开发方法,可以增加嵌入式实时多任务系统的功能,降低开发方法,可以增加嵌入式实时多任务系统的功能,降低开发难度。湖北工业大学商贸学院毕业设计24参考文献1雷必成,吴高标,吴永良嵌入式实时操作系统UC/OSII的移植探讨J自动化技术与应用,20032邵贝贝嵌入式实时操作系统UC/OSIIM第2版北京航空航天大学出版社,20033叶丰桥,黄海UC/OSII在51XA上的移植应用J工业控制计算机,20024田泽嵌入式开发与应用实验教程M北京航空航天大学出版社,20045陈赜ARM嵌入式技术实践教程M北京航空航天大学出版社,20056王田苗嵌入式系统设计与实例开发M清华大学出版社,20037曾鸣UC/OSII实时操作系统在嵌入式平台上进行移植的一般方法和技巧J今日电子,20048李驹光、聂雪媛、江泽明等ARM应用系统开发详解基于S3C4510B的系统设计M清华大学出版社,20039胥静嵌入式系统设计与开发实例详解M北京北京航空航天大学出版社,200510JEANLABROSSE嵌入式实时操作系统UC/OSIIMCMPBOOKS,2006湖北工业大学商贸学院毕业设计25致谢四年的大学生涯在这个季节即将划上一个句号,而我将面对又一次征程的开始。四年的求学道路在师长、

温馨提示

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

评论

0/150

提交评论