课程设计--树型控件的编程使用.doc_第1页
课程设计--树型控件的编程使用.doc_第2页
课程设计--树型控件的编程使用.doc_第3页
课程设计--树型控件的编程使用.doc_第4页
课程设计--树型控件的编程使用.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

沈 阳 工 程 学 院课 程 设 计课程设计题目:树型控件的编程使用 系 别 信息工程系 班级 系统本112 学生姓名 杨星华 学号 2011415204 指导教师 曲乐声,踪念品 职称 讲师,工程师 起止日期:2013 年12月30日起至 2014 年1月3日止沈 阳 工 程 学 院课程设计任务书课程设计题目: 树型控件的编程使用 系 别 信息系 班级 系统本112 学生姓名 杨星华 学号 2011415204 指导教师 曲乐声 ,踪念品 职称 讲师,工程师 课程设计进行地点: 嵌入式系统实验室(F104) 任 务 下 达 时 间:2013 年12 月23日起止日期:2013年12月30日起至2014年1月3日止教研室主任 杨弘平 2013年12月20日批准一、 设计目的Windows CE应用系统项目开发课程设计是实践性教学环节之一,是Windows CE应用系统开发课程的辅助教学过程,是计算机科学与技术专业的必修课。通过课程设计,结合实际的操作和设计,巩固课堂教学内容,使学生掌握Windows CE应用系统开发的基本概念、原理和技术,将理论与实际相结合,应用现有的硬件和软件条件完成一个完整的嵌入式系统的设计与实现,把理论课与实验课所学内容综合为一,并在此基础上强化学生的实践意识、提高其实际动手能力和创新能力,从而为后续课程的学习,毕业设计环节以及将来的实际工作打好坚实的基础。二、 课程设计的原始资料及依据查阅WINDOWS CE系统的教材、参考资料等,进一步深入了解与题目相关的WINDOWS CE系统的基本原理,系统架构,掌握开发环境和硬件芯片的基本特性,研究开发实例,实现课题要求的内容。三、 课程设计主要内容及要求设计内容:内容:嵌入式WINCE树型控件编程使用,用EVC开发实现。设计要求:(1) 熟悉开发板系统及开发程序;(2) 设计开发WindowsCE系统的图形界面;(3) 用树型控件表示中国及其几个省份的架构。 四、对课程设计说明书撰写内容、格式、字数的要求1课程设计说明书是体现和总结课程设计成果的载体,主要内容包括:设计题目、设计目的、设备器材、设计原理及内容、设计步骤、遇到的问题及解决方法、设计总结、参考文献等。一般不应少于3000字。2在适当位置配合相应的实验原理图、功能模块图、算法流程图等图表进行说明。应做到文理通顺,内容正确完整,书写工整,装订整齐。3设计总结部分主要写本人完成工作简介以及自己的设计体会,包括通过课程设计学到了什么,哪里遇到了困难,解决的办法以及今后的目标。4课程设计说明书手写或打印均可。手写要用学校统一的课程设计用纸,用黑或蓝黑墨水工整书写;打印时采用A4纸,页边距均为20mm,正文采用宋体小四号字,行间距18磅。文中大标题采用黑体小三号字,一级节标题采用黑体四号字,二级节标题采用黑体小四号字,表题与图题采用宋体五号字。5课程设计说明书装订顺序为:封面、任务书、成绩评定表、目录、正文、参考文献。五、设计完成后应提交成果的种类、数量、质量等方面的要求1提交课程设计说明书一份。2提交设计原理、设计图纸或图表(如接口电路原理图等)。3作品的使用或操作说明六、时间进度安排顺序阶段日期计 划 完 成 内 容备注11天系统分析、总体设计21天建立软硬件开发环境31天软件编码调试41天硬件及软件调试、51天答辩、撰写课程、提交课程设计报告5天七、主要参考资料(文献)1 C程序设计.北京:清华大学出版社,谭浩强.2005.2 Windows CE嵌入式系统 北京航空航天大学出版社 何宗键;3 Windows Embedded CE 6.0 程序设计实践 机械工业出版社 姜波;4 JeanJ Labrosse.嵌入式实时操作系统C/OS-II.北京.北京航空航天大学出版社,2003.5 Norman Matloff等.软件调试的艺术.北京:人民邮电出版社,2010.沈 阳 工 程 学 院WindowsCE 课程设计成绩评定表系(部): 信息工程系 班级: 系统本112 学生姓名: 杨星华 指 导 教 师 评 审 意 见评价内容具 体 要 求权重评 分加权分调研论证能独立查阅文献,收集资料;能制定课程设计方案和日程安排。0.15432工作能力态度工作态度认真,遵守纪律,出勤情况是否良好,能够独立完成设计工作, 0.25432工作量按期圆满完成规定的设计任务,工作量饱满,难度适宜。0.25432说明书的质量说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。0.55432指导教师评审成绩(加权分合计乘以12) 分加权分合计指 导 教 师 签 名: 年 月 日评 阅 教 师 评 审 意 见评价内容具 体 要 求权重评 分加权分查阅文献查阅文献有一定广泛性;有综合归纳资料的能力0.25432工作量工作量饱满,难度适中。0.55432说明书的质量说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。0.35432评阅教师评审成绩(加权分合计乘以8)分加权分合计评 阅 教 师 签 名: 年 月 日课 程 设 计 总 评 成 绩分沈阳工程学院课程设计报告 摘 要摘 要树形控件是一种可以分级显示项目列表的窗口,其所含项目以相互关联的方式显示在控件中,通过点击位于某个层次的项目节点可以展开下一层次中从属于该节点的所有项目。树形控件非常适合于管理那些层次较多且相互间隶属关系较为清晰的项目元素。本文主要研究嵌入式WINCE树型控件的编程使用,且用EVC开发实现。关键词 嵌入式系统;EVC;树型控件 I沈阳工程学院课程设计报告 目 录目 录摘 要I第一章绪 论11.1 设计题目11.2 设计目的11.3 设计器材11.4 任务分析1第二章 设计原理22.1 嵌入式操作系统的概述22.1.1 嵌入式操作系统的特性22.1.2 嵌入式操作系统的分类22.1.3 嵌入式操作系统的特点22.2 设计原理32.2.1C/OS-II操作系统32.2.2C/OS-II开发分析3第三章 系统设计53.1 系统需求分析53.1.1 课程设计内容53.1.2 课程设计要求53.2 硬件设计53.2.1 ARM处理器53.2.2 ARM硬件结构63.3 软件设计93.3.1任务运行93.3.2任务通信103.3.3内存动态分配11第四章 C/OS-II在ARM9上的移植124.1 与CPU有关的文件124.2 移植代码实现15第五章 系统调试245.1 整个测试程序的效果图245.2 测试程序的功能24结 论25致 谢26参考文献2713沈阳工程学院课程设计报告 第二章 设计原理 第一章 绪 论1.1 设计题目 树型控件的编程使用1.2 设计目的1、本次课程设计的主要目的是掌握树型控件的编程使用,充分调动学生的积极性和创造性,重视学生实际动手能力的培养; 2、了解并掌握掌握相关专业课程知识和设计能力;3、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4、加深对专业课的理解,强化学生的逻辑思维能力和动手能力,巩固良好的编程习惯,掌握工程软件设计的基本方法,为将来工作的学习打下坚实基础。1.3 设计器材本课程设计需要的设备为硬件要求和软件配置要求具体要求如下: 硬件要求:一台计算机。 软件配置:windows XP、EVC。1.4 任务分析第二章 设计原理2.1 嵌入式操作系统的概述嵌入式系统是集成电路发展过程中的一个标志性成果,它把计算机直接嵌入到应用系统中,融合了计算机软/硬件技术、通信技术和微电子技术,是一种微电子产业和信息技术产业的最终产品。微电子产业是许多国家优先发展的产业。以超深亚微米工艺和IP核复用技术为支撑的系统芯片技术是国际超大规模集成电路发展的趋势和21世纪集成技术的主流。2.1.1 嵌入式操作系统的特性随着计算机技术和产品向其它行业的广泛渗透,由于嵌入式系统具有小巧、高度自动化、响应速度快的特点,因而非常适应信息家电和现代控制设备的需要,嵌入式技术成为了一个研究热点。嵌入式系统,是将计算机直接嵌入至系统中,是信息IT的最终产品。它根据应用的要求,将操作系统和功能软件集成于计算机硬件系统中,实现软件与硬件一体化。2.1.2 嵌入式操作系统的分类嵌入式操作系统是随着嵌入式系统的发展出现的。从应用范围角度大致可以分为可分为专用型(如Ucos、Windows CE、VxWorks、嵌入式Linux等)和通用型(如Palm OS、Symbian)的嵌入式操作系统等。从实时性的角度大致可以分为实时嵌入式操作系统和一般嵌入式操作系统。2.1.3 嵌入式操作系统的特点嵌入式操作系统是对通用操作系统的继承和发展,具有操作系统的基本功能,包括指令执行、任务调度、存储器管理、设备管理和中断处理等。但是,由于嵌入式系统的硬件环境和程序运行需求有很大限制,所以嵌入式操作系统又有如下并不同于一般操作系统的特点。(1) 资源限制。嵌入式操作系统一般只有64MB内存,而且非易失性FLASH通常也就32MB,因此,操作系统运行时,就不能像在PC上那样使用资源了。(2) 安全性限制。 在嵌入式领域,系统在运行之后一般都不能在短时期内停机或者重启,因此死机、蓝屏是绝对不允许的。(3) 可移植性。 2.2 设计原理手机计算器的设计依赖于Windows CE操作系统,在PC机上采用Embedded Visual C+4.0来开发,主要采用为C与C+的语言编写,计算器的设计需要简洁的界面和完善的功能,采用string进行处理,编辑界面框用来输入和输出,一些必要的按钮进行运算。2.2.1C/OS-II操作系统随着嵌入式技术的快速发展,实时多任务操作系统作为一种软件平台已逐步成为国际嵌入式系统的主流,目前世界上已经有一大批成熟的实时嵌入式操作系统,通常,对嵌入式软件的基本要求是体积小、指令速度快、具有较好的裁减性和可移植性,目前,实时操作系统很多,如VxWorks,WindowsCE,pSOS,QNX,LynxOS等,这些操作系统都具有高可靠性、强实时性等特点,但他们都是商业操作系统,价格昂贵,人们往往很难接受,C/OS-操作系统的出现是对这些商业操作系统的一个很大的冲击。C/OS-是源码公开的实时操作系统,是一个自由操作系统。程序开发人员可以改写源代码,使之符合自己的要求,裁减掉不需要的部分,使操作系统变得小巧、灵活、并且能满足用户特定操作系统的需要。为了提高系统的实时能力,C/OS-可以将一个复杂的应用划分为多个相互独立的任务,并根据任务的重要性来分配优先级。任务的调度完全由C/OS-的实时内核完成,主要包括任务的状态管理、选择最高优先级的任务、执行任务和撤销任务等,C/OS-内核还负责CPU时间分配,CPU时间总是优先分配给中断事件,其次是任务队列中当前优先级最高的任务,不同任务间的通信可以通过C/OS-提供的信号量、邮箱、信息队列等机制完成,他的绝大部分代码是用C语言编写的,可移植性强,因此1997年以后,在国际上逐渐被广泛采用。2.2.2C/OS-II开发分析实时系统的特点是,如果逻辑和时序出现偏差将会引起严重后果的系统。有两种类型的实时系统:软实时系统和硬实时系统。在软实时系统中系统的宗旨是使各个任务运行得越快越好,并不要求限定某一任务必须在多长时间内完成。在硬实时系统中,各任务不仅要执行无误而且要做到准时。大多数实时系统是二者的结合。实时系统的应用涵盖广泛的领域,而多数实时系统又是嵌入式的。这意味着计算机建在系统内部,用户看不到有个计算机在系统里面。以下是一些嵌入式系统的例子:通讯类:Switch Hurb路由器机器人:航空航天飞机管理系统过程控制:药品加工化工厂汽车业:发动机控制防抱死系统(ABS)图2.1 ucosii工作原理简图实时应用软件的设计一般比非实时应用软件设计难。不复杂的小系统一般设计成如上图所示的那样时间相关性很强的关键操作(Criticaloperation)一定是靠中断服务来保证的。因为中断服务提供的信息一直要等到后台程序走到该处理这个信息这一步时才能得到处理,这种系统在处理信息的及时性上,比实际可以做到的要差。这个指标称作任务级响应时间。最坏情况下的任务级响应时间取决于整个循环的执行时间。因为循环的执行时间不是常数,程序经过某一特定部分的准确时间也是不能确定的。进而,如果程序修改了,循环的时序也会受到影响。沈阳工程学院课程设计报告 第三章 设计原理第三章 系统设计3.1 系统需求分析3.1.1 课程设计内容基于嵌入式ARM的C/OS-II移植。在mini2440开发板上移植C/OS-II2.83,并测试系统的稳定性。3.1.2 课程设计要求(1) 移植目标芯片ARM9;(2) 移植相关文件的程序注释;(3) 设计测试程序测试系统稳定性;3.2 硬件设计3.2.1 ARM处理器ARM(AdvancedRISCMachines),既可以认为是一个公司的名字,也可以认为是对微处理器的通称,还可以认为是一种技术的名字。ARM处理器是一个32位元精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。(1)ARM处理器系列ARM7系列、ARM9系列、ARM9E系列、ARM10E系列、SecurCore系列Intel的XscaleIntel的StrongARM ARM11系列,其中,ARM7、ARM9、ARM9E和ARM10为4个通用处理器系列,每一个系列提供一套相对独特的性能来满足不同应用领域的需求。(2)ARM处理器特点1、体积小、低功耗、低成本、高性能; 2、支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件; 3、大量使用寄存器,指令执行速度更快; 4、大多数数据操作都在寄存器中完成; 5、寻址方式灵活简单,执行效率高; 6、指令长度固定。(3)指令结构ARM微处理器的在较新的体系结构中支持两种指令集:ARM指令集和Thumb指令集。其中,ARM指令为32位的长度,Thumb指令为16位长度。Thumb指令集为ARM指令集的功能子集,但与等价的ARM代码相比较,可节省30%40%以上的存储空间,同时具备32位代码的所有优点。3.2.2 ARM硬件结构(1)mini2440概述Mini2440 是一款真正低价实用的ARM9 开发板,是目前国内性价比最高的一款学习板;它采用Samsung S3C2440 为微处理器,并采用专业稳定的CPU 内核电源芯片和复位芯片来保证系统运行时的稳定性。mini2440 的PCB 采用沉金工艺的四层板设计,专业等长布线,保证关键信号线的信号完整性,生产采用机器贴片,批量生产;出厂时都经过严格的质量控制,配合这本十分详细的手册,可以迅速帮你掌握嵌入式Linux 和WinCE 开发的流程,只要有C 语言基础的人一般2 周即可入门。(2)mini2440开发板的结构CPU 处理器为Samsung S3C2440A,主频400MHz,最高533Mhz;SDRAM 内存在板64M SDRAM,32bit 数据总线,SDRAM 时钟频率高达100MHz;FLASH 存储:在板256M Nand Flash, 掉电非易失(用户可定制64M/128M/256M/512M/1G),在板2M Nor Flash,掉电非易失,已经安装BIOS。接口和资源:1 个100M 以太网RJ-45 接口(采用DM9000 网络芯片), 3 个串行口,1 个USB Host,1 个USB Slave B 型接口,1 个SD 卡存储接口,1 路立体声音频输出接口,一路麦克风接口;1 个2.0mm 间距10 针,JTAG 接口4 USER Leds,6 USER buttons(带引出座),1 个PWM 控制蜂鸣器,1 个可调电阻,用于AD 模数转换测试,1 个I2C 总线AT24C08 芯片,用于I2C 总线测试, 1 个2.0 mm 间距20pin 摄像头接口,板载实时时钟电池,电源接口(5V),带电源开关和指示灯。图3.1 开发板实物图(3)串口S3C2440 本身总共有3 个串口UART0、1、2,其中UART0,1 可组合为一个全功能的串口,在大部分的应用中,我们只用到3 个简单的串口功能(本开发板提供的Linux 和WinCE驱动也是这样设置的),即通常所说的发送(TXD)和接收(RXD),它们分别对应板上的CON1、CON2、CON3,这3 个接口都是从CPU 直接引出的,是TTL 电平。为了方便用户使用,其中UART0 做了RS232 电平转换,它们对应于COM0,可以通过附带的直连线与PC 机互相通讯。图3.2 S3C2440的串口(4)mini2440开发板地址空间分配S3C2440 支持两种启动模式:一种是从Nand Flash 启动(MINI2440 即是此种);一种是从Nor Flash 启动。在此两种启动模式下,各个片选的存储空间分配是不同的,如下图2.3:下图中,左边是 nGCS0 片选的Nor Flash 启动模式下的存储分配图;右边是 Nand Flash 启动模式下的存储分配图;图3.3 地址空间分配在 NAND Flash 启动模式下,内部的4K Bytes BootSram 被映射到nGCS0 片选的空间;在 Nor Flash 启动模式下(非Nand Flash 启动模式),与nGCS0 相连的外部存储器,Nor Flash 就被映射到nGCS0 片选的空间,SDRAM 地址空间:0x30000000 0x340000003.3 软件设计3.3.1任务运行任务的状态如下:1.睡眠态(taskdormat):任务驻留于程序空间(rom或ram)中,暂时没交给ucos-ii处理。2.就绪态(taskready):任务一旦建立,这个任务就进入了就绪态。3.运行态(taskrunning):调用OSStart()可以启动多任务。OSStart()函数只能调用一次,一旦调用,系统将运行进入就绪态并且优先级最高的任务。4.等待状态(taskwaiting):正在运行的任务,通过延迟函数或pend(挂起)相关函数后,将进入等待状态。5.中断状态(ISRrunning):正在运行的任务是可以被中断的,除非该任务将中断关闭或者ucos-ii将中断关闭。任务是一个无返回的无穷循环,都有唯一的一个优先级。uc/os-ii总是运行进入就绪状态的最高优先级的任务。因为uc/os-ii总是运行进入就绪状态的最高优先级的任务。所以,确定哪个任务优先级最高,下面该哪个任务运行,这个工作就是由调度器(scheduler)来完成的。任务级的调度是由函数OSSched()完成的,而中断级的调度是由函数OSIntExt()完成。对OSSched(),它内部调用的是OS_TASK_SW()完成实际的调度(人为模仿一次中断);OSIntExt()内部调用的是OSCtxSw()实现调度。任务切换其实很简单,由如下2步完成:(1)将被挂起任务的处理器寄存器推入自己的任务堆栈。(2)然后将进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到寄存器中。图3.4 OS_TCB链结构调度算法主要基于分级查询。考虑到任务数目64,可以用6bit来表示,分为高3位和低3位。uC/OS-II将优先级进行分组,按高三位进行分组,可得8个(最多)优先级数组(000-111);每个优先级的在数组中的位置由其低三位表示。在源码中,高三位用带Y后缀的变量表示,而低三位用带X后缀的变量表示。这样建立了1个变量OSRdyGrp(INT8U,8bit,每个bit代表一组)和1个数组OSRdyTbl8(INT8U,每组8bit,每个bit代表一个优先级)。这样形成了的二级查询,先选组,再选组内偏移。图3.5 ucosii任务等待表3.3.2任务通信任务有如下状态:1.空闲任务(IdleTask)空闲任务OSTaskIdle()什么也不做,只是在不停地给一个32位的名叫OSIdleCtr的计数器加1,统计任务使用这个计数器以确定现行应用软件实际消耗的CPU时间。2.统计任务(OSTaskstat)统计任务每秒计算一次CPU在单位时间被使用的时间,并且把计算结果一百分比的形式存放在变量OSCPUUsage中,以便应用程序通过反问来了解CPU的利用率,如果用户要使用这个函数,那么在系统头文件OS_CFG.H中的系统配置常数OS_TASK_STAT_EN设置为1,创建之前,调用OSTaskstat对统计任务进行初始化。3.非系统任务这些任务是用户任务,通过运行,达到测量、监测、通信等功能,如图3.6。图3.6 Relationshipbetweentasks,ISRsandasemaphore3.3.3内存动态分配Ucos为内存中存储块的动态分配提供了支持。不同于malloc(),free(),ucos的存储管理机制是基于固定大小存储块的分配与回收。对于任务而言,每次只能申请固定大小的存储块,因而不存在外部碎片的问题。科学利用内存,操作系统把连续的大块内存按分区来管理,每个分区中包含有整数个大小相同的内存块,使得它们可以分配和释放固定大小的内存块。如下图所示:图3.7 内存模块沈阳工程学院课程设计报告 第四章 系统实现第四章 C/OS-II在ARM9上的移植随着国内工业化、数字化的步伐加快,嵌入式开发在IT行业中的重要性越来显著。中国成为“世界制造中心”甚至“设计中心”的趋势,必然对小型数字控制系统的需求越来越大。在这种情况下,类似于UCOS-II的小型硬实时嵌入式操作系统内核,具有低成本、易控制、小规模、高性能的特性,因而有相当好的发展前景。但是这类系统的基础较为薄弱,面临产品化、商业化程度不够的问题。采用此类系统进行产品开发需要仔细的分析、设计,否则也很难真正满足工业产品生产的要求。正是针对这种情况,在ARM微处理器环境下,针对商业化、产品化环境的严格要求,设计构造了一种硬实时嵌入式内核体系结构。当然真正的商业化、产品化的嵌入式内核,既需要这种能够满足高标准要求的体系结构设计基础,还需要严格的产品化软件开发测试过程。只有理论基础和工程实践完整的结合,才能产生真正经受得起考验的,能够满足工业化生产,能够在各种环境下稳定运行并确保达到设计目的的产品。从这个角度考虑,仅仅拿来一个操作系统内核并开发应用产品,很难万全满足这种要求。必须要对内核的涉及思路进行仔细的考虑、验证,对应用的可选开发设计方法进行审慎的评估,并配合真正工业化的项目发管理办法,才能保障产品达到要求。4.1 与CPU有关的文件与处理器相关的代码,这是移植中最关键的部分。内核将应用系统和底层硬件有机地结合成一个实时系统,要使同一个内核能适用于不同的硬件体系,就需要在内核和硬件之间有一个中间层,这就是与处理器相关的代码,处理器不同,这部分代码也不同,我们在移植时需要自己处理这部分代码,在C/OS中这一部分代码分成3个文件:OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C,分别如下:3.1.1 OS_CPU.H包含了用#define定义的与处理器相关的常量、宏和类型定义,具体有系统数据类型定义、栈增长方向定义、关中断和开中断定义、系统软中断的定义等。(1)不依赖于编译的数据类型C/OS-不使用C语言中的short,int和long等数据类型的定义,因为他们与处理器类型有关,隐含着不可移植性,代之以移植性强的整数数据类型,这样,既直观又可移植。根据ADS编译器的特性,代码为:typedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;typedefsignedcharINT8S;typedefunsignedshortINT16U;typedefsignedshortINT16S;typedefunsignedintINT32U;typedefsignedintINT32S;typedeffloatFP32;typedefdoubleFP64;typedefINT32UOS_STK;(2)使用软中断SWI做底层接口因为带T变量的ARM7处理器核具有两个指令集,用户任务可以使用两种处理器模式,为了使底层接口函数与处理器状态无关,同时在任务调用相应函数时不需要知道该函数位置,本例使用软中断指令SWI作为底层接口,使用不同的功能号区分不同的函数。(3)OS_STK_GROWTHC/OS-使用结构常量OS_STK_GROWTH指定堆栈的生长方式,其lpc2132代码为:#defineOS_STK_GROWTH13.1.2OS_CPU_C.C移植OS_CPU_C.C文件时,需要编写的是任务堆栈初始化函数OSTaskStkInit和时钟节拍中断服务钩子函数OSTimeTickHook。在C/OS-II中,每一个任务都有自己的任务堆栈,当发生任务切换或者中断时,其CPU使用权被剥脱,为了任务能被再次运行,那么这个被打断的任务所用到的处理器的寄存器内容均应得到保存,按照ARM7处理器的压栈和入栈指令的特点,设计任务堆栈如下3:CPSRR0R1R12LR(R14)PC(R15) 根据任务堆栈结构示意图,OS_STK函数编写如下5:#defineSVCMODE0x13OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT16Uopt)OS_STK*stk;opt=opt;stk=(OS_STK)ptos;*-stk=(OS_STK)task;*-stk=(OS_STK)task;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=(INT32U)pdata;*-stk=(SVC32MODE|0x40);return(OS_STK*)stk);说明:用户创建任务时,OSTaskCreat()会调用OSTaskStkInit函数初始化该任务的堆栈,并把返回的堆栈指针保存到该任务的TCB结构中的最前面的参数OSTCBStkPtr中,当该任务要被恢复时,任务切换函数从其TCB块中取得其任务堆栈指针,依次将堆栈内容弹到处理器对应的CPSR、r0,r1,r12,lr,pc的寄存器中,完成现场的恢复和程序指针PC的返回。另一个需要编写的函数是OSTimeTickHook,该函数被时钟节拍中断服务函数OSTickISR中的OSTimeTick函数调用,用来清除时钟节拍中断发生设备的请求。本移植方案使用处理器的RTC模块的tick中断作为时钟节拍中断,该函数编写如下: voidOSTimeTickHook(void)rI_ISPC=(INT32U)0x01)20;注意:用户也可不修改此函数,但是必须在OSTickISR中执行清除发生节拍中断的设备的中断请求标志,为便于说明,本文将利用内核提供给用户的OSTimeTickHook函数来完成清中断的任务。另外几个hook函数不必去改它们,至此,OS_CPU.C编写完成。包含了与移植有关的C函数,包括堆栈的初始化和一些钩子函数的实现,但是最重要的是OSTaskStkInit()函数,该函数是在用户建立任务时系统内部自己调用的,用来对用户任务的堆栈初始化。在ARM7体系结构下,任务堆栈空间由高至低递减,依次保存着PC,LR,R12,R1,R0,CPSR的初始化堆栈结构,当用户初始化了堆栈,OSTaskStkInit()就返回新的堆栈指针STK所指的定地址。OSTaskCreate()和OSTaskCreateExt()会获得该地址并将他保存到任务控制块TCB中,其他的几个钩子函数必须声明,但可以不包含任务代码,这些钩子函数在本移植中全为空函数。3.1.3OS_CPU_A.SC/OS-移植的绝大部分工作都集中在OS_CPU_A.S文件的移植上,在这个文件里,最困难的工作又集中体现在OSIntCtxSw和OSTickISR这两个函数的实现上。这是因为这两个函数的实现是和移植者的移植思路以及相关硬件定时器、中断寄存器的设置有关,在实际的移植工作中,这两个地方也是比较容易出错的地方,这部分需要对处理器的寄存器进行操作,所以必须用汇编语言编写,包括4个子函数:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。OSStartHighRdy()该函数首先调用钩子函数OSTaskSwHook(),然后将OSRunning标志位设置为真,表示任务开始执行,从而保证任务切换操作的正确执行,紧接着从具有最高优先级的任务控制块中取得任务的堆栈指针,初始化堆栈指针寄存器SP,然后恢复其他的寄存器,开始执行最高优先级的任务。OSCtxSw()该函数在任务级任务切换函数中调用,首先保存处理器寄存器,将当前SP存入任务TCB中,载入就绪最高优先级任务的SP,从新任务的任务堆栈中恢复处理器所有寄存器的值,然后执行中断返回指令。OSIntCtxSw()该函数是在ISR中执行任务切换功能,其原理基本上与任务级的切换相同,区别只是ISR已经保存了CPU的寄存器,因此不要再进行类似的操作,只需对堆栈指针作相应的调整即可。OSTickISR()该函数是系统时钟节拍中断服务函数,首先要保存处理器寄存器,接着调用OSIntEnter()函数,以保证中断嵌套层数不超过255层,如果满足了该条件,则把堆栈指针保存到当前任务的任务控制块TCB中,然后给产生中断的设备清中断,重新允许中断,接下来调用OSTimeTick()来维持C/OS-内部的定时以及调用OSIntExit()函数决定是否因为这个中断服务程序的执行,使得更高优先级的任务就绪。这一部分是用户根据自己的应用系统来定制合适的内核服务功能,包括2个文件:OS_CFG.H和INCLUDES.H。OS_CFG.H用来配置内核,用户根据需要对内核进行修改,留下需要的部分,去掉不需要的部分,比如系统可提供的最大任务数量,是否定制邮箱服务,是否提供优先级动态改变功能等等,所有的配置更改包括头文件的增减均在该文件中进行。INCLUDES.H系统头文件,整个实时系统程序所需要的文件,包括了内核和用户的头文件,这样使得用户项目中的每个C文件不用分别去考虑他实际上需要哪些头文件。4.2 移植代码实现复位入口代码的主要功能就是设置好PLL然后搬迁代码。此处列出的是标准写法,根据编译链接参数不同,还有其他一些优化写法。例如,在编译调试工具中(SDTV2.51或ADSV1.2),如果只配置RO-BASE参数,不配置RW-BASE参数,RO和RW段是自然衔接的,这样代码的拷贝搬迁工作可以简化。另外要注意的是,这部分代码要仔细检查、调试实际的执行结果。例如,搬迁后,应该初始化的全局变量是否正确初始化。SDTV2.51下,如果用JTAG调试,RW-BASE配置了参数,直接下载代码到RAM中,因为没有自己控制内存搬迁和拷贝初始化数据段的代码,就存在全局变量没有正确初始化的问题。工程师编写代码的时候,不可能不考虑调试状态,因此这种调试状态下代码段搬迁的初始化问题同样要仔细考虑。比较好的方式,是在模块的初始化函数中,进行所有处于RW段、ZI段的全局变量的详细初始化。这种初始化过程不影响主体代码的仅仅在开始阶段执行一次,完全不会影响主体程序的执行效率,确能够保障代码在任何情况下的稳定运行。 代码三十五.2132复位及中断入口代码init.sIMPORTi_pCurTcbIMPORTIrqFinishIMPORTPreISRIMPORTIntrNestedIMPORTI2C0VectIMPORTIsrHandlerIMPORT|Image$RO$Limit|IMPORT|Image$RW$Base|IMPORT|Image$ZI$Base|IMPORT|Image$ZI$Limit|EXPORTENTER_U0EXPORTENTER_U1EXPORTENTER_I2C0EXPORTENTER_DEFAREAInit,CODE,READONLYCODE32ENTRY;入口;/*/;/异常矢量,接到异常跳转*/;/有顺序问题必须按照异常顺序*/;/*/bHandlerRST;实际启动点,非再次跳转的例程bHandleFIQ;此下之后均为再次跳转例程bHandleFIQbHandleFIQbHandleFIQ;不适合跳转处理DCD0xA73FFFC6LDRPC,PC,#-0xff0;分发例程可以C安装设备中断HandleFIQ;不处理FIQ,所有异常进入此处死循环nop;并通过看门狗完成复位bHandleFIQLTORG;/*/;/*IRQ中断预处理例程*/;/*入口条件:IRQ中断屏蔽,LR是被中断任务或ISR的PC值,*/;/*SPSR是被中断任务或ISR的当前处理器状态值,*/;/*SP是IRQ模式当前堆栈指针值*/;/*/HandlerIRQ;/*/;1.4SPSR保存到R0;压栈R0,是IRQ模式的SPSR,也是被中断模式的CPSR;/*/mrsr4,spsrstmfdsp!,r4movr0,r6blPreISR;r0中返回处理结果cmpr0,#0beqkeepirq;/*/;结束应急处理并结束中断处理,已处理完;/*/ldrr0,=SFR_VICVectAddrldrr1,=0strr1,r0ldmfdsp!,r0msrspsr_cxsf,r0ldmfdsp!,r0-r12,lr,pcLTORGkeepirq;/*/;1.6恢复堆栈指针的原值,并保存到R3;方便后面算法使用,此后不再用到IRQ堆栈;/*/addr3,sp,#64movsp,r3;/*/;2.判断是否第一层中断,如果不是第一层,进入3;2.1嵌套中断数变量地址到R0,变量值读入到R1;/*/ldrr0,=IntrNestedldrr1,r0cmpr1,#0;/*/;2.2如果不是第一次,跳到第3步;/*/bneIRQNESTMODE;/*/;3设置嵌套层数为1。R1=1,保存R1值到R0地址(前面2.1);/*/ldrr1,=1strr1,r0;/*/;不是嵌套中断切换到svc模式处理任务;3.1切换到SVC模式,第一层中断,一定是中断运行在SVC模式下的任务;/*/msrcpsr_cxsf,#ARM9_SVC_MOD|ARM7_I_BIT;/*/;3.2将保存在IRQ模式下的任务环境拷贝到任务的堆栈(SP),;其中LR无法拷贝,需要在本模式

温馨提示

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

评论

0/150

提交评论