嵌入式课程报告

时间:2024.4.20

 

嵌入式系统及应用设计报告

  

题 目  嵌入式Linux系统移植

专 业     电子与通信工程    

姓 名         王文平        

学 号      1320610012      


一、硬件设备介绍

 此次实验用的板子是友善之臂的Mini2440,Mini2440是一款基于ARM9的开发板,采用 Samsung S3C2440 芯片,并采用专业稳定的 CPU 内核电源芯片和复位芯片来保证系统运行时的稳定性。在进行器件地址说明之前,有一点需要注意,nGCS0 片选的空间在不同的启动模式下,映射的器件是不一样的。

在NAND Flash启动模式下,内部的 4KBytes BootSram被映射到nGCS0 片选的空间;在Nor Flash启动模式下( 非Nand Flash 启动模式) ,与nGCS0 相连的外部存储器Nor Flash 就被映射到nGCS0 片选的空间 SDRAM 地址空间:0x30000000 ~ 0x34000000。

嵌入式Linux系统的移植主要有U-Boot、Linux内核、文件系统这三部分。Uboot是在系统上电时开始执行,初始化硬件设备,准备好软件环境,然后才调用Linux操作系统内核。文件系统是Linux操作系统中用来管理用户文件的内核软件层。文件系统包括根文件系统和建立于Flash内存设备之上文件系统。根文件系统包括系统使用的软件和库,以及所有用来为用户提供支持架构和用户使用的应用软件,并作为存储数据读写结果的区域。 

二、Linux系统移植步骤

1. 准备工作,包括下载源码、建立交叉编译环境等。交叉开发是指在开发主机 上安装开发工具,编辑、编译目标板的引导程序、内核和文件系统,使其能在目标板上运行。
     2. 配置和编bootloader(引导装载程序)。通过这段小程序,可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统硬件环境,为最终调用操作系统内核做好准备。
     3.配置和编译Linux内核,对其进行相应的裁剪,修改内核以支持相关的硬件设备。
     4. 为大容量NAND Flash移植YAFFS文件系统,并将该文件系统加入Linux内核中。
     5.制作RAMdisk来挂载根文件系统。Linux系统中的文件和设备是通过文件系统来组织的。文件系统的存在使得数据和设备可以被有效而透明地存取访问。一个linux的最简根文件系统应该包括支持linux系统正常运行的基本内容,包括系统使用的软件和库,以及所有用来为用户提供基本支持的架构和指令。
    6. 烧写、调试系统;如果调试出错,则需要重新配置,返回上述步骤(2)。

三、U-Boot移植

3.1.U-Boot简介

U-Boot全称Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。但是U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。其它系列的处理器和操作系统基本是在20##年11月PPCBOOT改名为U-Boot后逐步扩充的。从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。

3.2. U-Boot移植的方法

U-Boot移植方法当前,对于U-Boot的移植方法,大致分为两种。一种是先用BDI2000创建目标板初始运行环境,将U-Boot镜像文件u-boot.bin下载到目标板RAM中的指定位置,然后,用BDI2000进行跟踪调试。其好处是不用将U-Boot镜像文件烧写到FLASH中去。但弊端在于对移植开发人员的移植调试技能要求较高,BDI2000的配置文件较为复杂。另外一种方法是用BDI2000先将U-Boot镜像文件烧写到FLASH中去,然后利用GDB和BDI2000进行调试。这种方法所用BDI2000的配置文件较为简单,调试过程与U-Boot移植后运行过程相吻合,即U-Boot先从FLASH中运行,再重载至RAM中相应位置,并从那里正式投入运行。唯一感到有些麻烦的就是需要不断烧写FLASH。但考虑到FLASH常规擦写次数基本为10万次左右,作为移植U-Boot,不会占用太多的次数,应该不会为FLASH烧写有什么担忧!U-Boot移植要点① BDI2000的配置文件。如果采用第二种移植方法,即先烧入FLASH的方法,配置项只需很少几个,就可以进行U-Boot的烧写与调试了。对PPC 8xx系列的主板,可参考DULG文档中TQM8xx的配置文件进行相应的修改。

3.3. 移植U-Boot的常见问题

在移植U-Boot的过程中会遇到很多问题,最主要的是一开始无法启动U-Boot。代码中很多地方设置有误都会导致无法启动,对于Stage1的代码来说,系统的出错信息是无法打印到串口或者其他设备的,此时可以使用JTag调试器调试目标开发板。对于汇编编写的代码,一般都与系统硬件息息相关,在编写的时候需要非常仔细。最好准备好ARM体系结构手册和S3C2440A芯片手册,并且认真阅读编程模型相关的章节,对硬件的初始化流程要细心分析。

四、Linux内核移植

4.1.内核简介

Linux 内核主要由5个模块构成,它们分别是:进程调度模块、内存管理模块、文件系统模块、进程间通信模块和网络接口模块。

进程调度模块用来负责控制进程对CPU资源的使用。所采取的调度策略是各进程能够公平合理地访问CPU,同时保证内核能及时地执行硬件操作。内存管理模块用于确保所有进程能够安全地共享机器主内存区,同时,内存管理模块还支持虚拟内存管理方式,使得Linux支持进程使用比实际内存空间更多的内存容量。并可以利用文件系统把暂时不用的内存数据块交换到外部存储设备上去,当需要时再交换回来。文件系统模块用于支持对外部设备的驱动和存储。虚拟文件系统模块通过向所有的外部存储设备提供一个通用的文件接口,隐藏了各种硬件设备的不同细节。从而提供并支持与其他操作系统兼容的多种文件系统格式。进程间通信模块子系统用于支持多种进程间的信息交换方式。网络接口模块提供对多种网络通信标准的访问并支持许多网络硬件。

4.2. 内核移植要点

Linux的代码完全开放以及其良好的结构设计非常适于嵌入式系统。移植Linux系统包括内核、程序库和应用程序,其中最主要的就是内核移植。由于Linux内核的开放性,出现了许多针对嵌入式硬件系统的内核版本,其中著名的包括μcLinux、RT-Linux等。Linux本身对内存管理(MMU)有很好的支持。因此,在移植的时候首先要考虑到目标硬件平台是否支持MMU。以ARM平台为例,ARM7内核的CPU不支持MMU,无法直接把Linux内核代码移植到ARM7核的硬件平台上。μcLinux是专门针对ARM7这类没有MMU的硬件平台上设计的,它精简了MMU部分代码。本实验的目标平台是S3C2440A,该处理器基于ARM9核,支持MMU,可以直接移植Linux 2.6版本的内核代码。

4.3.移植Linux内核对硬件的要求

1.目标平台

目标平台包括了嵌入式处理器和周围器件,处理器可能整合了一些周围器件,如中断控制器、定时器、总线控制器等。在移植之前需要确定被移植系统对外部设备和总线的支持情况。本书的ARM开发板采用mini2440平台,在S3C2440A外围连接了许多外围设备,包括NOR Flash存储器、NAND Flash存储器、网络接口芯片、USB控制器等。在S3C2440A处理器内部集成了许多常用的控制器以及嵌入式领域常用的总线控制器。对于移植Linux内核来说,操作处理器内部的控制器要比外部的设备容易得多。

2.内存管理单元(MMU)

前面提到过MMU,对于现代计算机来说,MMU负责内存地址保护、虚拟地址和物理地址相互转换工作。在使用MMU的硬件平台上,操作系统通过MMU可以向应用程序提供大于实际物理内存的地址空间,使应用程序获得更高性能。Linux的虚拟内存管理功能就是借助MMU实现的。在移植的时候要考虑目标平台的MMU操作机制,这部分代码是较难理解的,最好能在相似代码基础上修改,降低开发难度。

3. 内存映射

嵌入式系统大多都没有配备硬盘,外部存储器只有Flash,并且系统内存也非常有限。内存控制器(Memory Controller)负责内部和外部存储器在处理器地址空间的映射,由于硬件预设的地址不同导致每种平台内存映射的地址也不同。在移植时需要参考硬件的用户手册,得到内存地址的映射方法。

4存储器

由于嵌入式系统多用Flash存储器作为存储装置。对于文件系统来说,在PC流行的ext2、ext3文件系统在嵌入式系统无法发挥作用。幸好Linux支持许多文件系统,针对Flash存储器可以使用JFFS2文件系统。在移植的时候,不必要的文件系统都可以裁剪掉。
五、文件系统移植

5.1. 文件系统简介

文件系统是Linux操作系统的重要组成部分,Linux文件具有强大的功能。文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。

Linux和Windows文件类型最显着的区别就是Linux对目录和设备都当着文件来进行处理,这样就简化了对各种不同类型设备的处理,提高了效率。Linux文件类型最主要的有四种:

(1)普通文件:包括文本文件,Shell脚本,二进制可执行程序和各类型的数据

(2)目录文件:在Linux中,目录也是文件,它们包含文件名和子目录名以及指向那些文件和子目录的指针。目录文件时Linux中存储文件名的唯一地方,当把文件和目录相对应起来,也就是用指针将其连接起来之后,就构成了目录文件,因此,在对目录文件进行操作时,一般不涉及文件内容的操作,而只是对目录名和文件名的对应关系进行操作。另外,在Linux系统中的每个文件都被赋予一个唯一的值,而这个数值被称作索引节点。索引节点存储在一个称作索引节点表中,该表在磁盘格式化时没分配。一个索引节点包含文件的所有信息,包括磁盘数据的地址和文件类型。

(3)链接文件:链接文件相当于Windows的“快捷方式”,但是它有更强大的功能。可以实现对不同的目录、文件系统甚至是不同的机器上的文件直接访问,并且不必重新占用磁盘。

(4)设备文件:Linux把设备都当着文件一样来进行操作,这样就大大方便了用户的使用。在Linux下与设备相关的文件一般都在/dev下,包括两种:块设备和字符设备。 块设备是指数据读写时,他们是以块(如由柱面和扇区编址的块)为单位的设备,最简单的如硬盘(/dev/hda1)等。

5.2文件系统移植的方法

文件系统是基于被划分的存储设备上的逻辑上单位上的一种定义文件的命名、存储、组织及取出的方法。如果一个Linux没有根文件系统,它是不能被正确的启动的。因此,我们需要为Linux创建根文件系统,我们将其创建在K9S1208 NAND FLASH上。
Linux的根文件系统可能包括如下目录(或更多的目录):
(1)/bin (binary):包含着所有的标准命令和应用程序;
(2)/dev (device):包含外设的文件接口,在Linux下,文件和设备采用同种地方法访问的,系统上的每个设备都在/dev里有一个对应的设备文件;
(3)/etc (etcetera):这个目录包含着系统设置文件和其他的系统文件,例如/etc/fstab(file system table)记录了启动时要mount 的filesystem;
(4)/home:存放用户主目录;
(5)/lib(library):存放系统最基本的库文件;
(6)/mnt:用户临时挂载文件系统的地方;
(7)/proc:linux提供的一个虚拟系统,系统启动时在内存中产生,用户可以直接通过访问这些文件来获得系统信息;
(8)/root:超级用户主目录;
(9)/sbin:这个目录存放着系统管理程序,如fsck、mount等;
(10)/tmp(temporary):存放不同的程序执行时产生的临时文件;
(11)/usr(user):存放用户应用程序和文件。
采用BusyBox是缩小根文件系统的好办法,因为其中提供了系统的许多基本指令但是其体积很小。     在根文件系统中,为保护系统的基本设置不被更改,可以采用cramfs格式,它是一种只读的闪存文件系统。制作cramfs文件系统的方法为:建立一个目录,将需要放到文件系统的文件copy到这个目录,运行"mkcramfs 目录名 image名"就可以生成一个cramfs文件系统的image文件。

我们使用下面的命令可以mount生成的rootfs.ramfs文件,并查看其中的内容:mount -o loop -t cramfs rootfs.ramfs /mount/poin.对于cramfs闪存文件系统,如果没有ramfs的支持则只能读,而采用jfss2(The Journalling Flash File System version 2)文件系统则可以直接在闪存中读、写数据。jfss2 是一个日志结构(log-structured)的文件系统,包含数据和原数据(meta-data)的节点在闪存上顺序地存储。jfss2记录了每个擦写块的擦写次数,当闪存上各个擦写块的擦写次数的差距超过某个预定的阀值,开始进行磨损平衡的调整。调整的策略是,在垃圾回收时将擦写次数小的擦写块上的数据迁移到擦写次数大的擦写块上以达到磨损平衡的目的。

为使Linux支持yaffs文件系统,我们需要将其对应的驱动加入到内核中fs/yaffs/,并修改内核配置文件。使用我们使用mkyaffs工具可以将NAND FLASH中的分区格式化为yaffs格式(如/bin/mkyaffs /dev/mtdblock/0命令可以将第1个MTD块设备分区格式化为yaffs),而使用mkyaffsimage(类似于mkcramfs、mkfs.jffs2)则可以将某目录生成为yaffs文件系统镜像。嵌入式Linux还可以使用NFS(网络文件系统)通过以太网挂接根文件系统,这是一种经常用来作为调试使用的文件系统启动方式。通过网络挂接的根文件系统,可以在主机上生成ARM 交叉编译版本的目标文件或二进制可执行文件,然后就可以直接装载或执行它,而不用频繁地写入flash。如广州友善之臂的demo提供如下三种启动方式:
(1)从cramfs挂接根文件系统:root=/dev/bon/2();
(2)从移植的yaffs挂接根文件系统:root=/dev/mtdblock/0;
(3)从以太网挂接根文件系统:root=/dev/nfs。

把生成的文件系统烧到开发板中,当看到上图信息,这说明yaffs2 已经移植成功。

六、结论

     通过本实验详细的进行了u-boot、内核、根文件系统的移植,成功的配置成了自己想要的Linux系统,更加清楚的诠释了Linux可移植性高的特性。使得自己对mini2440更加深入的了解,也更加熟练了系统移植的过程。




第二篇:ARM7电子时钟嵌入式_课程设计报告


河海大学计算机及信息工程学院(常州)

课程设计报告

             基于LCD的电子时钟   

专业、学号    通信工程 0862310315    

     授课班号       277702               

     学生姓名       陈剑彬              

     指导教师       奚吉                  

     完成时间        2011/6/23           

                                                      


 

摘  要 ………………………………………………………………………………………………2

第一章  时钟设计 …………………………………………………………………………………3

第一节  课题目标          …………………………………………………………………..3

  第二节  程序和芯片的初始化…………………………………………………………………..4

  第三节  构建功能模块…………………………………………………………………………..5  第四节  实现信息的传递…………………………………………………………………..……  5

第二章  实验结果讨论          ……….……………………………………………………….6

  第一节   软件的编译,连接和运行     …………………………………………………….6

  第二节  protues 7.4仿真软件调试      ……………………………………………………..7

第三章  结论………………………………………………………………………………………8

心得体会……………………………………………………………………………………………9

参考文献 …………………………………………………………………………………………10

附    录 …………………………………………………………………………………………11

  源程序………………………………………………………………………………………11

 


摘要

     实时时钟(RTC器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。RTC具有计时准确、耗电低和体积小等特点,特别适用于在各种嵌入式系统忠记录事件发生的时间和相关信息,尤其是在通信工程、电力自动化、工业控制等自动化程度较高领域的无人职守环境。随着集成电路技术的不断发展,RTC器件的新品也不断推出。这些新品不仅具有准确的RTC,还有大容量的存储器、温度传感器和A/D数据采集通道等,已成为集RTC、数据采集和存储于一体的综合功能器件,特别适用于以微控制器为核心的嵌入式系统

                           Summary

     Real Time Clock (RTC) device can provide a calendar / clock, data storage and other features specific integrated circuit, commonly used for various computer systems, the clock source and the parameter settings stored in the circuit.RTC has a timing accuracy, low power consumption and small size and other characteristics, especially for embedded systems Zhong recorded in the event of time and information, especially in communication engineering, electric power automation, industrial control and other areas of higher degree of automationunattended environment.With integrated circuit technology continues to evolve, RTC also has introduced new devices.These new products not only have accurate RTC, there is a large-capacity memory, temperature sensor and A / D data acquisition channel, etc., has become a set of RTC, data collection and storage functions in one integrated device, particularly applicable to micro-controllercore embedded systems.

第一章  时钟设计

第一节  课题目标

    利用ARM 7芯片和LCD显示器,通过C语言编译,完成实时时钟(RTC)的显示。

第二节  程序和芯片初始化

  

   程序中包括:Lcd的初始化:

中断向量的初始化:

RTC的初始化:

     

第三节  构建功能模块

Lcd显示的时钟界面包括:静止不动的圆形钟面和一直在走动的时钟指针。

所以需要构建两个重要的函数实现画圆和画直线。

以下为画圆函数:

该算法是通过X变量的自增,补偿1 修正正方形控制Y变量自减,找到距中心恒定距离的点,其中rs=45,X自0加1增至45。和原点坐标运算,可以在第一象限找到一点,再通过折叠对称找到其他象限的三个点,通过画点函数描绘出。再画他的45度镜像就好了。

画线函数:void line(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2,unsigned char draw)

以中心的坐标为起点,使用while函数与指针最外圈的点比较,不断延长直至相等,所以事先计算出时针,分针和秒针三个同心圆最外圈点的坐标,以便带入函数。也同圆类似,要考虑不同象限点的情况,根据不同的位置带参数到画点函数中描绘。

       

第四节   实现信息的传递

画点函数:

数据传递函数:

与通用可编程输入输出口(General Programable Input Output)相连,把计算的数据传递给Lcd显示。


第二章  实验结果讨论

第一节   软件的编译,连接和运行

   构建完整的程序:

添加头文件,中断处理汇编程序段,初始化函数和主函数:

编译器提示:成功生成所需Hex文件,将得到的Hex文件导入仿真芯片

中,观察实时时钟。

第二节  protues 7.4仿真软件调试

   为Lpc 2104 芯片选择Hex文件路径:

连接芯片与LCD端口,运行程序,观察效果。

显示如下时钟界面:

    动态显示当前的时间,包括:年、月、日、时、分、秒,时针、分针和秒针为动态实时指示当前的时间。


第三章 

综合效果图:

以上为protues部分设计的,ads程序见附录。


心得体会

       回顾起此次课程设计,至今我仍感慨颇多,从理论到实践,我学到很多很多的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的内容。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才是真正的知识,才能提高自己的实际动手能力和独立思考的能力。在设计的过程遇到了各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计,把以前所学过的知识重新温故,巩固了所学的知识。


参考文献

[1] 谢自美,电子线路设计、实验、测试,华中理工大学出版社,2003。

[2] 宋春荣,通用集成电路速查手册,山东科学技术出版社,1995。

[3] Arnold Berger,嵌入式系统设计,吕骏 译, 北京:电子工业出版社, 2002

[4] 桑楠. 嵌入式系统原理及应用开发技术,北京:北京航空航天大学出版社,  2002


 

一、一、源程序:

#include "..\inc\config.h"

#define  STACKSIZE 256

#define x_line 160

#define y_line 80

OS_STK_DATA  stk;

extern  GUI_FONT CHINESE_FONT12;

extern  GUI_FONT CHINESE_FONT16;

extern  GUI_FONT GUI_Font8x16;

OS_EVENT * Send_LCD_Sem;

OS_EVENT *Key_Mbox;

I8 Hour[3],Min[3],Sec[3];

I8 hour = 0, min = 0, sec = 0,ms;

I8 YEA1[3],YEA2[3],MON[3],DAY[3];

int yea1 = 20,yea2=11, mon = 6, day = 23;

I8 XH0[3],XH1[3],XH2[3],XH3[3];

I8 XH4[3],XH5[3],XH6[3],XH7[3];

char xh0=01,xh1=62,xh2=31,xh3=03;

char xh4=32,xh5=36,xh6=02,xh7=12;

//int TimeCount = 0;

int SpaceXS[61]={160,165,170,175,180,185,

                    189,193,197,201,205,

                    206,207,208,209,210,

                    209,208,207,206,205,

                    201,197,193,189,185,

                    180,175,170,165,160,

                    155,150,145,140,135,

                    131,127,123,119,115,

                    114,113,112,111,110,

                    111,112,113,114,115,

                    119,123,127,131,135,

                    140,145,150,155,160,           

                },

      SpaceYS[61]={30,31,32,33,34,

                    35,39,43,47,51,

                    55,60,65,70,75,

                    80,85,90,95,100,

                    105,109,113,117,121,

                    125,126,127,128,129,

                    130,129,128,127,126,

                    125,121,117,113,109,

                    105,100,95,90,85,

                    80,75,70,65,60,

                    55,51,47,43,39,

                    35,34,33,32,31,30},

      SpaceXM[61]={160,164,168,172,176,180,183,186,189,192,

                      195,196,197,198,199,200,199,198,197,196,

                      195,192,189,186,183,180,176,172,168,164,

                      160,156,152,148,144,140,137,134,131,128,

                      125,124,123,122,121,120,121,122,123,124,

                      125,128,131,134,137,140,144,148,152,156,

                      160          

                    },

      SpaceYM[61]={40,41,42,43,44,45,48,51,54,57,

                      60,64,68,72,76,80,84,88,92,96,

                      100,103,106,109,112,115,116,117,118,119,

                      120,119,118,117,116,115,112,109,106,103,

                      100,96,92,88,84,80,76,72,68,64,

                      60,57,54,51,48,45,44,43,42,41,

                      40

                     },

      SpaceXH[13]={160,175,185,190,185,175,160,145,135,130,135,145,160},

      SpaceYH[13]={50,55,65,80,95,105,110,105,95,80,65,55,50},

      *Placex=&SpaceXS[0],*Placey=&SpaceYS[0],*Placexm=&SpaceXM[0],*Placeym=&SpaceYM[0],

      *Placexh=&SpaceXH[0],*Placeyh=&SpaceYH[0];

void Display_xh1(char xx1,char yy1);

void Display_xh2(char xx2,char yy2);

void Display_xh3(char xx3,char yy3);

void show(I8 s)

{

      if(s%4==0)

      {

      Set_Color(GUI_BLUE);

      Set_Font    (&CHINESE_FONT16);

      Disp_String (CN_start"CN_end,48,210);

      Set_Font(&GUI_Font8x16);

      Display_xh3(250,210);

      Display_xh2(250,190);

      Display_xh1(250,170);

      Set_Color(GUI_RED);

      Set_Font    (&CHINESE_FONT16);

     Display_xh1(250,210);

     }

     else if(s%4==1)

     {

          Set_Color(GUI_YELLOW);

          Set_Font    (&CHINESE_FONT16);

          Disp_String (CN_start""CN_end,48,210);

          Set_Color(GUI_YELLOW);

     Fill_Circle (288,50,25);

           Display_xh1(250,210);

     }

     else if(s%4==2)

     {

          Set_Color(GUI_BLUE);

          Set_Font    (&CHINESE_FONT16);

          Disp_String (CN_start""CN_end,48,210);

          Set_Color(GUI_WHITE);

         Set_Font    (&CHINESE_FONT16);

          Disp_String (CN_start""CN_end,48,210);

          Set_Color(GUI_WHITE);

          Set_Font(&GUI_Font8x16);

           Display_xh2(250,210);

     }

     else if(s%4==3)

    {

          Set_Color(GUI_BLUE);

           Set_Font(&GUI_Font8x16);            

           Disp_String ("CLOCK",10,10);

           Set_Font    (&CHINESE_FONT16);

           Disp_String (CN_start""CN_end,48,210);

          Set_Color(GUI_LIGHTMAGENTA);

         Set_Font    (&CHINESE_FONT16);

           Disp_String (CN_start""CN_end,48,210);

           Set_Color(GUI_LIGHTMAGENTA);

     }

}   

void Shows()

{

      show(sec);

      Set_Color(GUI_GRAY);      //擦除上一秒的

     Draw_Line(x_line,y_line,*Placex,*Placey);

     Placex=Placex+1;

     Placey=Placey+1;

   

     Set_Color(GUI_YELLOW);   //显示下一秒的 

     Draw_Line(x_line,y_line,*Placex,*Placey);

     Set_Color(GUI_RED);      //显示下一分的

    

     Draw_Line(x_line,y_line,*Placexm,*Placeym);

     Set_Color(GUI_GREEN);    //显示下一时的 

     Draw_Line(x_line,y_line,*Placexh,*Placeyh);

   

     if(Placex==&SpaceXS[60]&&Placey==&SpaceYS[60])

     {

     Placex=&SpaceXS[0];

     Placey=&SpaceYS[0];

     }  

}

void Showm()

{   

      Set_Color(GUI_GREEN);

     Fill_Circle (288, 50, 25);

     Set_Color(GUI_RED);

     Fill_Circle (280, 50, 10);

      Fill_Circle (296, 50, 10);

     Fill_Circle (288, 40, 10);

      Fill_Circle (288, 60, 10);

      Set_Color(GUI_YELLOW);

     Fill_Circle (288, 50, 5);

    

      Set_Color(GUI_GRAY);      //擦除上一分的

      Draw_Line(x_line,y_line,*Placexm,*Placeym);

     Placexm=Placexm+1;

      Placeym=Placeym+1;

      Set_Color(GUI_RED);      //显示下一分的

      Draw_Line(x_line,y_line,*Placexm,*Placeym);

      Set_Color(GUI_GREEN);   //显示下一时的 

     Draw_Line(x_line,y_line,*Placexh,*Placeyh);

    

      if(Placexm==&SpaceXM[60]&&Placeym==&SpaceYM[60])

      {

           Placexm=&SpaceXM[0];

           Placeym=&SpaceYM[0]; 

      }

   

}

void Showh()

{

      Set_Color(GUI_YELLOW);

     Fill_Circle (288, 50, 25);

     Set_Color(GUI_GREEN);

     Fill_Circle (280, 50, 10);

      Fill_Circle (296, 50, 10);

     Fill_Circle (288, 40, 10);

      Fill_Circle (288, 60, 10);

      Set_Color(GUI_RED);

     Fill_Circle (288, 50, 5);

    

      Set_Color(GUI_GRAY);      //擦除上一时的

      Draw_Line(x_line,y_line,*Placexh,*Placeyh);

      Placexh=Placexh+1;

      Placeyh=Placeyh+1;

      Set_Color(GUI_GREEN);   //显示下一时的 

      Draw_Line(x_line,y_line,*Placexh,*Placeyh);

    

      if(Placexh==&SpaceXH[12]&&Placeyh==&SpaceYH[12])

      {

           Placexh=&SpaceXH[0];

           Placeyh=&SpaceYH[0];

      }

}

void Shouw_Cricle()    // 整 点

{

     Set_Color(GUI_YELLOW);

    Fill_Circle (160, 30,2);     // 12点(x,y,r)

    Fill_Circle (135, 35,2);     // 11 点(x,y,r)

    Fill_Circle (115, 55,2);     // 10 点(x,y,r)

    Fill_Circle (110, 80,2);     // 9 点(x,y,r)

    Fill_Circle (115, 105,2);     // 8 点(x,y,r)

    Fill_Circle (135, 125,2);     // 7 点(x,y,r)

    Fill_Circle (160, 130,2);     // 6 点(x,y,r)

    Fill_Circle (185, 125,2);     // 5 点(x,y,r)

    Fill_Circle (205, 105,2);     // 4 点(x,y,r)

    Fill_Circle (210, 80,2);     // 3 点(x,y,r)

    Fill_Circle (205, 55,2);     // 2点(x,y,r)

    Fill_Circle (185, 35,2);     // 1点(x,y,r)

   Set_Color(GUI_WHITE);

    Fill_Circle (165, 31,1);  

    Fill_Circle (170, 32,1);

    Fill_Circle (175, 33,1);

    Fill_Circle (180, 34,1); 

    Fill_Circle (189, 39,1);    

    Fill_Circle (193, 43,1);    

    Fill_Circle (197, 47,1);    

    Fill_Circle (201, 51,1);

    Fill_Circle (206, 60,1);    

    Fill_Circle (207, 65,1);   

    Fill_Circle (208, 70,1);    

    Fill_Circle (209, 75,1);

    Fill_Circle (209, 85,1);    

    Fill_Circle (208, 90,1);    

    Fill_Circle (207, 95,1);    

    Fill_Circle (206, 100,1);   

    Fill_Circle (201, 109,1);    

    Fill_Circle (197, 113,1);   

    Fill_Circle (193, 117,1);    

    Fill_Circle (189, 121,1);  

   Fill_Circle (180, 126,1);    

    Fill_Circle (175, 127,1);   

    Fill_Circle (170, 128,1);    

    Fill_Circle (165, 129,1);   

   Fill_Circle (155, 129,1);    

    Fill_Circle (150, 128,1);   

    Fill_Circle (145, 127,1);   

    Fill_Circle (140, 126,1);   

    Fill_Circle (131, 121,1);    

    Fill_Circle (127, 117,1);   

    Fill_Circle (123, 113,1);   

    Fill_Circle (119, 109,1);   

    Fill_Circle (114, 100,1);   

    Fill_Circle (113, 95,1);   

    Fill_Circle (112, 90,1);  

    Fill_Circle (111, 85,1);    

    Fill_Circle (111, 75,1);   

    Fill_Circle (112, 70,1);  

    Fill_Circle (113, 65,1);    

    Fill_Circle (114, 60,1);   

    Fill_Circle (119, 51,1);   

    Fill_Circle (123, 47,1);    

    Fill_Circle (127, 43,1);   

    Fill_Circle (131, 39,1);

    Fill_Circle (140, 34,1);   

    Fill_Circle (145, 33,1);   

    Fill_Circle (150, 32,1);    

    Fill_Circle (155, 31,1);   

    }

void Delay(int time);

void ChangeForm(char Time[],char time)

{

    Time[0] = time / 10 + 48;

    Time[1] = time % 10 + 48;

    Time[2] = '\0';

}

void Display_Time(char x,char y) 

{

    ChangeForm(Hour, hour);

    ChangeForm(Min,  min);

    ChangeForm(Sec,  sec);

    ChangeForm(MON,  mon);

    ChangeForm(DAY,  day);

    ChangeForm(YEA1,  yea1);

    ChangeForm(YEA2,  yea2);

    Disp_String (Hour,x,160);

    Disp_String (":",x + 16,160);

    Disp_String (Min,x + 24,160);

    Disp_String (":",x + 40,160);

    Disp_String (Sec,x + 48,160);

   

    Disp_String (YEA1,x  ,  180); 

    Disp_String (YEA2,x +16,180);

    Disp_String (",",x + 32,180);

    Disp_String (MON,x + 40,180);

    Disp_String (",",x + 56,180);

    Disp_String (DAY,x + 64,180);   

}

void Display_xh1(char xx1,char yy1)//

{

      ChangeForm(XH0, xh0);

      ChangeForm(XH1, xh1);

      ChangeForm(XH2, xh2);

      ChangeForm(XH3, xh3);

      ChangeForm(XH4, xh4);

      Disp_String (XH0,xx1,yy1);

      Disp_String (XH1,xx1+16,yy1);

      Disp_String (XH2,xx1+32,yy1);

      Disp_String (XH3,xx1+48,yy1);

      Disp_String (XH4,xx1+48,yy1);

}

void Display_xh2(char xx2,char yy2)//

{

      ChangeForm(XH0, xh0);

      ChangeForm(XH1, xh1);

      ChangeForm(XH2, xh2);

      ChangeForm(XH3, xh3);

      ChangeForm(XH5, xh5);

      Disp_String (XH0,xx2,yy2);

      Disp_String (XH1,xx2+16,yy2);

      Disp_String (XH2,xx2+32,yy2);

      Disp_String (XH3,xx2+32,yy2);

      Disp_String (XH5,xx2+48,yy2);

}

void Display_xh3(char xx3,char yy3)//

{

      ChangeForm(XH0, xh0);

      ChangeForm(XH1, xh1);

      ChangeForm(XH2, xh2);

      ChangeForm(XH6, xh6);

      ChangeForm(XH7, xh7);

      Disp_String (XH0,xx3,yy3);

      Disp_String (XH1,xx3+16,yy3);

      Disp_String (XH2,xx3+32,yy3);

      Disp_String (XH6,xx3+48,yy3);

      Disp_String (XH7,xx3+48,yy3);

}

void Show_Color()

{

     Set_Color( GUI_BLUE );

     Fill_Rect(0,0,319,239);

    

     Set_Color(GUI_RED);

     Set_BkColor (GUI_BLUE);

     Fill_Rect(0,0,319,2);

    Fill_Rect(0,0,2,239);

    Fill_Rect(0,237,319,239);

    Fill_Rect(317,0,319,239);

    Set_Color(GUI_RED);

    Set_Font    (&CHINESE_FONT16);

     Disp_String (CN_start"姓名:"CN_end,5,210);

     Disp_String (CN_start"学号:"CN_end,210,210);

     Set_Color(GUI_WHITE );     

     Fill_Rect (79,17,242,20);     //上线(x0,y0,x1,y1)

     Fill_Rect (79,20,82,202);     //左线(x0,y0,x1,y1)

     Fill_Rect (238,20,242,202);   //右线(x0,y0,x1,y1)

     Fill_Rect (79,199,242,202);   //下线(x0,y0,x1,y1)

     Set_Color(GUI_LIGHTRED);

     Fill_Rect (83,21,237,198);  

}

/*分配各任务的堆栈容量

*/

OS_STK Stack_Task_1[STACKSIZE];

OS_STK Stack_Task_2[STACKSIZE*3];

/*

void Task_3(I8 s)

{

     I8 display;

    for(;;)

    {

    Delay(100);

    display++;

    Set_Color(GUI_RED);   

    Display_xh1(5,180);

    if(display==1000)

    {

         display=0;

    }

    }

}

/*

- 函数名称 : Task_2(void *pdata)

- 函数说明 : GUI任务,优先级为9

- 输入参数 : pdata

- 输出参数 : 无

*/

void Task_2(void *pdata)

{   

     for(;;)

     {

          Show_Color();

          Shouw_Cricle();                    

          Set_Color(GUI_RED);   

         sec = 0;

         Set_Color(GUI_YELLOW);    //显示

        Draw_Line(x_line,y_line,*Placex,*Placey);

        Display_Time(130, 160);//时间

          do

          {

            Delay(1200);

            sec++;

           Shows();

            if (sec >= 60)

            {

              sec = 0;

              min++;

              Showm();

              if (min >= 60)

              {

                min = 0;

                hour++;

                Showh();

                if (hour >= 23)

                {

                    hour = 0;   

                    day++;

                    if(day >=32)

                    {

                        day = 1;

                        mon++;

                        if(mon >= 13)

                        {

                             mon = 1;

                             yea1++;

                        }

                    }        

                 }

               }

            }   

            Display_Time(130, 160);//时间 日期

          }while(1);

     }

}        

void Task_1(void *pdata)

{

    Rtc_Tick_Init();     //打开时钟节拍,让操作系统跑起来                            

     OSTaskCreate(Task_2, (void *)0, (OS_STK *)&Stack_Task_2[(STACKSIZE*3) - 1], 9);  

    for(;;)

    {

    OSTimeDly(50);     //时钟屏幕显示

    }

}

void Main(void)                           

{

    Target_Init();          // ARMII实验系统的初始化,包括CPU板

    GUI_Init();

    OSInit();

     OSTaskCreate(Task_1, (void *)0, (OS_STK *)&Stack_Task_1[STACKSIZE - 1], 5);  //创建任务一

    OSStart();  

}

更多相关推荐:
嵌入式课程设计报告

福建工程学院嵌入式系统课程设计报告书题目基于S3C2440设备驱动及其界面设计班级姓名学号指导老师陈靖张平均李光炀2目录一设计课题4二设计目的4三设计任务及要求4四设计内容5五操作界面的生成7六操作界面调试9七...

嵌入式课程设计报告

福州大学课程设计任务书课程嵌入式课程设计题目姓名李仁煌学号011000610系别电机电器专业电气工程与自动化年级20xx起讫日期20xx61020xx74指导教师王武目录1课程设计目的22课程设计题目和实现目标...

嵌入式系统课程设计报告

嵌入式系统课程设计报告基于ARM的楼宇对讲系统设计摘要采用模块化设计方法设计出一款基于ARM微控制芯片和Linux操作系统的楼宇对讲系统,该对讲系统通过以太网与楼宇间的各室内机相连,实现了安装在楼道门口的终端机…

嵌入式课程设计报告

嵌入式系统开发课程设计专周报告题目:具有日历功能的电子时钟系别及专业:计算机工程系计算机应用技术班级:10511学生姓名:XXX指导老师:XX完成时间:20XX-12-24/20XX-12-28目录前言....…

嵌入式课程设计报告

课程设计综合实验报告20xx20xx年度第1学期名称题目院系班级学号学生姓名指导教师设计周数成绩日期年月日一课程设计的目的与要求11目的掌握嵌入式系统的基本原理及其基于COSII操作系统的实现方法本次设计使用A...

嵌入式系统课程设计实验报告

7嵌入式系统课程设计必做部分学院电控学院专业通信工程设计名称IIC同步串行通讯1设计的目的1掌握S3C44B0IIC控制器的编程方法2编程实现串行EEPROM存储器24C16的数据存储和访问2设计的内容1学习S...

嵌入式课程设计报告

中南大学嵌入式课程设计基于ARM平台的打地鼠游戏姓名董嘉伟学号0909103303班级物联网1002时间20xx913目录课程设计内容课程设计实验环境课程设计原理分析课程设计开发计划课程设计系统设计图课程设计关...

嵌入式系统设计课程设计

电气与电子信息工程学院嵌入式系统设计课程设计设计题目基于COSII88点阵的设计与制作专业班级电子信息工程20xx2班学号xxxxxxxxxxxxx姓名坏水指导教师李玉平王海华设计时间20xx111920xx1...

嵌入式课程设计报告

湖北汽车工业学院HubeiAutomotiveIndustriseInstitute课程设计说明书课程名称设计题目班号专业学号学生姓名指导教师签字起至日期年月日年月日目录一目的与要求3二设计内容3三总体方案设计...

嵌入式课设报告

课程设计报告课程名称嵌入式信息系统题目嵌入式Linux设备驱动程序设计指导教师周金和设计起止日期20xx120至20xx128系别信息与通信工程系专业电子信息工程学生姓名班级学号成绩目录一驱动基本概念3二重...

江苏大学嵌入式课程设计报告

嵌入式系统课程设计报告学院名称电气学院专业班级电科1102学生姓名胡志文学号Linux下的SOCKET通信实验摘要1掌握LinuxSOCEKT编程的常用函数编写服务器程序server编写客户端程序client编...

嵌入式课程设计报告--电子计算器

重庆科技学院嵌入式体系结构与接口技术课程设计报告学院电气与信息工程学院专业班级计科20xx04学生姓名杜江龙学号20xx4420xx设计地点单位电气与信息工程学院I302实验室设计题目电子计算器完成日期20xx...

嵌入式课程设计报告(44篇)