《毕业设计基于μCOSII的键盘驱动的实现.doc》由会员分享,可在线阅读,更多相关《毕业设计基于μCOSII的键盘驱动的实现.doc(33页珍藏版)》请在三一办公上搜索。
1、基于C/OS- II的键盘驱动的实现第一章 绪论一嵌入式系统简介 嵌入式系统着眼于应用,己被人们定义为“以应用为中心、以计算机技术为基础、软件硬件可裁减、适应于应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统”。 嵌入式系统是将先进的计算机技术、半导体技术、电子技术和各个行业的具体应用相结合后的产物,这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。嵌入式系统具有一般计算机组成的共性,都是由硬件和软件组成的。嵌入式系统的硬件部分,是以嵌入式处理器为中心,配合存储器、I/O设备、通信模块、扩展设备接口以及电源等必要的辅助接口组成。嵌入式系统软件部分,
2、一般是按3层划分的:设备驱动层、实时操作系统层、 应用程序层。嵌入式系统的硬件是嵌入式系统的基础,决定了嵌入式系统的运算速度和扩展功能等,提供了嵌入式软件运行的物理平台和通信接口;嵌入式系统的软件是嵌入式系统的灵魂,包括嵌入式操作系统和嵌入式应用软件,决定了硬件的操作模式,通过操作系统和应用程序发挥硬件装置的功能。嵌入式系统是应用于特定环境下,面对专业领域、针对特定用途的系统,所以与通用计算机系统的多样化和适用性不同。与通用计算机系统相比,它具有以下显著的特点:1) 嵌入式系统通常是面向特定应用的,是“专用”的计算机系统;2) 嵌入式系统一般使用实时操作系统;3) 嵌入式系统是技术密集、资金密
3、集、高度分散、不断创新的知识集成系统;4) 嵌入式系统具有功耗低、体积小、集成度高、成本低的特点;5) 嵌入式系统的硬件和软件通过量体裁衣、去除冗余,可以用较少的软硬件资源实现较高的性能;6) 嵌入式系统与具体的行业应用相结合;7) 嵌入式系统的软件一般都固化在非易失性存储器中,提高了执行速度和系统可靠性。二本课题的主要研究工作本课题采用高性能嵌入式处理器S3C2410X和C/OS-II 操作系统,开发了一个轻型嵌入式串行通信系统。具体的工作主要有: 1. 键盘的驱动编程。2. C/OS-II的移植,这是本课题的重点所在。操作系统内核移植是在ARM公司的ADS1.2集成开发环境下完成的。3.
4、在应用层裁剪移植一个用于监视的图形用户界面(GUI)。 4. 在操作系统的上层编写一个用于人机交互的键盘驱动程序、LCD液晶显示驱动程序和相关的功能运用程序等。 第二章 基于C/OS-II的键盘驱动的总体规划与设计嵌入式系统设计的基本原则是“物尽其用”,与通用计算机相比,嵌入式系统的硬件和软件都必须高效率地设计,量体裁衣,去除冗余,力争在同样的硅片面积上实现更高的性能,以满足应用系统对功能、可靠性、成本、体积和功耗的要求。2.1 系统的设计要求本设计将一个实时操作系统移植到 ARM 嵌入式微处理器后,利用操作系统中提供的系统资源调用把串口及其他外设当成普通文件进行操作,读写方便,从而在进行相应
5、软件开发的过程中,提高系统编程效率,简化调试的复杂程度,实现基于ARM嵌入式微处理器为核芯的串口通信,除此之外,按照嵌入式系统的软、硬件结构组成, 将图形用户界面GUI和实时操作系统整合后移植到ARM微控制器上。系统实现的功能如下:(1)激活超级终端0,敲击PC机的键盘,将字符通过PC机的串口发送给ARM开发板的串口0;通过ARM芯片处理后,在开发板上的LCD上同步显示。(2)利用开发板上的键盘输入字符,同样可在LCD上显示,并发送给PC机。(3)系统还应考虑日后的升级和功能扩展,留下可开发的硬件空间。2.2 系统的硬件和软件选型2.2.1 系统硬件平台的选择嵌入式开发的硬件平台的选择主要是嵌
6、入式处理器的选择。在一个系统中使用什么样的嵌入式处理器内核主要取决于应用的领域、用户的需求、成本问题、开发的难易程度等因素。目前非常流行的ARM核有ARM7TDMI,StrongARM,ARM720T,ARM9TDMI,ARM922T,ARM940T,ARM946T,ARM966T,ARM10TDMI等。自V5版本以后,ARM公司提供Piccolo DSP的核心给芯片设计者,用于设计ARM DSP的SOC(System On Chip)结构芯片。此外,ARM核还获得了许多实时操作系统(Real Time Operating System)供应商的支持,比较知名的实时操作系统有:Windows
7、CE、Linux、pSOS、VxWorks、Nucleus、EPOC、C/OS-II、BeOS等。S3C2410A微处理器是一款由韩国SamSung电子公司为手持设备设计的低功耗、高集成度的基于ARM920T核的16/32位RISC处理器。为了降低整个系统的成本,S3C2410A还集成了以下部件:16KB指令Cache、16KB数据Cache、具有虚拟存储器管理单元MMU、外部存储器控制器、LCD控制器(支持STN和TFT)、8通道10位ADC、触摸屏接口、NAND Flash控制器、3个UART通道、4个DMA通道、4个PWM定时器、1个内部定时器、I/O端口、RTC、IIC-BUS控制器、
8、IIS-BUS控制器、USB主、USB从、SD主卡/MMC卡接口、2通道的SPI以及内部PLL时钟倍频器等。S3C2410A采用0.18um工艺生产制造,核心频率最高可以达到203MHz,功能强大而且体积小、功耗低。S3C2410A片上资源丰富,可以简化外围电路设计,减少了整个系统的成本,为嵌入式系统提供了一个高效的硬件平台。S3C2410A处理器不仅在手机、PDA等手持设备方面广泛应用,在通信系统、数据终端等方面也得到广泛应用。考虑到本项目的开发要带操作系统并运行CGUI,本文选定SamSung(三星)公司生产的一款基于ARM920T核的高性能低功耗SOC芯片S3C2410A作为硬件开发平台
9、的主控制器。2.2.2 嵌入式操作系统的选择嵌入式操作系统EOS(Embedded Operating System)是一种支持嵌入式系统应用的操作系统软件,是嵌入式系统的重要组成部分。嵌入式操作系统负责完成嵌入式系统的全部软、硬件资源的分配、调度、控制、协调;它必须体现其所在系统的特征,能够通过加载/卸载某些模块来达到系统所要求的功能。嵌入式操作系统具有小巧、可定制性、强稳定性、弱交互性、较强的实时性、外设接口统一性等特点。随着嵌入式系统的快速发展,嵌入式操作系统已经从简单走向成熟,比较著名的有Windows CE、CLinux、C/OS-II、VxWorks、Palm OS和Linux等。
10、基于实时性、成本以及开发难度方面的考虑 ,系统设计时选择了C/OS-II开放源代码的嵌入式实时操作系统。实时操作系统C/OS- II是一个源码公开、可移植、可固化、可裁剪及占先式的实时多任务操作系统 ,它运行优先级最高的就绪任务,其绝大部分源码是用 C 语言编写。C/OS - 的正常运行需要处理器平台满足以下要求: 处理器的 C编译器能产生可重入代码。 用 C语言就可以打开和关闭中断。 处理器支持中断,并且能产生定时中断 (通常在 10至 100Hz之间 )。 处理器支持能够容纳一定量数据 (可能是几千字节 )的硬件堆栈。 处理器有将堆栈指针和其它 CPU寄存器读出和存储到堆栈或内存中的指令。
11、S3C2410处理器采用 ARM920T内核 ,内部共有 37个寄存器 ,其中 R13通常用作堆栈指针 ,只要系统 RAM空间允许 ,堆栈空间理论上没有限制。ARM处理器提供 ARM指令和 Thumb指令两种指令集 ,每种指令集都包含有丰富的指令对堆栈进行操作 ,可以随意的对处理器中的寄存器进行堆栈操作。根据堆栈生长方向的不同 ,可以生成 4种不同的堆栈,分别是满递增、空递增、满递减 (此移植中使用的是满递减方式 )、空递减。芯片内集成 5个定时时钟 ,任何一个都可以产生定时中断 ,满足第三条要求。ADS集成开发环境的内置编译器可以产生可重入代码 ,并且支持内嵌汇编 , C环境中可任意的进行开
12、关中断操作。综上所述,从理论上讲C/OS - 完全可以移植到 S3C2410A上运行。2.2.3 嵌入式GUI的选择图形用户界面GUI(Graphic User Interface)是系统与用户交流沟通的一个平台,为用户提供了友好的人机界面和简单的图形化操作,是嵌入式软件平台的重要组成部分。嵌入式GUI要求简单、直观、可靠、占用资源少并且反应快速,以满足嵌入式系统中硬件资源有限的要求。独立开发嵌入式GUI需要大量的人力物力,所以对于大多数用户来说一般采用目前比较成熟的GUI系统,从而将更多的精力用来开发自己的应用程序。面向比较流行的嵌入式GUI系统有:Microwindows、MiNiGUI、
13、OpenGUI、Qt/Embedded和CGUI等。基于C/OS-II的图形用户界面支持系统的选型,我们有多种选择,对上述5种嵌入式图形用户界面进行了综合比较,CGUI在API完整性、函数库大小、可移植性、多进程执行性、健壮性、执行效率等各方面都具有优势,符合本系统对嵌入式GUI的要求,因此选择CGUI作为本系统的嵌入式GUI。C/ OS- I IC/GUI32位微处理器S3C2410AARM920TUSB接口电源电路复位电路时钟电路FlashSDRAMJTAG接口键盘接口液晶显示屏图2-1 系统平台设计框图2.3 4X4键盘的简介2.5 本章总结本章给出了嵌入式键盘系统的平台选配,包括系统的
14、MCU内核、操作系统、GUI选择等,并给出了相关功能模块如S3C2410A、C/OS-II实时操作系统、CGUI等的工作原理及相关介绍,最后给出了键盘驱动的总体设计方案。第三章 基于S3C2410A的嵌入式键盘驱动系统实现ARM嵌入式系统在基于ARM CPU为核心的硬件平台和以ADS或相关软件集成开发环境为软件平台,在其基础上,搭建中间件、驱动程序及嵌入式操作系统平台,最终在此基础上完成ARM嵌入式系统应用的开发。嵌入式系统硬件平台结构主要分为2大部分:一部分为系统主板,为基于ARM的最小系统,包括ARM CPU、Flash、SDRAM、键盘等最基本部分;另一部分为系统扩展板,提供了用于完成各
15、个不同硬件的功能模块。3.1 硬件总体结构设计MAX3232ARM9S3C2410A电源部分14针JTAG调试接口32.768KHZ有源晶振键盘接口HD7279ALCD液晶显示屏5.7寸256色真彩SDRAMHY57V641620B8MFlash ROMK9F5608U0A32M复位模块IMP811S文章选择基于ARM920T精简指令集的S3C2410A微处理器作为硬件的控制核心,附加外围的电源、晶振、调试接口、SDRAM,Flash ,人机接口等功能模块构成嵌入式键盘驱动的硬件平台。硬件的整体结构设计如图3-1所示。图3-1 基于S3C2410A的硬件整体设计各部分功能表述如下:电源电路:电
16、源电路为5V到3.3V和5V到1.8V的DC-DC转换器,给MCU的I/O和ARM内核供电,向系统提供+5V、+3.3V、+1.8v电压;时钟电路:32.768K有源晶振为系统提供工作时针,通过片内PLL电路倍频为50MHZ作为微处理器的工作时钟;复位电路:复位电路主要完成上电、掉电复位和系统在运行时用户的按键复位功能。本系统所采用专门的系统监视复位芯片IMP811S,可以手动控制系统的复位,还可以实时监控系统的电源;Flash存储器:是一种可在线擦写,掉电后数据不丢失的存储器,具有功耗低、容量大、擦写速度快等优点。本系统包含2MB NOR Flash和32MB NAND Flash存储器,内
17、部存放系统引导代码、C/OS-II内核、用户程序等。SDRAM:SDRAM(Synchronous Dynamic Random Access Memory)是同步动态RAM,具有容量大、成本低、存储快等优点,广泛应用在嵌入式系统中。S3C2410A处理器内部没有集成的SRAM,无法满足本系统的需要,因此我们扩展了两片SDRAM芯片HY57V561620,主要用作程序运行空间、数据和堆栈区。JTAG接口电路:JTAG是一种国际标准测试协议,主要用于芯片内部测试以及对系统仿真和调试。本系统采用14脚JTAG仿真调试接口电路,芯片内部有JTAG核,可以通过外部仿真器与开发系统连接调试;键盘:本系统
18、采用HD7279芯片,该芯片支持IIC总线协议,可以扩展64位键盘,驱动8个LED数码管;LCD接口:支持多种尺寸的STN、TFT LCD。3.2 电源电路设计由于S3C2410A的内核电压为1.8V/2.0V,I/O模块和存储器供电为3.3V,而电路板、LCD屏及USB接口等提供供电电压外部设备通常为5V,因此系统需要1.8/2.0V ,3.3V及5V共三种电压。图32 系统的5V电源图3-3 S3C2410A 的电源电路本课题设计中的电源系统包括交流电源和直流电源。首先选用或自制由交流到直流(AC-DC)的直流稳压电源输出5V电压,电流大小根据外部设备及接口情况,选择1A、1.5A或更大的
19、电流输出。目前在S3C2410A中使用广泛的DC-DC模块是ALPHA公司的AS1117AU系列,尾标1.8、3.3分别代表输出电压值为1.8V和3.3V。本课题的电源电路设计如下图3-2与图3-3所示。3.3 时钟电路设计S3C2410A的主时钟源来自外部晶振或外部时钟。时钟发生器有一个振荡放大器,其外部需要接一个石英振荡器。同时它还有一个锁相环(PLL),其输入信号是低频振荡器的输出,输出信号是S3C2410A的需的高频时钟(倍频作用)。S3C2410A的时钟电路的设计见图3-4。图3-4 S3C2410A 时钟电路 3.4 复位电路设计微控制器在上电时状态并不确定,将造成微控制器不能正常
20、工作。为解决这个问题,所有微控制器均有一个复位逻辑,它负责将微控制器初始化为某个确定的状态。多数嵌入式系统一般采用专用复位电路IC芯片,如IMP811等。S3C2410A的复位电路设计见下图3-5。图3-5 S3C2410A 复位电路3.5 存储器接口电路设计S3C2410A内部没有存储器,因此必须采用总线方式扩展外部存储器,包程序存储器和数据存储器。3.5.1 数据存储器SDRAM的接口设计在本设计中数据存储器选用了典型的SDRAM(Synchronous DRAM)存储器芯片HY57V641620B 两片,如下图3-6所示,它是1M4 Banks 16 Bit 的SDRAM芯片,带自刷新电
21、路、16条数据线,11条地址线,由于是 SDRAM,因此容量为8M。通过S3C2410A的nSCLK0 和nSCLK1对两片HY57V641620B进行选择存储,可实现32位的数据存储功能。图3-6 SDRAM存储器电路3.5.2 程序存储器NAND Flash的接口设计通常使用的Flash有NOR Flash和NAND Flash两种,由于NOR Flash读取速度快,多用于存储操作系统等重要信息;大容量的信息通常存储在NAND Flash中,可在线擦除。本设计中选用的程序存储器是SAMSUNG公司的32M x 8 Bit NAND Flash Memory K9F5608U0A。电路设计见
22、下图3-7。图3-7 NAND Flash存储器电路3.6 键盘及LED显示器接口设计设计过程中,键盘采用的控制芯片是HD7279A。HD7279是一片具有串行接口的可同时驱动8位共阴式数码管或独立的LED的智能显示驱动芯片。该芯片同时还可连接多达64键的键盘矩阵,单片即可完成显示键盘接口的全部功能。内部含有译码器可直接接受BCD码或16进制码并同时具有两种译码方式。电路设计如图3-8所示。图3-8 键盘及LED显示器接口3.7 LCD控制器接口设计S3C2410A 与LCD液晶显示屏的连接很简单,直接将相关引脚相连即可,无需其他硬件。本系统中选用的LCD为5.7寸,256色,640480像素
23、的TFT(Thin Film Transistor, 薄膜场效应晶体管)彩色显示屏。电路设计如图3-9。图3-9 S3C2410A 与LCD控制器接口TFT液晶显示屏的连接3.8.3 JTAG接口电路设计为便于系统设计开发与系统扩展,设计了一个JTAG接口电路,方便程序的下载与联机在线调试。其设计电路如图3-12所示。S3C2410A采用ARM公司提供的标准20脚JTAG仿真调试接口电路,芯片内部有JTAG CORE,因此,可通过外部的JTAG调试电缆或仿真器和开发系统连接调试。图3-12 JTAG接口电路第四章 系统软件设计嵌入式系统软件部分,一般是按3层划分的:设备驱动层、实时操作系统层、
24、 应用程序层。嵌入式系统的硬件是嵌入式系统的基础,决定了嵌入式系统的运算速度和扩展功能等,提供了嵌入式软件运行的物理平台和通信接口;嵌入式系统的软件是嵌入式系统的灵魂,包括嵌入式操作系统和嵌入式应用软件,决定了硬件的操作模式,通过操作系统和应用程序发挥硬件装置的功能。其中,嵌入式操作系统是用来支持嵌入式应用的系统软件,通常包括与硬件相关的底层软件、系统内核、图形用户界面(GUI)、设备驱动接口等。4.1 实时操作系统C/OS-II在S3C2410A 上的移植C/OS-II在S3C2410A上的移植主要包括两个部分的代码配置或者编写: 第一部分与应用相关的配置, 体现在对OS_ CFG.H 和
25、INCLUDES.H 配置上;第二部分与特定处理器(这里指S3C2410A)相关的代码编写, 体现在OS_ CPU.H,OSCU P_ A.ASM ,OS_CPU _ C.C 编写上。这两部分代码的正确的配置与编写, 只能确保基于S3C2410A 的C/OS-II微内核代码形成, 并不能立即烧入目标板运行, 要在目标板上运行, 必须还要编写目标板初始化引导程序, 初始化引导程序主要实现硬件初始化、内存映射(S3C2410A 不支持二次映射)、中断向量初始化、系统堆栈空间的分配、等功能, 以引导C/OS- II的正确运行。移植过程中选用的开发工具为 ARM 公司提供的 ADS1.2 集成开发环境
26、。移植工作主要集中在与处理器相关的3个文件 :OS_ CPU.H,OS_CPU_C.C,OS_CPU_A.S。其中OS_ CPU. H文件主要包含与编译器相关的数据类型定义、堆栈类型定义、两个宏定义和几个函数说明OS_ CPU_ C.C 包含与移植有关 6 个 C 函数,为 OS2TaskStkInit(),OSTaskCreateHook(),OSTaskDelHook(),OSTaskSwHook(),OSTaskStatHook(),OSTimeTickHook()。除第一个任务堆栈初始化函数外的5个函数为钩子函数,需要声明,没有实际内容,由系统函数调用,以便用户能在操作系统中加入自己需
27、要的功能。OS_ CPU_ A.S中包含与移植有关的4个汇编语言函数,为 OSStartHighRdy(),OSCtxSw(),OSIntC2txSw(),OSTickISR()。C/OS-II在S3C2410A上的移植流程图如图4-1所示。建立C/ OS- I I交叉编译环境裁剪、配置和编译C/ OS- I I内核内核映像烧写到Flash中执行内核解压、启动内核ARMC/ OS- I I被引导,进入正常状态图4-1 C/OS-II移植流程4. 1. 1 OS_CPU.H文件移植C/ OS- II不使用C语言中short ,int和long等数据类型定义,因为它们与处理器类型相关,隐含不可移植
28、性,因此必须对其进行移植。H 文件中主要包含与编译器相关数据类型定义、堆栈类型定义、两个宏定义和几个函数说明。数据类型定义部分代码如下:typedef unsigned char BOOLEAN; / *布尔变量 */typedef unsigned char INT8U; / * 无符号8 位整型变量 */typedef signed char INT8S; / * 有符号8 位整型变量 */typedef unsigned short INT16U; /* 无符号16 位整型变量 */typedef signed short INT16S; / * 有符号16 位整型变量 */typede
29、f unsigned int INT32U; / * 无符号 32 位整型变量 */typedef signed int INT32S; / * 有符号32 位整型变量 */typedef float FP32; / * 单精度浮点数(32 位长度) */typedef double FP64; / * 双精度浮点数(64 位长度 */typedef INT32U OS STK; / * 堆栈是32 位宽度 */另外,带T 变量的ARM7 处理器内核有两个指令集,用户任务可使用两种处理器模式即用户模式和系统模式,本移植使用软中断指令SWI 作为底层接口,使用不同功能号区分不同函数。在 ADS
30、中,用关键字_ _swi声明一个不存在的函数,则调用该函数就在调用的地方插入一条 SWI 指令并可指定功能号。SWI函数部分代码如下:_ _ swi 0x00 void OS- TASK- SW void ; / *任务级任务切换函数 */_ _swi(0x01) void- OSStartHighRdy(void) ; / *运行优先级最高的任务 */_ _swi(0x02) void OS- ENTER- CRITICAL(void) ; /* 关中断 */ _ _swi(0x03) void OS- EXIT- CRITICAL(void) ; /* 开中断 */_ _swi(0x42)
31、 void OSISRBegin(void) ; /* 中断开始处理 */_ _swi 0x43 int OSISRNeedSwap void ; / * 判断中断是否需要切换 */_ _swi(0x80) void ChangeToSYSMode(void) ; / *任务切换到系统模式 */_ _swi(0x81) void ChangeToUSRMode(void) ; /* 任务切换到用户模式 */由于 ADSv1.2 的 C语言编译器只支持满递减堆栈,所以只能定义堆栈增长方向从上向下,即 #define OS_STK_ GROWTH 1;4. 1. 2 OS_CPU_ C.C文件移植
32、每个任务要有自己的堆栈空间,以便进行任务切换时能将当时处理器现场保存到任务堆栈空间中,在下次执行时再恢复出来。因此必先确定任务堆栈结构,而任务堆栈结构与 CPU 体系结构、编译器密切关联。在ARM体系下,处理器现场通常指PC,LR,R0- R12 ,CPSR,SPSR。本移植堆栈结构如图4-2 所示。任务堆栈由高到低依次将保存 PC,LR,R12 ,R11 ,R10R1 ,R0 ,CPSR等。每个任务有独立的OSEnterSum,在任务切换时保存和恢复各自OsEnterSum 值。各个任务开关中断的状态可不同,这样实现了开关中断的嵌套。图4-2 任务堆栈结构图堆栈任务初始化代码即函数OSTas
33、kStkInit() ,该函数用于系统创建用户任务时,建立并初始化任务堆栈,其跟处理器硬件体系密切相关,它将所有的寄存器压栈,返回新的堆栈栈顶,并将它们保存在该任务的任务控制块OS_TCB 中,最终使初始化后的堆栈跟刚发生过一次中断一样。这样,系统无需对调度程序作特殊处理即可直接对新任务进行调度。由于在S3C2410A中堆栈是按32 位数据类型来进行操作,所以堆栈数据类型 OS_STK 声明为 32 位无符号整 数。OS2TaskStkInit()函数关键代码如下:* stk = (OS- STK) task; /* pc */* _ _ stk = (OS- STK) task; /* lr
34、 */*_ _ stk = 0; /* r12. . .r1 同理 */*_ _ stk = (unsigned int) pdata; /* r0 ,第一个参数使用R0 传递 */*_ _ stk = (USER- USING- MODE| 0x00) ; /* spsr ,允许 IRQ,FIQ 中断 */另外还 有 几 个 系 统 规 定 的 hook 函 数: OS2TaskGreateHook(),OSTaskDelHook(),OSTaskSwHook(),OSTaskStatHook(),OSTimeTickHook()。本移植将它们都设置为空函数。413 OS_CPU_ A.S
35、文件移植此文件包括四个函数都涉及对寄存器的处理,跟处理器有关,由于不同处理器有不同寄存器,所以操作系统在这个文件里给用户留下四个函数接口,以便用户根据所选处理器编写相应的汇编程序以完成固定功能。分别为:多任务启动函数中调用的 OSSTartHightRdy(),任务切换函数OSCtxsw(),中断任务切换函数OSIntCtxSw()和时钟节拍服务函数OSTickISR()。多任务启动函数中调用 OSSTartHightRdy() 函数,C/OS- II 启动多任务环境的函数是 OSStart(),用户在调用该函数之前,必须建立一个或更多任务OSStart() 最终调用函数 OSStartHig
36、hRdy() 运行优先级最高的任务。OSCtxSw() 函数是由任务级任务切换函数 OS_TASK_SW()调用,实现从低优先级向高优先级切换。文中任务级切换是通过 SWI 软中断来实现。该中断完成:(1)保存任务的环境变量;(2)将当前任务的堆栈指针SP存入任务控制块OS_TCB 中;(3)载入就绪最高优先级任务的堆栈指针SP;(4)恢复就绪最高优先级任务的环境变量;(5)中断返回。软中断的异常处理程序挂接到CPU内核,通过修改启动代码里的异常向量表实现。中断服务程序与CPU 芯片相关,中断源的挂接通过增加汇编接口的支持来实现,即在文件 IRQ.S的适当位置添加如下的程序代码:Z_Handl
37、er HANDLER Z_Exception ;其中 Z替换为所需要的字符串,举例代码如下: IRQ_Handler HANDLER IRQ _ Exception ;IRQ中断sdOSIntCtxSw()是中断级任务切换函数,在中断退出时由函数OSIntExit()调用。在中断服务程序中,当发现有高优先级任务等待时钟信号到来时,在中断退出后并不返回被中断任务, 而是直接调度就绪的最高优先级任务执行,从而尽快响应高优先级任务,保证系统实时性。OSIntCtxSw()函数基本原理与任务级切换相同,只是由于进入中断时已保存了被中断任务的环境变量,就不进行类似操作,只需要对堆栈指针进行调整。中断任务
38、切换函数 OSIntCtxSw() 部分代码如下:LDR R1 , =OSTCBCur ;保存当前任务堆栈指针到当前任务的TCBLDRR1 , R1 STRSP, R1MOV SP, R4 ;设置堆栈指针LDRR3 , =OsEnterSum ;恢复新任务的OsEnterSumMSRSPS- cxsf , R5 ;恢复CPSRLDMFD SP!, R0 - R12 , LR, PC ;运行新任务系统时钟节拍中断函数OSTickISR()是一个周期性中断,为内核提供时钟节拍。其周期决定了内核所能给应用系统提供的最小时间间隔服务。本移植中,IRQ 是受C/ OS- II管理的中断,对 FIQ 不处
39、理。时钟节拍的移植可通过汇编宏完成。以上完成了C/ OS - II 在 S3C2410A 上的移植工作。为了测试移植代码的运行情况,建立两个C/ OS- II的任务,一个任务用于检测按键输入(本测试中为P0.14 口输入) ,称之为按键检测任务;另一个任务用于控制蜂鸣器,称之为蜂鸣器控制任务。蜂鸣器控制任务平时处于等待状态,当按键检测任务检测到有效按键输入时,立即唤醒蜂鸣器控制任务。S3C2410A 利用外扩的 16MB 的 FLASH 存储数据及程序,利用ADSV1.2 及 AXD 进行JTAG仿真调试,测试结果正确,脱机运行稳定,因此本移植成功。用户程序有键按下时请求中断软件延时去抖有键按
40、下确定按键位置获得键值键释放了中断返回图4-3 键盘中断处理YesNo4.2 键盘模块键盘的扫描方式有编程扫描方式、定时扫描方式和中断扫描方式三种。无论是编程扫描还是定时扫描,CPU 经常处于空扫描状态,为了提高CPU 利用效率,本设计中采用了中断扫描工作方式。设计过程中,键盘采用的控制芯片是HD7279A。HD7279是一片具有串行接口的可同时驱动8位共阴式数码管或独立的LED的智能显示驱动芯片。该芯片同时还可连接多达64键的键盘矩阵,单片即可完成显示键盘接口的全部功能。内部含有译码器可直接接受BCD码或16进制码并同时具有两种译码方式。在行列式键盘方式中,ARM对键盘的扫描采取程序控制方式
41、,一旦进入键扫描状态,则反复地扫描键盘,等待用户从按键上输入命令或数据。而在执行键入命令或处理键入数据过程中,ARM将不再响应键入要求,直到ARM返回重新扫描键盘为止。编程扫描程序流程图如图4-3所示。键盘驱动文件Key_driver主要包括ARM7279.c和keydriver.h两个文件,其中在keydriver.h中定义送给HD7279指令参量,主要有: #define cmd_reset 0xa4#define cmd_test 0xbf#define cmd_read 0x15#define decode1 0xc8在ARM7279.c中主要实现了:(1)写键盘指令程序 write7
42、279(unsigned char,unsigned char);(2)读键盘指令程序unsigned char read7279 (unsigned char);(3)向7279发送一个字节的程序 send_byte (unsigned char);(4)向7279接收一个字节的程序 unsigned char receive_byte (void);(5)键盘中断的初始化 KeyINT_Init (void); (6)键盘中断的服务子程序 Key_ISR(void);等一系列键盘处理程序。在ARM7279.c中,主要实现键盘的录入功能。当程序运行时,按下键盘,平时为高电平的HD7279A的
43、#KEY就会产生一个低电平,送给S3C2410A的外部中断5请求脚,在CPU中断请求位打开的状态下,CPU会立即响应外部中断5的请求,PC指针就跳入中断异常向量地址处,进而跳入中断服务子程序。当判断是外部中断5的中断请求时,则程序继续执行,CPU这时,通过发送#CS片选信号选中HD7279A,再发送时钟CLK信号和通过DATA线发送控制指令信号给HD7279A,HD7279A得到CPU发送的命令后,识别出该命令,然后扫描键盘,把得到的键值回送给CPU。键盘中断处理程序的主要代码如下:void Key_ISR( void ) int j;rINTMSK |= BIT_EINT4_7; /* 关中
44、断 */rEINTMASK |= 0x20;if (rEINTPEND & 0x20) for(j=0;j20;j+); /* 延时 */ key_number = read7279(cmd_read); rINTMSK &= (BIT_EINT4_7); rEINTMASK &= 0xffffdf; /* 外部中断5使能 */ write7279(decode1+5,key_number/16*8); write7279(decode1+4,key_number & 0x0f); OSMboxPost(Key_Mbox,&key_number);rSRCPND |= BIT_EINT4_7;
45、 rINTPND |= BIT_EINT4_7; rEINTPEND |= 0x20; 键盘的驱动程序编写好后,测试无误后加载到C/ OSII内核中。首先把编写好的Key_driver文件夹内的驱动程序加入已经移植好C/ OS-II操作系统的项目中,并且在HD7279.c 中加入:#include .UCOSIIINCincludes.h;它的目的是可以在该文件中使用C/ OSII源程序中的一些函数。并添加:extern OS_EVENT *Key_Mbox;这是声明一个已经定义的邮箱,将来得到的键值就放在这个邮箱里。在键盘中断服务子程序Key_ISR()中添加:OSMboxPost(Key_Mbox,&key_number); 这是把得到的键值放到邮箱里,这是C/ OSII提供的函数;其次,在Gui_Init()函数中,添加: Key_Init(); /*信号