第一篇:嵌入式系统设计与应用
第一章:
嵌入式系统定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能,可靠性,成本,体积,功耗严格要求的专用计算机系统。(一切非PC计算机系统)嵌入式系统特点:“专用”计算机系统,运行环境差异很大,比通用PC系统资源少,功耗低,体积小,集成度高,成本低,具有完整的系统测试和可靠性评估体系,具有较长的生命周期,需要专用开发工具和方法进行设计,包含专用调试电路,多学科知识集成系统。嵌入式系统应用范围:汽车,工业控制,通信设备,消费电子,商业终端,航空航天,军事需求。
嵌入式系统的基本开发流程:系统定义与需求分析阶段,方案设计阶段,详细设计阶段,软、硬件集成测试阶段,系统功能性测试及可靠性测试阶段。
系统定义与需求分析阶段:对系统需求进行分析,制定系统的设计依据。方案设计阶段:确定系统初步设计方案并形成设计描述文档。详细设计阶段:完善初步方案,对方案实施详细设计。
软硬件集成测试阶段:对系统软硬件进行综合测试,验证系统设计功能。
系统功能性能测试及可靠性测试测试:对系统功能,性能,可靠性进行综合测评。
对于使用操作系统的嵌入式系统来说,嵌入式系统软件结构一般包含4个层面:板级支持包层,实时操作系统(RTOS)层,应用程序接口(API)层,应用程序层。有些资料将应用程序接口API归属于OS层,按3层划分的应用程序控制系统的运作和行为;操作系统与硬件无关,不同的嵌入式操作系统其组成结构也不尽相同 嵌入式操作系统种类繁多,大体分为两种:商用型和免费型
商用型:VxWorks,Windows CE,pSoS,Palm OS,OS-9,LynxOS,QNX和LYNX 免费型:Linux和uC/OS—II uC/OS—II具有执行效率高,占用空间小,可移植性及扩展性强,实施性能优良,稳定性和可靠性良好等特点。其内核采用微内核结构,将基本功能(如进程管理,存储管理,中断处理)放在内核中,留给用户一个标准API函数,并根据各个任务的优先级分配CPU时间。交叉开发环境:交叉开发是指一个通用计算机上进行软件的编辑编译,然后下载到嵌入式设备中进行调试的开发方式,它通常采用宿主机/目标机模式。
第二章:
RISC是精简指令集
精简指令集体系结构的优点:硬连线的指令译码逻辑,便于流水线执行,大多数RISC指令为单周期执行。
精简指令集处理器的优点:处理器关心面积小,开发时间缩短,开发成本降低,容易实现高性能,低成本的处理器。
精简指令集体系结构缺点:与CISC相比,通常RISC的代码密度低;RISC不能执行x86代码;RISC给优化编译程序带来了困难
ARM设计采用的RISC技术特征主要有:Load/Store体系结构,固定的32位指令,3地址指令格式。
ARM7TDM名称具体含义:ARM7:32位ARM体系结构4T版本;T:Thumb16位压缩指令集;D:支持片上Debug,使处理器能够停止以响应调试请求;M:增强型Multiplier,与前代相比具有较高的性能且产生64位的结果。I:EmbeddedICE硬件以支持片上断点和观察点。ARM7 3级流水线:(取指级,译码级,执行级)ARM9TDMI 流水线操作:(取指,译码,执行,缓冲/数据,回写)5级 ARM处理器核可工作两种状态:ARM状态和Thumb状态
从ARM进入Thumb状态,当操作数寄存器Rm的状态位bit[0]为1时,执行“BX Rm”指令进入Thumb状态
从Thumb进入ARM状态,当操作数寄存器Rm的状态位bit[0]为0时,执行“BX Rm”指令进入ARM状态
ARM处理器工作模式(共7种):除用户模式外的其他六种模式称为特权模式。特权模式:主要处理异常和监控调用(有时也称为软件中断),他们可以自由地访问系统资源和切换模式
ARM处理器总共有37个寄存器,均为32位 ARM状态下的通用寄存器分为3类: 未分组寄存器:R0~~R7(为公用寄存器)
分组寄存器:R8~~R14
R13通常用于堆栈指针SP
R14用做子程序链接寄存器
程序计数器:R15(PC)
用做程序计数器
ARM程序状态寄存器中
条件码标志(N Z C V)
N——在结果是带符号的二进制补码的情况下,结果为负,N=1 否则为0 Z——结果为0 Z=1 否则为0 C——针对加法:产生进位
C=1 否则为0
针对减法:产生借位
C=0 否则为1
针对有移位操作的非加减法指令
C为移位操作中最后移出位的值
对于其他指令
C通常不变
V——对于加减法指令
操作数和结果为带符号的整数时,产生溢出
V=1 否则为0
对于其他指令
V通常不发生变化 ARM的异常中断响应过程: 一:将CPSR的内容保存到将要执行的异常中断对应的SPSR中,以实现对处理器当前状态,中断屏蔽字以及各条件标志位的保存。二:设置当前状态寄存CPSR中的相应位:
设置CPSR模式控制位CPSR[4:0],使处理器进入相应的执行模式
当进入Reset或FIQ模式时,还要设置中断标志位(CPSR[6]=1)禁止FIQ中断,否则其值不变
设置中断标志位(CPSR[7]=1),禁止IRQ中断
三:将寄存器LR-
四:给程序计数器PC强制赋值,使程序从相应的向量地址开始执行中断处理程序。
非向量中断和中断向量的区别和联系
异常中断的优先级:复位(最高),数据异常中断,FIQ,IRQ,取值指异常中止,SWI未定义指令
ARM支持的数据类型(6种):8位有符号和无符号字节
16位有符号和无符号半字,以2字节的边界定位
32位有符号和无符号半字,以4字节的边界定位
ARM存储器组织:以字节为单位寻址的存储器中有“小端”和“大端”两种方式存储字 小端格式:较高的有效字节存放在较高的存储器地址,较低的有效字节存放在较低的存储器地址
大端格式:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址
ARM处理器能方便地配置为其中任何一种存储器方式,但他们的缺省设置为小端格式(71页有题)
ARM7TDM内核的重要特性:53页最上面
第三章:
指令分类中基本指令格式
S
可选后缀,若指定S,则根据指令执行结果更新CPSR中的条件码 ARM寻址方式
立即寻址有选择题
寄存器间接寻址:ARM的数据传送指令都是基于寄存器间接寻址,即通过Load/Store完成对数据的传送操作
103页举例
可能为考题
伪操作
是ARM汇编语言程序里的一些特殊指令助记符,它的作用主要是为完成汇编程序做各种准备,在源程序进行汇编时由汇编程序处理,而不是在计算机运行期间由机器执行 ARM嵌入式系统程序设计可以分为ARM汇编语言程序设计、嵌入式C语言程序设计以及C语言与汇编语言的混合编程。
ARM汇编程序中
AREA指示符定义本程序段位代码段
即申请一个定义段 161页程序
可能考
嵌入式C语言程序设计中修饰符:interrupt、near、far、huge Interrupt在函数修饰为中断函数,没有输入和输出参数 第三章课后习题见李向妮笔记
第四章
DMA
I2C
I2S 基于S3C44B0X的最小系统设计:
嵌入式最小系统是指保证嵌入式微处理器可靠工作所必需的基本电路组成的系统,通常包括处理器单元、时钟单元、复位单元、、存储器单元、供电电源和调试接口。
基于ARM的嵌入式最小系统基本组成包括:基于ARM核的微处理器、电源电路、复位电路、时钟电路、存储器电路(FLASH和SDRAM)、UART接口电路和JTAG调试接口
第五章:
uC/OS—II采用的抢占式内核是一个真正的实时操作系统
uC/OS—II基本特点:源码开放;可移植性;可裁剪;抢占式内核;可扩展的多任务;可确定的执行时间;中断管理;稳定性和可靠性
uC/OS—II的文件结构(与内核功能相关的文件):任务管理;同步通信;内存管理;时间管理
uC/OS—II任务及其运行状态:
任务是一个简单的程序,对应于实际应用中的一个逻辑功能。对uC/OS—II来说,任务是系统运行的基本单元,系统以任务为单元分配内存资源和处理时间,每个任务都有自己独立的寄存器和栈空间。
任务看起来就像一个无限循环永不返回的函数,但是不同于函数的是,它有一套自己的内存空间,运行时完全占用处理器资源,在任意确定的时刻都处于休眠、就绪、运行、挂起以及中断服务这五种状态之一 图见书上337
第六章
uCLinux与标准Linux的最大区别就在于内存管理。标准Linux是针对有MMU的处理器设计的
uCLinux不使用虚拟内存管理技术,采用的是实存储器管理策略,也就是说uCLinux系统对内存的访问是直接的
uCLinux与标准Linux系统在进程的创建
进程的执行
进程的终止
上有着显著不同 基于uCLinux操作系统的应用开发环境一般是由目标系统硬件开发板和宿主PC机所构成。目标硬件开发板用于运行操作系统和系统应用软件,而目标板所用到的操作系统的内核编译、电子词典应用程序的开发和调试则需要通过宿主PC机来完成。目标板用来进行内核编译
PC机用来进行调试
移植就是使一个实时操作系统能够在某个微处理器平台上或者微控制器上运行。uCLinux移植包括3个层次的移植: 处理器结构层次移植、芯片层次移植、板级移植。
移植思路:开发环境确定以后,首先,要为uCLinux设计一个BootLoader,通过BootLoader来初始化硬件,引导uCLinux运行。BootLoader的设计可以在ads中或者Linux中实现。其次,针对硬件环境和设计的BootLoader修改uClinux内核。最后,在交叉编译环境下配置、编译、链接uClinux,下载编译得到的印象文件到FLASH,通过BootLoader来启动uCLinux。如果参数默认或者无参数,则先执行BootLoader,否则BootLoader第二位,参数执行为第一位。
第二篇:基于嵌入式系统的图形界面应用设计范文
目录 嵌入式系统概述...................................................................................................................4
1.1 嵌入式系统简介.......................................................................................................4 1.2 嵌入式系统的组成...................................................................................................5 1.3 本课题的背景和意义...............................................................................................5 2 硬件平台及ARM体系结构................................................................................................7
2.1 处理器选择...............................................................................................................7 2.2 ARM体系结构............................................................................................................7 3 软件平台...............................................................................................................................9
3.1嵌入式操作系统选择................................................................................................9 3.2 交叉编译环境的建立.............................................................................................10 3.2.1 上位机的软硬件配置.........................................................................................10 3.2.2 硬件连接与调试.............................................................................................11 3.2.3 配置TFTP及NFS服务...................................................................................13 3.2.4 安装交叉编译工具.........................................................................................15 4 移植 Bootloader.................................................................................................................16 4.1 Bootloader 概述.................................................................................................16 U-boot 简介...................................................................................................................17 4.2.1 U-boot 的获取.................................................................................................17 4.2.2 U-boot 目录结构.............................................................................................17 U-boot 的启动过程及工作原理...................................................................................18 4.3.1 启动模式介绍...................................................................................................18 4.3.2 启动阶段1分析...............................................................................................19 4.3.3 启动阶段2分析...............................................................................................20 U-boot的移植过程........................................................................................................20 4.4.1 准备工作...........................................................................................................20 4.4.2 添加支持 NAND Flash 启动功能...................................................................21 4.4.3 添加 NAND Flash 读写功能.......................................................................22 4.4.4 修改 U-boot环境变量保存方式....................................................................22 4.4.5 加入 NAND Flash 闪存型号支持...............................................................23 4.5 U-boot 的烧写及测试.........................................................................................23 4.6 设置U-boot环境变量..................................................................................................24 5 Linux 内核的移植.............................................................................................................25 Linux 内核的结构.........................................................................................................25 Linux 启动过程简析.....................................................................................................26 Linux内核的移植过程..................................................................................................26 5.3.1 选择参考板.......................................................................................................26 5.3.2 修改 NAND Flash 分区信息...........................................................................26 5.3.3 关闭 ECC 校验.................................................................................................27 5.4 CS8900a网卡的移植过程....................................................................................28 5.4.1 修改硬件地址映射...........................................................................................28 5.4.2 添加 CS8900A 内核编译项.............................................................................28 5.5 Linux 内核的剪裁配置.......................................................................................29 5.5.1 使用配置菜单...........................................................................................................29 5.5.2 基本配置选项...................................................................................................30 5.5.3 驱动程序配置选项...................................................................................................31 5.5.4 保存配置文件...................................................................................................31 5.5.5 编译 Linux 内核.............................................................................................31 5.6 内核的下载及启动...............................................................................................32 5.6.1 将引导信息加入内核映像...............................................................................32 5.6.2 内核映像的下载及运行...................................................................................32 6 建立根文件系统.................................................................................................................33 6.1 根文件系统概述...................................................................................................33 6.1.1 根文件系统简介...........................................................................................33 6.1.2 NFS 文件系统与Cramfs文件系统...................................................................33 6.2 建立Linux根文件系统目录...............................................................................33 7 心得体会.............................................................................................................................34 基于嵌入式系统的图形界面应用设计 嵌入式系统概述
1.1 嵌入式系统简介
嵌入式系统是一种以应用为目的,软硬件可裁减,适应应用系统对功能、成本、体积、功耗严格要求的专用计算机系统。随着计算机的发展和应用的普及,嵌入式系统取得了迅猛的发展,嵌入式产品已经渗透到社会经济、军事、交通、通信等相关行业,而且深入到家电、娱乐等各个领域,掀起了一场数字化革命。嵌入式图形用户界面系统是嵌入式系统的一个重要组成部分,它将极大的促进嵌入式技术的发展和应用。
嵌入式系统是当前最热门、最有发展前途的IT应用技术之一。一方面,嵌入式系统广泛的应用于智能家电、手持终端、工业控制等专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高;另一方面,随着计算机技术的发展,越来越多的嵌入式系统设备需要良好的人机交互界面,这需要一个高性能、高可靠、占用系统资源少的用户图形界面的支持。为了适应嵌入式设备对人机交互界面的要求,本论文对基于嵌入式Linux图形用户界面的设计实现进行了研究。
一方面,嵌入式硬件性能不断提升,使得嵌入式设备上运行精美的图形用户界面成为可能;另一方面,嵌入式手持式消费电子产品的普及,例如PDA(个人数字助理)、智能手机、PMP(便携式多媒体播放器),一个完善的嵌入式图形用户界面成为不可缺少的组成部分,嵌入式GUI(图形用户界面:Graphical User Interface)为嵌入式系统提供了一种应用于特殊场合的人机交互接口。
纵观国际相关产业在图形用户界面方面的发展现状,许多国际知名公司早已认识到GUI在嵌入式产品方面产生的强大增值功能,以及带动的巨大市场价值,因此在公司内部成立了专门从事GUI研究与设计的部门。
图形用户界面(GUI)是一种结合计算机科学、美学、心理学、行为学,以及商业领域需求分析的人机系统工程。这种面向用户的系统工程设计目的是优化产品性能,使操作更人性化,减轻使用者的认知负担,使其更适合用户的操作需要,直接提升产品的市场竞争力。
图形用户界面的广泛流行是当今计算机技术的重大成就之一,它极大的方便了非专业用户的使用,可以通过窗口、菜单方便的进行操作。一个图形用户界面通常由三个基本层次组成,也就是显示模型、窗口模型和用户模型。用户模型包含了显示和交互的主要特征,因此用户图形界面有时也仅指用户模型。
然而,对于嵌入式系统来说,由于其固有的体积、功耗以及价格的限制,使得传统的图形用户界面并不能直接应用于嵌入式系统[41,在嵌入式系统上实现GUI是一个具有挑战性的课题。总的来说,嵌入式GUI要求简单、直观、可靠、占用资源小且反应速度快,以适应系统硬件资源有限的条件嘲。另外,由于嵌入式系统硬件本身的特殊性,嵌入式GUI应具备高度可移植性与可裁减性,以适应不同的硬件条件和使用需求。具体的嵌入式GUI一般具备如下特点: 1.体积小
2.运行时耗用系统资源小
3.上层接口与硬件无关,高度可移植 4.高可靠性
5.在某些应用场合应具备实时性
目前,嵌入式GUI的开发正处于起步阶段,有许多技术难题尚待解决,因此对嵌入式图形系统的研究成为嵌入式系统研究及发展中的一个重要内容。
可以预见,随着电子、计算机等行业的高速发展,嵌入式系统将以它专用化,效率高的特性深入实际应用的各个领域,因而开发与改进嵌入式图形用户界面有着长远的意义。
1.2 嵌入式系统的组成
嵌入式系统一般可以分为四个部分:嵌入式处理器、嵌入式外围设备、嵌入式操作系统和嵌入式应用软件,如图1-1所示。
图1-1 嵌入式系统的组成
1.3 本课题的背景和意义
嵌入式导航计算机是飞机,车辆,导弹和船舶等运载体上的重要设备,主要任务是按照原定的计划和任务,以要求的精度,在一定时间内将载体引 导至目的地。嵌入式导航计算机主要分为两部分:硬件电路,嵌入式操作系 统。本课题的目的就是针对其硬件环境,搭建起一个高效、稳定的嵌入式操 作系统的平台。它具有通用操作系统的基本特点,能够有效管理复杂的系统 资源;能够快速的处理大量的信息;能够提供库函数、驱动程序、工具集以 及部分应用程序。在这个系统平台上可以运行导航程序,接受传感器的数据 经处理后得到任务所需要的信息,从而实施导航任务。
嵌入式Linux有着嵌入式导航计算机操作系统需要的很多特色:支持多 任务处理、中断处理及任务间通信,性能稳定,剪裁性好,开发与使用都很 方便。因此,本设计选用嵌入式Linux作为嵌入式导航计算机的操作系统,这对于实现导航计算机的高效率、低功耗具有现实意义。
图1-2 嵌入式导航计算机硬件平台结构图
1.4 本课题的主要工作和研究内容
本课题的最重目标是为嵌入式导航计算机移植Linux操作系统。通过参 阅大量文献,学习嵌入式Linux系统和 ARM 体系微处理芯片S3C2410的相 关知识,研究启动下载程序 Bootloader 和 Linux内核的基本工作原理,并且 搭建交叉编译平台,重点是移植Bootloader和内核,以及制作根文件系统。具体工作内容包括:
(1)学习Linux操作系统的知识。
(2)了解 ARM的体系结构和S3C2410芯片硬件结构。(3)完成交叉编译环境的建立。(4)修改并移植U-boot 1.2.0。
(5)修改和裁剪Linux 2.6.24.4内核,移植网卡驱动程序。(6)制作根文件系统。(7)编写应用程序进行测试。
(8)将内核和根文件系统部署到开发板。2 硬件平台及ARM体系结构
2.1 处理器选择
本设计的处理器选择高性能、低功耗的ARM9微处理器Samsung S3c2410。S3c2410 是著名半导体公司 Samsung 推出的一款 32 位 RISC 处理器。S3c2410的内核基于 ARM920T,带有MMU功能,主频高达203MHz,可以支持 Linux、WinCE 等主流嵌入式操作系统。同时它还采用了一种叫做Advanced Microcontroller Bus Architecture(AMBA)的新型总线结构。
此外S3c2410还集成了以下片上功能:
(1)16KB指令 Cache和16KB的数据Cache;(2)LCD控制器(支持STN和TFT);
(3)4通道DMA;
(4)3通道UART;
(5)2通道USB;
(6)4路PWM和 1个内部时钟控制器;
(7)117个通用IO,24路外部中断;
(8)16位看门狗定时器;(9)RTC(实时时钟);
(10)1通道IIC/IIS控制器;
(11)NAND Flash控制器;
(12)PLL数字锁相环。
S3c2410 将系统的存储空间分为 8 组(bank),每组大小是 128MB,共1GB。Bank0 到 Bank6 都采用固定 Bank 起始寻址,用于 ROM 或 SRAM。Bank7具有可编程的 Bank的起始地址和大小,用于ROM、RAM或SDRAM。S3c2410还支持从NAND Flash启动,NAND Flash具有容量大、比NOR Flash价格低等特点。系统采用NAND Flash与SDRAM相结合的方式,可以获得非常高的性价比。
2.2 ARM体系结构
ARM微处理器基本架构:
ARM9微处理器采用RISC体系结构:优先选取使用频最高的简单指令,避免复杂指令
RISC体系结构应具有如下特点:
1.采用固定长度的指令格式,指令归整、简单、基本寻址方式有2~3种。2.使用单周期指令,便于流水线操作执行。3.大量使用寄存器,数据处理指令只对寄存器进行操作,只有加载/ 存储指令可以访问存储器,以提高指令的执行效率。
4.除此以外,ARM体系结构还采用了一些特别的技术,在保证高性能的前提下尽量缩小芯片的面积,并降低功耗:
5.所有的指令都可根据前面的执行结果决定是否被执行,从而提高指令的执行效率。
6.可用加载/存储指令批量传输数据,以提高数据的传输效率。7.可在一条数据处理指令中同时完成逻辑处理和移位处理。8.在循环处理中使用地址的自动增减来提高运行效率。ARM微处理器的寄存器结构:
1.ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄存器包括:
2.31个通用寄存器,包括程序计数器(PC指针),均为32位的寄存器。3.6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位,目前只使用了其中的一部分。
4.同时,ARM处理器又有7种不同的处理器模式,在每一种处理器模式下均有一组相应的寄存器与 之对应。即在任意一种处理器模式下,可访问的寄存器包括15个通用寄存器(R0~R14)、一至二个状态寄存器和程序计数器。在所有的寄存器中,有些是在 7种处理器模式下共用的同一个物理寄存器,而有些寄存器则是在不同的处理器模式下有不同的物理寄存器。
ARM微处理器的指令结构:
ARM微处理器的在较新的体系结构中支持两种指令集:ARM指令集和Thumb指令集。其 中,ARM指令为32位的长度,Thumb指令为16位长度。Thumb指令集为ARM指令集的功能子集,但与等价的ARM代码相比较,可节省30% ~40%以上的存储空间,同时具备32位代码的所有优点。
ARM9系列微处理器具有以下特点: 1.5级整数流水线,指令执行效率更高。2.提供1.1MIPS/MHz的哈佛结构。
3.支持32位ARM指令集和16位Thumb指令集。4.支持32位的高速AMBA总线接口。
5.全性能的MMU,支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统。
6.MPU支持实时操作系统。
7.支持数据Cache和指令Cache,具有更高的指令和数据处理能力。大小都为16K。8.ARM9系列微处理器主要应用于无线设备、仪器仪表、安全系统、机顶盒、高端打印机、数字照相机和数字摄像机等。
9.ARM9系列微处理器包含ARM920T、ARM922T和ARM940T三种类型,以适用于不同的应用场合。软件平台
3.1嵌入式操作系统选择
本设计的嵌入式操作系统选择嵌入式Linux操作系统。
嵌入式操作系统是一种支持嵌入式系统应用的操作系统软件,它是嵌入式系统(包括硬、软件系统)极为重要的组成部分,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等Browser。
一般情况下,嵌入式操作系统可以分为两类,一类是面向控制、通信等领域的实时操作系统,如 WindRiver 公司的 VxWorks、ISI 的 pSOS、QNX系统软件公司的QNX、ATI的 Nucleus等;另一类是面向消费电子产品的非实时操作系统,这类产品包括个人数字助理(PDA)、移动电话、机顶盒等。嵌入式 Linux 操作系统
Linux 的嵌入式改造主要围绕体积和实时性展开,目前已经有很多公司在进行这方面的工作,其中包括 RT-Linux,uClinux,Embedix,Xlinux,MidoriLinux和红旗嵌入式 Linux等等。
与目前市场上的众多商业的实时系统相比,嵌入式Linux除具有内核稳定,功能强大,支持多种硬件平台,兼容性好的优势外,还拥有以下的特点:(1)完全开放源代码
嵌入式 Linux完全开放其源代码,这使得修改,裁剪 Linux成为可能,开发者可以根据实际需要优化操作系统代码,降低整个系统的开销与能耗。(2)成本低
GPL协议保证了源自Linux的嵌入式Linux也是开放源代码的自由软件。而大多数嵌入式Linux使用的开发工具也是遵守GPL协议的,同样也可以免费获得。
(3)丰富的实用软件支持
Linux 提供了大量的实用程序和各种应用软件。这些软件的正确性和有效性都经过了实际检验,可以根据需要合理利用他们迅速构建嵌入式应用的软件环境。这样可以极大地减小嵌入式软件开发的时间和费用,提高系统可靠性。而商用的实时操作系统也试图提供各种常用软件工具包,但其数量是无法和Linux操作系统匹敌的。由此可见,选择嵌入式Linux操作系统,就有了丰富的资源保障,在节省成本的同时,提高了开发效率。
3.2 交叉编译环境的建立
采用交叉开发环境(Cross Development Environment)是嵌入式应用软
件开发时的一个显著特点,通常在通用计算机上编写程序,然后通过交叉编 译生成目标平台上可运行的二进制代码格式,最后再下载到目标平台上的特 定位置运行,交叉开发环境是指编译、链接和调试嵌入式应用软件的环境,它与运行嵌入式应用软件的环境有所不同,通常采用主机/目标及模式。交叉开发模型如图2-1所示:
图3-1 交叉开发模型
3.2.1 上位机的软硬件配置
硬件:
本课题用到一台通用PC机和一台笔记本电脑,其硬件配置如下:
PC机:
CPU:P IV 2.0G RAM:256MB 串口:RS-232 并口:25针母头 笔记本电脑: CPU:PM 705 RAM:768MB 网卡:10/100MBps自适应网卡 软件:
PC机的操作系统为Windows XP,装有DNW串口调试工具以及SJF2410 三星Flash烧写工具。前者用于串口调试,后者用于烧写Bootloader。
笔记本电脑的操作系统为 Ubuntu7.10,装有 GCC 等编译工具以及arm-linux-gcc交叉编译工具,并开启TFTP和 NFS服务。用于 Linux内核编 译和软件开发,并作为TFTP服务器和NFS主机。其中,Ubuntu7.10 是 Linux 的桌面发行版之一,是当今最为流行的桌面Linux 系统。使用 Linux 操作系统及其自带的工具,是目前最权威的嵌入式Linux系统开发方式,但是许多操作都是基于命令行的,所以需要扎实的Linux基础知识。
在 Ubuntu 中建立 arm用户,专门用于 ARM 开发。在 home 目录中建立下列几个子目录:
Boot:用于存放bootloader相关程序。Kernel:用于存放 Linux内核源码。FS:用于存放根文件系统相关的程序。Program:用于存放用户程序。
3.2.2 硬件连接与调试
硬件连接方式:
图3-2 硬件连接图
(1)开发板串口UART0通过交叉串口线与PC主机的 COM1口相连。
(2)开发板的JTAG口通过20PIN排线与SUPER JTAG调试头相连,再通过25PIN并口线连接到主机的LPT1口。
(3)开发板的网卡接口通过以太网线连接到路由器的LAN1口。
(4)笔记本的网卡接口通过以太网线连接到路由器的LAN2口。
(5)路由器的 WAN口连接到INTERNET。串口调试:
在本课题嵌入式系统中的目标开发板,采用串口调试的方法,即把串口当作目标开发板的显示终端,无论是打印输出,还是管理配置输入,都使用串口,这就需要主机系统装有串口调试工具。PC机中安装有DNW串口调试工具,在使用DNW之前,应当对PC机的串口进行设置。方法如下:
(1)XP系统中,右键单击“我的电脑”,选择“属性”。
(2)选择“硬件”——“设备管理器。
(3)选择“端口”——“串口(COM1)”,打开的对话框按图2-3设置。
图3-3 串口属性设置
运行 DNW 工具,选择菜单“Configuration”——“Options”,按图 2-4所示进行设置。
图 3-4
DNW 设置
每次使用DNW之前,应当设置DNW连接到串口。点击菜单中的 “Serial Port”——“Connect”,当DNW的标题栏出现[COM1,115200bps]的提示后,表明已经连接好,此时才可以使用DNW工具。
3.2.3 配置TFTP及NFS服务
TFTP 服务简介:
TFTP(Trivial File Transfer Protocol)协议即简单文件传输协议,是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。TFTP承载在UDP上,提供不可靠的数据流传输服务,不提供存取授权与认证机制,使用超时重传方式来保证数据的到达。
TFTP 服务在 Linux 系统中有客户端和服务器两个软件包。配置 TFTP服务,必须都安装好。
TFTP 服务安装与配置:
(1)Ubuntu中安装tftp工具只需在终端中键入命令: $ sudo apt-get install tftp tftpd 其中,前者是客户端,后者是服务器。
(2)Ubuntu是debian类的系统,默认是没有安装 inetd的,安装命令如下: $ sudo apt-get install netkit-inetd(3)在home目录里建立tftpboot 文件夹,命令如下: $ cd ~ $ sudo mkdir tftpboot $ sudo chmod 777 tftpboot 其中,参数 777 的意义是:根管理员、组和其他用户对 tftpboot 文件夹 的权限均为“可读、可写、可以执行”(4)修改/etc/inetd.conf,添加如下语句:
tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /home/arm/tftpboot 目的是指定 tftp 服务的根目录为/home/arm/tftpboot,修改/etc/inetd.conf 文件后应当重启 inted进程,命令如下: $ sudo /etc/init.d/inetd reload(5)重启 inted 进程后,配置即可生效,在 tftpboot 中建立文件 test 后,用
下列命令可以进行测试: $ cd ~ $ tftp 127.0.0.1 Tftp> get test 若可下载test 文件,则证明TFTP服务配置正确。NFS 服务简介:
NFS 就是 Network File System 的缩写,最早之前是由 Sun 这家公司所开发的。最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案(share files)。所以,可以简单的将它看做是一个文件服务器(file server)。通过 NFS 服务器可以让开发板将网络远端的 NFS 主机分享的目录,挂载到开发板当中,在开发板看起来,那个远端主机的目录就好像是自己的根目录一样,可以方便的进行开发调试。NFS 服务安装与配置:
(1)Ubuntu上默认是没有安装NFS服务器的,首先要安装NFS服务程序: $ sudo apt-get install nfs-kernel-server 在安装nfs-kernel-server时,apt 会自动安装nfs-common和portmap。这样,宿主机就相当于NFS Server。(2)配置/etc/exports:
NFS 挂载目录及权限由/etc/exports 文件定义。本课题要将 home 目录中 的/home/zp/share 目录让 192.168.0.*的 IP 共享, 则在该文件末尾添加下列语句:
/home/arm/FS/myrootfs 192.168.0.2/10(rw,sync,no_root_squash)配置参数说明: rw:具有可擦写的权限。
sync:文件同步写入到内存和硬盘当中。
no_root_squash:若登陆共享目录的使用者是 root 的话,则他的权限将被限 制为匿名使用者,通常他的UID和GID都会变为nobody。(3)本地测试NFS:
输入以下命令可以将NFS根目录挂载到本地的/mnt 目录中: $ sudo mount 192.168.0.2:/home/arm/FS/myroot /mnt 此时/mnt 中的内容应当与NFS根目录中的内容一致。
3.2.4 安装交叉编译工具
交叉编译简介:
所谓交叉编译,简单的说,就是在一个平台上生成另一个平台上的可执行代码,比如在 PC平台上(X86 CPU)编译出能运行在以 ARM 为内核的CPU平台上的程序,一般选择GNU开发工具 gcc。GNU的开发工具都是免费的,遵循 GPL协议,任何人可以从网上获取。GNU 提供的编译工具包括汇编器as、c编译器gcc、c++编译器g++、连接器ld和二进制转换工具objcopy。出于兼容性和稳定性考虑,本课题选择目前比较稳定的版本 Cross-3.3.2 和Cross-3.4.1。
交叉编译器的安装及配置:
(1)获取arm-linux交叉编译工具:
登陆arm-linux项目组的FTP服务器:
ftp.arm.linux.org.uk/pub/armlinux/toolchain/
下载cross-3.3.2.tar.bz2和cross-3.4.1.tar.bz2。
(2)通过下列命令可以安装arm-linux交叉编译工具:
$ cp cross-3.4.1.tar.bz2 /
$ cd /
$ tar jxvf cross-3.4.1.tar.bz2
这样,交叉编译工具就被安装到了/usr/local/arm/3.4.1中。用同样的方法 可以安装cross-3.3.2版的交叉编译工具。
(3)设置环境变量:
修改home目录下的profile文件,加入如下代码,指明交叉编译工具的 目录。
# User specific environment and startup programs
export TARGET=arm-linux
export PRJROOT=/home/arm
export
PATH=$PATH:$HOME/bin:$PREFIX/bin:/usr/local/arm/3.4.1/bin:/sbin:/usr/ sbin:/usr/local/sbin
测试交叉编译器:
可以通过一个简单的程序测试安装好的交叉编译工具,看其能否正常工作。编写一个 hello.c源文件,通过以下命令进行编译,编译后生成名为Hello的可执行文件,通过 file 命令可以查看文件的类型。当显示以下信息是表明交叉编译工具正常安装了,通过编译生成了ARM体系可执行的文件。注意,通过该交叉编译器编译的可执行文件只能在 ARM 体系下执行,不能在基于X86的普通PC上执行。
$ arm-linux-gcc –o Hello hello.c
$ file Hello
Hello:ELF 32-bit LSB executable ,ARM, version 1(ARM), for GNU/Linux 2.4.3, dynamically linked(uses shared libs), not stripped 4 移植 Bootloader 4.1 Bootloader 概述
简单地说,Bootloader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
通常,Bootloader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的Bootloader几乎是不可能的,不同处理器构架都有不同的 Bootloader。Bootloader 不但依赖于 CPU 的体系结构,而且依赖于嵌入式板级设备的配置。对于不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的Bootloader运行在另一块板子上,一般也要修改其源代码。
目前常用的Bootloader程序有以下几种: U-boot、VIVI、Blob和RedBoot。其中,U-boot 功能丰富,且对于ARM体系支持良好,事实上,它已成为ARM平台上标准Bootloader。因此,本课题选用U-boot 作为移植对象。U-boot 简介
U-boot 是德国 DENX 小组的开发用于多种嵌入式 CPU 的 Bootloader 程序,U-boot 不仅仅支持嵌入式Linux系统的引导,还支NetBSD,VxWorks,QNX,ARTOS,LynxOS 等嵌入式操作系统。U-boot 除了支持 ARM 系列的处理器外,还能支持 MIPS、x86、PowerPC、NIOS、XScale 等诸多常用系列的处理器。
4.2.1 U-boot 的获取
U-boot 的源码可以从sourceforge网站下载,网址为:
http://sourceforge.net/project/u-boot。
下载的文件为u-boot-1.2.0.tar.bz2,用以下命令将其解压。
$ tar jcvf u-boot-1.2.0.tar.bz2 /home/arm/boot/ 4.2.2 U-boot 目录结构
解压后,在 U-boot 顶层目录下有 18 个子目录,分别存放和管理不同的源码。这些目录中所要存放的文件有其规则,可以分为3类,如表3-1所示:
第一类目录与处理器体系结构或开发板硬件直接相关。第二类目录是一些通用的函数或者驱动程序。第三类目录是U-boot 的应用程序、工具或者文档。
表4-1 U-boot顶层目录下部分目录的存放规则 U-boot 的启动过程及工作原理
4.3.1 启动模式介绍
Bootloader 都包含两种不同的操作模式:“启动加载”模式和“下载”模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
启动加载(Bootloading)模式:这种模式也称为“自主”(Autonomous)模式。也即 Bootloader 从目标机上的某个固态存储设备上将操作系统加载 到 RAM中运行,整个过程并没有用户的介入。这种模式是 Boot Loader 的
正常工作模式,因此在嵌入式产品发布的时侯,Bootloader 显然必须工作在这种模式下。
下载(Downloading)模式:在这种模式下,目标机上的 Boot Loader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 Bootloader保存到目标机的 RAM 中,然后再被 Bootloader 写到目标机上的 FLASH 类固态存储设备中。Bootloader 的这种模式通常在第一次安装内核与根文件系统时被使用; 此外,以后的系统更新也会使Bootloader的这种工作模式。工作于这种模式下的 Bootloader 通常都会向它的终端用户提供一个简单的命令行接口。
U-boot 这样功能强大的Bootloader 同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。
大多数Bootloader都分为阶段1(stage1)和阶段2(stage2)两大部分,U-boot也不例外。依赖于CPU体系结构的代码(如CPU初始化代码等)通常都放在阶段1中且通常用汇编语言实现,而阶段 2 则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。
图 4-1 U-boot启动代码流程图
4.3.2 启动阶段1分析
如果 S3C2410 被配置成从 NAND 闪存启动,上电后,S3C2410 的 NAND 闪存控制器会自动把 NAND 闪存中的前 4K 数据搬移到内部 RAM中,并把 0x00000000 设置为内部 RAM 的起始地址,CPU 从内部 RAM 的0x00000000 位置开始启动。因此要把最核心的启动程序放在 NAND 闪存的前4K中。由于NAND闪存控制器从NAND闪存中搬移到内部RAM的代码是有限的,所以,在启动代码的前 4K里,必须完成 S3C2410 的核心配置,并把启动代码的剩余部分搬到 RAM 中运行。这前4K完成的主要工作就是 U-boot 启动的第一个阶段(stage1)。
U-boot 的stage1代码通常放在start.s文件中,它用汇编语言写成。此阶段要完成的主要工作如下:
(1)设置异常向量,当发生异常时,执行 cpu/arm920t/interrupts.c 中定义的中断处理函数。
(2)设置CPU的模式为SVC(管理模式,操作系统使用的保护模式)(3)关闭看门狗。(4)禁掉所有中断。
(5)设置 cpu 频率,默认频率比为 FCLK:HCLK:PCLK = 1:2:4,默认FCLK的值为120 Mhz,该值为S3C2410手册的推荐值。(6)调用cpu初始化函数cpu_init_crit。其中一个功能是设置CP15寄存 器,失效指令(I)Cache和数据(D)Cache后,禁止MMU与 Cache。(7)重定向,将 NAND Flash代码复制到 RAM,其中有以下两个个步 骤:
(a)通过copy_myself子程序,把数据从Nand Flash中拷贝到RAM。
(b)配置栈空间,配置代码段的开始地址、动态内存区长度、全局数据 大小以及分配IRQ 和FRQ的栈空间。
(8)BSS(Block Started by Symbol)段清零。(9)进入C代码:
ldr pc, _start_armboot _start_armboot:.word start_armboot 其中 start_armboot 是 U-boot 运行的第一个 C 程序,在 lib_arm/board.c 文件中定义。随后进入第二阶段。
4.3.3 启动阶段2分析
lib_arm/board.c 中的 start armboot 是 C 语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个 U-boot(armboot)的主函数,该函数主要完成如下操作:(1)定义初始化函数表。
(2)NAND Flash初始化,利用 nand_init()函数实现。(3)环境变量初始化,利用env_relocate()函数实现。(4)外围设备初始化,利用 devices_init()函数实现。(5)使能中断,利用enable_interrupts()函数实现。(6)初始化网络设备。
(7)进入U-boot 的命令循环,接受用户输入的命令,执行相应的工作。
U-boot的移植过程
移植U-boot 的主要工作就是添加开发板硬件相关的文件、配置选项,然后进行编译。
4.4.1 准备工作
(1)建立开发板编译项,在顶层Makefile中加入如下两行: LJD2410_config : unconfig @$(MKCONFIG)$(@:_config=)arm arm920t LJD2410 NULL s3c24x0 各项意义如下:
arm:CPU 的架构(ARCH)arm920t:CPU 的类型(CPU),其对应于 cpu/arm920t 子目录。LJD2410:开发板的型号(BOARD),对应于 board/crane2410 目录。NULL:开发者/或经销商(vender)。s3c24x0:片上系统(SOC)。
(2)在 board 子目录中建立 LJD2410开发板目录: $ cp rf board/smdk2410 board/LJD2410 $ cd board/LJD2410 $ mv smdk2410.c LJD2410.c(3)在 include/configs/中建立配置头文件:
$ cp include/configs/smdk2410.h include/configs/LJD2410.h(4)测试编译能否成功: $ make distclean $ make LJD2410_config $ make CROSS_COMPILE=arm-linux-如果编译成功,证明已经建立好了LJD2410的编译项,但是还要进行进一步的修改,因为现在的代码是完全拷贝 smdk2410 开发板的,还不能工作在LJD2410板上。接下来要按照 LJD2410板的硬件配置来进一步移植。(5)调整SDRAM的刷新率,修改 lowlevel_init.S: #define REFCNT 1268 在smdk2410.c中调整 HCLK为 100MHz: /*Fout = 200MHz */ #define M_MDIV 0x5C #define M_PDIV 0x4 #define M_SDIV 0x0 4.4.2 添加支持 NAND Flash 启动功能
由于U-boot 不支持从NAND Flash启动,所以将程序复制到RAM里面去需要新加代码实现,一般通过 copy_myself 函数实现。这可以参考 VIVI的copy_muself代码将其添加到Start.S中,详见附录 A-1。
在Start.S中调用了nand_reak_ll函数,该函数用于NAND Flash读操作,在U-boot 中没有定义,需要新加代码实现,该函数的实现可以参考VIVI源代码。将VIVI/s3c2410/nand_read.c 复制到LJD2410目录内即可。
由于使用了新的 Flash 读函数,在编译时需要重新链接,修改 LJD2410目录中的Makefile文件,将原先的OBJS := myboard.o flash.o 改为:OBJS := myboard.o nand_read.o。
S3c2410处理器带有NAND Flash控制器,但是U-boot 没有定义其寄存器地址,修改 include/s3c2410.h文件,加入如下代码: #define oNFCONF 0x00 #define oNFCMD 0x04 #define oNFADDR 0x08 #define oNFDATA 0x0C #define oNFSTAT 0x10 #define oNFECC 0x14 4.4.3 添加 NAND Flash 读写功能
U-boot 运行至第二阶段进入 start_armboot()函数。其中 nand_init()函数是对 NAND Flash 的最初初始化函数。其调用与CFG_NAND_LEGACY 宏有关,如果没定义
CFG_NAND_LEGACY 这个宏,就按照 start_armboot()调用 drivers/nand/nand.c 中的 nand_init 函数(该函数在 1.2.0 已经被实现)默认规定,但还有个 board_nand_init()函数没实现,需自己添加。如果定义CFG_NAND_LEGACY,就不使用默认的nand_init,而调用自己写的nand_init函数了,本课题选择第二种方式。
在/drivers/nand_legacy/nand_legacy.c 中添加 NAND Flash 初始化函数nand_init,详见附录 A-2。
可以看到 nand_init()调用 NF_Init()函数,使能 NAND Flash 控制器和 NAND Flash;调用 NF_Reset()函数置位,NF_WaitRB()查询 NAND Flash 的状态,最后再调用 nand_probe((ulong)nand)函数探测 NAND Flash。
在 include/configs/smdk2410.h 文件的后半部原先有 Flash 的参数,删除它,并加入NAND Flash的参数,并且开启一些命令宏。
4.4.4 修改 U-boot环境变量保存方式
由于本课题使用NAND Flash作为外存储器,所以U-boot 的参数存储函数应当进行适当的修改。
在/common/env_common.c里添加default_env函数,此函数的作用是对环境变量保存方式的简单初始化。这个文件中还定义了U-boot 保存环境变量的底层函数。其中/* Environment not changable */行下面的部分应当用 default_env 函数代替。这样,就可以在 U-boot 命令行中实现对环境变量的设置与保存。文件 /common/env_nand.c 中 包 含 了 Flash 擦 写 函 数,结合 CFG_NAND_LEGACY这个宏,添加代码实现 NAND Flash的擦写功能。初 始化环境仍用 default_env函数替换。
4.4.5 加入 NAND Flash 闪存型号支持
在/include/linux/mtd/
nand_ids.h
中
对
nand_flash_dev nand_flash_ids结构体的赋值进行修改,加入下列代码:
{“Samsung K9F1208U0B”, NAND_MFR_SAMSUNG, 0x76, 26, 0, 3, 0x4000, 0}, 这样,U-boot 就可以正确识别此款NAND Flash芯片。
4.5 U-boot 的烧写及测试
若开发板中没有任何程序,则不能启动,需要先将 U-boot 烧写到 Flash中。常用的烧写方法有如下几种:(1)将Flash取下,用编程器烧写。(2)通过串口线烧写。(3)通过JTAG调试接口烧写。
本课题采用第三种方法。通过JTAG接口烧写的优点是操作简单,但是烧写速度较慢,总体来说是一种非常经济实用的方法。具体操作如下:(1)连接好开发板和PC主机,主机安装并口设备驱动程序。
(2)将 u-boot.bin 拷贝至 sjf2410 目录下,用以下命令运行 sjf2410:
sjf2410 /f:u-boot.bin(3)sjf2410程序启动后,会有三个选项,依次为:
(a)选择Flash芯片型号,(b)选择程序类型,(c)选择烧写起始地址。
本课题全部选择“0”即可。
(4)烧写完毕后选择“2”退出sjf2410。
烧写完成后,断开JTAG线,PC机运行DNW串口调试软件。重启开发板后,DNW中会输出以下信息,表明U-boot可以正常启动:
其中,“LJD2410 >”即系统提示符,在此可以输入 U-boot 的命令并执行。U-boot 提供了几十个常用的命令,通过这些命令,可以对开发板进行调试,可以引导Linux内核,还可以擦写 Flash 完成系统部署等功能。
输入“help”命令,可以看到U-boot 当前的所有命令列表,如表3-2所示,每一条命令后面是简单的说明。
表4-2 U-boot中几个常用命令及其说明
4.6 设置U-boot环境变量
U-boot的环境变量存储在NAND Flash中U-boot程序映像后面的128Kb字节中,这部分被称为“变量区”。
本课题中,设置U-boot 环境变量共有两种方法:(1)在板级头文件LJD2410.h中定义有相关的环境变量宏。
这类的宏名称中以“CONFIG_”开头,区别于以“CFG_”开头的内部变量宏。以开发板的IP地址为例,LJD2410.h中有如下代码:
#define CONFIG_IPADDR 192.168.0.10 这种方法定义简便,但是每次更改环境变量必须重新编译、烧写U-boot程序,操作复杂,不方便调试。(2)使用命令设置环境变量。
这种方法得益于先前所做的移植工作,优点是操作简便,可以在线设置,重启开发板即可生效。还是以设置开发板 IP 地址为例,U-boot 提示符下输入以下命令:
LJD2410 > setenv ipaddr 192.168.0.10 LJD2410 > saveenv 系统显示:
Saving Environment to NAND...Erasing Nand...Writing to Nand...done 表明新设置的环境变量已保存至Flash中的变量区。5 Linux 内核的移植
Linux 内核的结构
在对Linux内核移植之前,首先要明确内核源码的基本组织情况,只有了解了各目录级代码的功能才能准确找到需要修改和改进的地方。
Linux 内核主要由 5 个子系统组成:进程调度、内存管理、虚拟文件系 统、网络接口、进程间通信。
Linux内核源码中几个主要的目录说明如下:
(1)/arch包含了所有硬件结构特定的内核代码。
Linux 系统能支持如此多平台的部分原因是因为内核把原程序代码清晰的划分为体系结构无关部分和体系结构相关部分。对于任何平台,都必须包含以下几个目录:
(a)boot:包括启动内核所使用的部分或全部平台特有代码。
(b)kernel:存放支持体系结构特有的(如信号处理和SMP)特征的实现。
(c)
lib:存放高速体系结构特有的(如strlen和 memcpy)通用函数的实现。
(d)mm:存放体系结构特有的内存管理程序的实现。
(e)math-emu:模拟 FPU 的代码。对于 ARM 处理器来说,此目录用mach-xxx代替。
(2)/drivers包含了内核中所有的设备驱动程序。
(3)/fs包含了所有的文件系统的代码。
(4)/include包含了建立内核代码时所需的大部分库文件。
该目录也包含了不同平台需要的库文件。比如,asm-arm是 arm平台需要的库文件。
(5)/init 包含了内核的初始化代码,内核从此处工作。这是研究核心如何工作的好起点。
(6)/ipc包含了进程间通信代码。
(7)/kernel包含了主内核代码。
(8)/mm包含了所有内存管理代码。
(9)/net 包含了和网络相关的代码。
(10)/documents包含了内核源码各个部分的说明文件。
通常,在每个目录下,都有一个 Kconfig 文件和一个Makefile文件,这两个文件都是编译时使用的辅助文件,仔细阅读这两个文件对弄清各个文件之间的联系和依托关系很有帮助;而且在有的目录下还有 Readme 文件,它是对该目录下的文件的一些说明,同样有利于我们对内核源码的理解。
显然,移植工作的重点就是移植arch目录下的文件。Linux 启动过程简析
Linux 内核启动就是引导内核映像启动的过程。典型的内核映像是zImage,包含自引导程序和压缩的vmlinux两部分。
启动过程从内核映像入口开始执行,解压 vmlinux并转到虚拟地址空间;再调用统一的内核启动函数 start_kernel(),完成一系列基本初始化;随后启动一个叫做 init 的内核线程,完成挂载文件系统、初始化设备驱动和启动用户空间 init 进程等工作。
Linux内核的移植过程
5.3.1 选择参考板
内核的移植工作主要是修改跟硬件平台相关的代码,一般不涉及 Linux内核通用程序。移植的难度也取决于两种硬件平台的差异。Linux 对于特定硬件平台的软件叫做BSP(Board Support Package).Linux 内核已经支持了各种体系的多种开发板,我们很容易从中找到与本课题类似的目标板,参考该目标板并做一定的修改,即可完成移植工作。选择参考板的原则如下:
(1)参考板与开发板具有相同的处理器,至少类似的处理器;
(2)参考板与开发板具有相同的外围接口电路,至少基本接口相同;
(3)Linux内核已经支持参考板,至少有非官方的补丁或者BSP;
(4)参考板Linux设备驱动工作正常,至少已经驱动基本接口。
根据以上原则,本课题选择SMDK2410作为参考板。修改顶层Makefile文件,指定体系结构和编译器地址:
ARCH := arm
CROSS_COMPILE := /usr/local/arm/3.4.1/bin/arm-linux-
5.3.2 修改 NAND Flash 分区信息
本课题中,NAND Flash应按照功能分为 4个分区,如图4-1所示:
图5-1 NAND Flash分区示意图 Linux 内核对于 Flash分区由 arch/arm/plat-s3c24xx/common-smdk.c 文件中的 mtd_partition smdk_default_nand_part 结构体定义,默认已经分为了8个区。按照图4-1的分区信息,修改该结构体为:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = “U-boot”,.size = 0x00100000,.offset = 0x0,},[1] = {
.name = “Kernel”,.offset = 0x00100000,.size = 0x00300000,},[2] = {
.name = “RootFS”,.offset = 0x00400000,.size = 0x02800000,},[3] = {
.name = “User”,.offset = 0x02d00000,.size = 0x00f00000,},同时还应根据CPU手册修改NAND Flash的读写时序:
static struct s3c2410_platform_nand smdk_nand_info = {
.tacls
= 0,.twrph0
= 30,.twrph1
= 0,};5.3.3 关闭 ECC 校验
本设计中,内核都是通过 U-boot 写到
Nand Flash 的,U-boot 通过的软件ECC算法产生ECC校验码,这与内核校验的ECC码不一样,而内核中的 ECC 码是由
S3C2410 中
Nand Flash 控制器产生的。所以,我们在这里选择禁止内核
ECC 校验.,具体操作如下: 文件drivers/mtd/nand/s3c2410.c中,找到s3c2410_nand_init_chip()函数,将最后一行的
chip-->eccmode
= NAND_ECC_SOFT 改为:
chip-->eccmode
= NAND_ECC_NONE
5.4 CS8900a网卡的移植过程
本课题中使用的LJD2410开发板带有 CS8900A网卡芯片,并提供RJ-45网络接口。Linux内核中并没有为 ARM体系配置CS8900A的网卡驱动,需要自己添加。CS8900A的驱动文件有两个:CS8900A.h 和CS8900A.c,这两个文件可以由网络获得,将其拷贝至 drivers/net/arm 文件夹下,但这样并不能使驱动程序正常工作,还应对内核源文件做些修改。
5.4.1 修改硬件地址映射
(1)在/arch/arm/mach-s2410文件夹里建立文件smdk2410.h,添加如下代码:
#define pSMDK2410_ETH_IO
__phys_to_pfn(0x19000000)
#define vSMDK2410_ETH_IO
0xE0000000
#define SMDK2410_EHT_IRQ
IRQ_EINT9
这三个宏分别定义了网卡的物理地址、虚拟地址和占用的中断号。
(2)修改/arch/arm/mach-s2410/mach-smdk2410.c,添加如下代码:
#include
(3)在 map_desc smdk2410_iodesc[]结构题中添加CS8900A对于的 io 空间映射:
static struct map_desc smdk2410_iodesc[] __initdata = {
{ vSMDK2410_ETH_IO , pSMDK2410_ETH_IO, SZ_, MT_DEVICE }, };
5.4.2 添加 CS8900A 内核编译项
Kconfig 文件是 Linux2.6 内核引入的配置文件,是内核配置选项的源文件。只有在这个文件里加入相应代码,才能在编译选项中出现菜单项。
在/drivers/net/arm/Kconfig中增加CS8900A的编译项代码:
config
ARM_CS8900
tristate “CS8900 support”
depends on NET_ETHERNET && ARM && ARCH_SMDK2410
help …
最后应在/drivers/net/arm/Makefile 中添加:
obj-$(CONFIG_ARM_CS8900)
+= cs8900.o
以上工作完成后,新移植的CS8900A驱动就可以编译进内核里了。
5.5 Linux 内核的剪裁配置
配置内核选项是整个移植过程中很重要的一步,本设计使用SMDK2410作为参考开发板,所以可以参考内核中 SMDK2410 开发板的配置文件,通过以下命令将其复制到内核根文件夹下:
$ cp arch/arm/config/smdk2410_defconfig.config 在此基础上,根据本课题的实际需求进行配置增减。
5.5.1 使用配置菜单
配置内核可以选择不同的配置界面,图形界面或者光标界面。由于光标菜单运行时不依赖于X11图形软件环境,可以运行在字符终端上,所以光标菜单界面比较通用。图4-2所示就是执行 make menuconfig出现的配置菜单。
在各级子菜单中,选择相应的配置时,有 3种选择,它们代表的含义分别如下:
Y—将该功能编译进内核。
N—不将该功能编译进内核。
M—将该功能编译成可以在需要时动态插入到内核中的模块。
图5-2 内核配置主菜单 内核配置原则是:将与内核其他部分关系较远且不经常且不经常使用的部分功能代码编译成可加载模块,有利于减少内核长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不选;与内核关系紧密而且经常使用的部分功能代码直接编译到内核中。
5.5.2 基本配置选项
Linux内核的各个版本配置餐单各不相同,下面以本课题使用的2.6.24.4版为例,结合本课题的实际需求,简介下内核的基本配置选项。
(1)General setup:包含通用的一些配置选项,保持默认即可。
(2)Enable loadable module supple:包含支持动态模块的配置选项,保持默认。
(3)System Type:包含系统平台列表及其相关的配置,去掉SMDK2410以外所有开发板的支持、开启s3c2410 DMA支持。
(4)Bus support:包含各种总线配置选项,全部去掉。
(5)Kernel Features:包含内核特性相关选项,保持默认。
(6)Boot options:包含内核启动相关选项,其中内核启动参数设置为:
“noinitrd console=ttySAC0,115200 root=/dev/nfs init=linuxrc nfsroot=192.168.0.2:/home/arm/FS/myrootfs mem=64M
ip=192.168.0.10:192.168.0.2:192.168.0.1:255.255.255.0:LJD2410:eth0:off”,支持NFS文件系统。
(7)Floating point emulation:包含浮点数运算仿真功能,需要开启“NWFPE”选项。
(8)Userapace binary formats:包含支持的应用程序格式,仅保留“ELF”格式支持,去掉其它。
(9)Power management options:包含电源管理功能,保持默认。
(10)Networking:包含网络功能:需要开启基本功能选项。
(11)Device Drivers:包含设备驱动选项,下一小节将详细介绍。
(12)File systems:包含各种文件系统的支持选项,去掉“EX2”等选项,仅保留 ROM 文件系统支持,在“Miscellaneous filesystems”子菜单中近保留“cramfs”文件系统支持,并且开启NFS文件系统支持,去掉其它选项。
(13)Kernel hacking:包含各种内核调试选项,保持默认。
(14)Security options:包含安全性有关选项,保持默认。
(15)Cryptographic API:包含加密算法,保持默认。
(16)Library routines:包含几种压缩和校验函数,保持默认。5.5.3 驱动程序配置选项
几乎所有Linux的设备驱动都在“Device Drivers”菜单下,它对设备驱动程序加以归类,放在子菜单下。本课题对于设备驱动的裁剪较多,具体如下:
(1)MTD support:MTD设备驱动,应添选NAND Flash驱动支持。
(2)Network debice support:网络设备支持,在子菜单“Ethernet(10 or 100Mbits)”中可以看到CS8900A网卡的配置项,这正是4.4节工作的结果。
(3)Real Time Clock:时钟驱动选项,应选上“Samsung S3C series SoC RTC”,这样系统时钟才能正常运行。
(4)由于嵌入式导航计算机只使用串口作为输入输出接口,所以应该剪裁掉那些无用的驱动,包括:并口、ATA及SATA驱动、RAID驱动、ISDN支持、输入设备驱动、多媒体设备支持、USB 支持以及MMC/SD卡支持。(5)其它驱动支持保持默认即可。
5.5.4 保存配置文件
内核配置主菜单中选择“Save an Alternate Configuration File”即可将目前的配置状态保存成文件。程序默认保存为“.config”,此文件位于内核根目录内,可以直接修改。
5.5.5 编译 Linux 内核
正式编译Linux内核之前,应当清理一下内核树,命令如下:
$ make mrproper
此命令会清除掉.config 文件,所以应当在配置内核之前做。
Linux 2.6 版本的编译已经简化,使用一个 make 命令就可以完成诸如建 立文件依赖、生成zImage、编译模块、安装模块等一系列功能。内核编译完 成后,将在/arch/arm/boot 目录中生成 image 和 zIamge 两个内核映像文件,其中 image 为正常大小的映像文件,而 zImage 为压缩后的映像文件。此时 编译好的可加载模块也被安装到预定位置,默认为/lib/modules。5.6 内核的下载及启动
5.6.1 将引导信息加入内核映像
U-boot 引导内核时需要检查一个 64byte 的头信息,其中包含了入口地址、映像类型等基本信息。这个引导头可以用 U-boot 附带的 mkimage 工具生成,命令如下:
$ mkimage-n 'linux-2.6.24'-A arm-O linux-T kernel-C none-a 0x30008000-e 0x30008040-d zImage zImage.img 各个参数的含义:
-n:设置映像名
-A:设置体系信息
-O:设置操作系统信息
-T:设置映像类型
-c:压缩类型
-a:读入地址
-e:入口地址
-d:源映像文件
该命令生成的zImage.img文件就可以下载到开发板运行了。
5.6.2 内核映像的下载及运行
将上一小节中生成的zImage.img文件拷贝到主机tftpboot 文件夹内。启动开发板,进入U-boot 提示符。使用tftp命令将内核映像下载到开发板内存中:
LJD2410> tftp 0x30008000 zImage.img
TFTP from server 192.168.0.2;our IP is 192.168.0.10
Filename ‘zImage.img’
Load address : 0x30008000
Loading:
####
Done
其中 0x30008000 为指定的下载到内存的地址,zImge.img 就是带有引导头的内核映像。当内核下载完成后,可以通过bootm命令启动内核:
LJD2410> bootm 0x30008000 6 建立根文件系统
6.1 根文件系统概述
6.1.1 根文件系统简介
对于嵌入式操作系统而言,仅包含内核是不够的,还必须有文件系统的支持。跟文件系统(root filesystem)是 Linux系统的核心部分,包含系统使用的软件和库,以及无偶有用来为用户提供支持架构和用户使用的应用软件,并作为存储数据读写结果的区域。在Linux系统启动时,首先完成内核安装及环境初始化,最后会寻找一个文件系统作为根文件系统被加载。Linux系统中使用“/”来唯一表示根文件系统的安装路径。嵌入式系统中通常可以选择的根文件系统有:Romfs, CRAMFS, RAMFS,JFFS2, EXT2等,甚至还可以使用NFS(网络文件系统)作为根文件系统。
6.1.2 NFS 文件系统与Cramfs文件系统
NFS(Network File System)是由SUN公司发展,并于1984年推出的一种文件系统。它可以让开发者通过网络连接,使开发板可以直接挂载主机的某一个指定文件夹作为根文件系统。在嵌入式开发过程中,通常使用这种文件系统搭建交叉编译环境。
cramfs(Compressed ROM File System)是Linux创始人Linus Torvalds开发的一个适用于嵌入式系统的文件系统。cramfs是一个只读文件系统,采用了zlib压缩,压缩比一般可以达到1:2,但仍可以做到高效的随机读取。Linux系统中,通常把不需要经常修改的目录压缩存放,并在系统引导的时候再将压缩文件解开。因为 cramfs 不会影响系统读取文件的速度,而且是一个高度压缩的文件系统,因此本课题最终选用cramfs作为根文件系统部署到开发板。
6.2 建立Linux根文件系统目录
嵌入式Linux根文件系统必须包含一些必须的目录,比如设备目录/dev、命令目录/bin、库目录/lib等等。
本课题构建根文件系统的工作目录是 myrootfs,通过下列命令可以在myrootfs中创建所需的子目录:
$ mkdir bin dev etc lib proc sbin sys usr $ mkdir usr/bin usr/lib usr/sbin lib/modules $ mkdir mnt tmp var $ chmod 1777 tmp $ mkdir var/lib var/lock var/log var/run var/tmp $ chmod 1777 var/tmp $ mkdir home root boot 这样,一个基本的根文件系统就建立起来了,但是各个目录都是空的,缺少各种程序和命令工具,需要进一步完善。心得体会
本课题的目标是为基于ARM9处理器的导航计算机移植Linux操作系统。研究过程中,使用了 LJD2410 型开发板,此开发板的处理器是基于 ARM920T的 Samsung S3c2410,能够满足嵌入式导航计算机的硬件需求。本课题所做的工作简要总结如下:
首先,本文对嵌入式系统、嵌入式Linux操作系统和ARM体系处理器做了简单介绍,并且分析了嵌入式导航计算机的操作系统需求。
其次,介绍了交叉开发环境的建立。本课题两台主机连接开发板的方法,主机分别安装不同的操作系统,在开发过程中完成不同的工作。通过 TFTP和NFS等网络服务,实现高效连接,有利于提高开发效率。这部分是整个课题的基础,之后的所有工作都是在这个基础上完成的。
第三,本文重点介绍了 Linux 系统的移植过程。Linux 系统移植包括三个方面:启动加载程序(Bootloader)的移植,Linux 内核的移植和根文件系统的建立。本课题选用功能强大的 U-boot 作为启动加载程序,通过对其源代码进行修改,使其可以正常运行于开发板,并且实现下载、烧写等功能。内核则采用了2008年 4月发布的2.6.24.4版本,移植了网卡驱动,并针对课题需求,进行了修改和裁剪,使得内核加载更快,运行更稳定。根文件系统选用了Cramfs文件系统,这种文件系统采用压缩格式,存储空间需求小,但是不影响读取速度,非常适合与嵌入式Linux系统。这三个方面的工作有前后继承关系,但是又有一定独立性,移植过程中应多调试,多实验。
最后,简单介绍了系统部署的方法。将Linux 内核和根文件系统部署到开发板后,开发板就可以脱离交叉开发环境而独立运行,最终达到设计需求。
本课题充分利用前人积累的经验,结合最新的软件版本进行移植工作。在移植过程中遇到了许多困难和问题,主要靠查阅文献和自己的试探性试验来研究问题,通过多次的实践,最终得到明确的解决方法。虽然移植后的Linux系统可以正常运行在开发板上,能满足设计需求。但由于时间仓促,许多问题没有深入研究,难免会出现一定的疏漏和瑕疵,需要我在今后的学习中不断努力,加以改进。
第三篇:嵌入式系统应用与学习心得体会
μC/OS嵌入式实时操作系统的应用和学习心得
μC/OS-II 是一种基于优先级的抢占式多任务实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息 队列)和内存管理等功能。它可以使各个任务独立工作,互不干涉,很容易实现准时而且无误执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化。它是一个完整的、可移植、可固化、可裁剪的抢占式实时多任务内核。μC/OS-II绝大部分的代码是用ANSII的C语言编写的,包含一小部分汇编代码,使之可供不同架构的微处理器使用。至今,从8位到64位,μC/OS-II已在超过40种不同架构上的微处理器上运行。μC/OS-II已经在世界范围内得到广泛应用,包括很多领域,如手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制上。实际上,μC/OS-II已经通过了非常严格的测试,并且得到了美国航空管 理局的认证,可以用在飞行器上。这说明μC/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要系统。除此以外,μC/OS-II 的鲜明特点就是源码公开,便于移植和维护。
我们在学习μC/OS嵌入式实时操作系统时用的教科书是任哲编著的 《嵌入式实时操作系统μC/OS-Ⅱ原理及应用》,这本书介绍了嵌入式实时操作系统μC/OS-Ⅱ内核的任务管理和调度、系统时钟和节拍服务、时间管理、中断、任务的通信和同步、内存的简单管理原理,同时给出了实例。最后,还介绍了μC/OS-Ⅱ的移植方法。
在多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。之所以使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理它们。内核本身也增加了应用程序的额外负荷,代码空间增加ROM的用量,内核本身的数据结构增加了RAM的用量。但更主要的是,每个任务要有自己的栈空间,这一块吃起内存来是相当厉害的。内核本身对CPU的占用时间一般在2到5个百分点之间。μC/OS-Ⅱ有一个精巧的内核调度算法,实时内核精小,执行效率高,算法巧妙,代码空间很少,具有如下特点:只支持基于优先级的抢占式调度算法,不支持时间片轮循;64个优先级,只能创建64个任务,用户只能创建56个任务;每个任务优先级都不相同;不支持优先级逆转;READY队列通过内存映射表实现快速查询;效率非常高;支持时钟节拍;支持信号量,消息队列,事件控制块,事件标志组,消息邮箱任务通讯机制;支持中断嵌套,中断嵌套层数可达255层,中断使用当前任务的堆栈保存上下文;每个任务有自己的堆栈,堆栈大小用户自己设定;支持动态修改任务优先级;任务TCB为静态数组,建立任务只是从中获得一个TCB,不用动态分配,释放内存;任务堆栈为用户静态或者动态创建,在任务创建外完成,任务创建本身不进行动态内存分配;任务的总个数(OS_MAX_TASKS)由用户决定;0优先级最高,63优先级最低;有一个优先级最低的空闲任务,在没有用户任务运行的时候运行。
任务的调度核心主要是在任务就绪表中查找具有最高优先级别的就绪任务及实现任务切换,即将找到的的最高优先级别的任务的“任务号”---> “当前任务的任务号OSPrioCur”;从OSTCBPrioTbl[]取出最高优先级别任务的任务控制块首地址---> “当前任务的任务控制块指针OSTCBCur”,最后调用OS_TASK_SW()完成现场切换(即将CPU的寄存器信息保存到当前正运行任务的私栈中,然后从待运行的高优先级别的任务私栈中弹出原先保存寄存器信息到CPU)。
时钟节拍服务放到一个时钟节拍任务中完成,通过采用啥希散列表机制来管理延时任务,每次时钟节拍服务只需要处理极少数的延时任务,从而大大减少了时钟节拍服务花费的时间,提高了系统的实时性。
另外,在μC/OS系列RTOS中,时钟节拍服务除了会跟踪延时的任务,还会跟踪那些指定了超时时限的等待任务。也就是说,当指定的超时时限结束时,即使任务等待的事件没有发生,时钟节拍服务也会使该任务恢复运行。
uC/OS-II的时间管理是通过定时中断来实现的,该定时中断一般为10毫秒或100毫秒发生一次,时间频率取决于用户对硬件系统的定时器编程来实现。中断发生的时间间隔是固定不变的,该中断也成为一个时钟节拍。
uC/OS-II要求用户在定时中断的服务程序中,调用系统提供的与时钟节拍相关的系统函数,例如中断级的任务切换函数,系统时间函数。
uC/OS-II 中最多可以支持64 个任务,分别对应优先级0~63,其中0 为最高优先级。63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。还提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。
系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整形变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前cpu的利用率。
想使用在MCU上使用μC/OS-II则必须满足以下几个条件:①处理器C 编译器支持可重入代码的生成;②用C 语言可以打开和关闭中断;③ 处理器支持中断,并能产生定时中断(中断频率通常设置在10~100 Hz 之间);④ 处理器支持足够的RAM 空间,以满足多任务环境下设置任务堆栈的要求;⑤处理器有相应的指令,能将堆栈指针和其它CPU 寄存器读出和存储到堆栈或内存中。μC/OS-II代码中大部分是用C语言写的,但涉及到数据类型的重定义、堆栈结构的设计、任务切换时状态的保存和恢复等问题的大部分代码由于与处理器有关,是用汇编语言实现的。移植所要做的工作,就是在不同的处理器上用汇编语言来改写与处理器有关的代码及其他与处理器特性相关的部分。
在μC/OS-II移植过程中涉及以上问题的代码都包含在文件OS_CPU.H、OS_CPU_C.C、OS_CPU_A.ASM中。因此移植的主要工作也在源代码的基础上围绕着这三个文件的改写展开。
总之,学习μC/OS嵌入式实时操作系统首先得先了解整个系统的结构,工作时的流程,比如任务1运行时如果有外部中断会发生什么(调用中断服务程序,把相应的任务加如就绪列,内核进行调度,就绪队列中的最高优先级的任务...)等,再对代码进行具体的研究会比较容易。
我们需熟知μC/OS嵌入式实时操作系统中的函数及其应用,例如引起任务调度的系统函数有OSStart()uCOS/II启动 ;OSTaskSuspend()挂起任务 ;OSTaskResume()恢复任务 ;OSTimeDly()/OSTimeDlyHMSM()等待一个事件的发生等。只有在熟识系统运行的方式及可以引发其运行的函数的情况下我们才能较好的去运用它,用它来实现移植,从而达到我们的目的。
学习实时操作系统,任哲编著的 《嵌入式实时操作系统μC/OS-Ⅱ原理及应用》这本书相对来说比较适合初学者,它篇幅适中,通俗易懂,若能结合北京航空航天大学《ucosii操作系统讲义》就更加好了。
正所谓读书百遍,其义自现,通过对《北航》和《任哲》的资料不断反复地学习和阅读,我心中总算有些眉目了,我是先用别人的程序进行移植调试后才加入自己的代码,虽然开始都是实验---下载--失败,但随着我的不断努力,最终也是能够成功的,所以说学习这种技术,需要的是耐心,因为它需要我们一步一步慢慢加深理解,调试程序,有时一个符号打错了都会造成实验的失败,我们就要耐心仔细的在代码的海洋里寻找着这一根小针并把它去除改正。
第四篇:嵌入式系统的主要应用
嵌入式系统的主要应用
嵌入式系统是一种包括硬件和软件的完整的计算机系统,它的定义是:“嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可剪裁,适用于应用系统对功能、可靠性、成本、体积和功耗有严格要求的专用计算机系统。”嵌入式系统所用的计算机是嵌入到被控对象中的专用微处理器,但是功能比通用计算机专门化,具有通用计算机所不能具备的针对某个方面特别设计的、合适的运算速度、高可靠性和较低比较成本的专用计算机系统。
嵌入式系统的应用前景是非常广泛的,人们将会无时无处不接触到嵌入式产品,从家里的洗衣机、电冰箱,到作为交通工具的自行车、小汽车,到办公室里的远程会议系统等等。在家中、办公室、公共场所,人们可能会使用数十片甚至更多这样的嵌入式无线电芯片,将一些电子信息设备甚至电气设备构成无线网络;在车上、旅途中,人们利用这样的嵌入式无线电芯片可以实现远程办公、远程遥控,真正实现把网络随身携带。其应用领域可以包括:
1.交通管理:在车辆导航、流量控制、信息监测与汽车服务方面,嵌入式系统技术已经获得了广泛的应用,内嵌GPS模块,GSM模块的移动定位终端已经在各种运输行业获得了成功的使用。目前GPS设备已经从尖端产品进入了普通百姓的家庭,只需要几千元,就可以随时随地找到你的位置。2.家庭智能管理系统:水、电、煤气表的远程自动抄表,安全防火、防盗系统,其中嵌有的专用控制芯片将代替传统的人工检查,并实现更高,更准确和更安全的性能。
3.POS网络及电子商务:公共交通无接触智能卡发行系统,公共电话卡发行系统,自动售货机,各种智能ATM终端将全面走入人们的生活。
4.环境工程与自然:水文资料实时监测,防洪体系及水土质量监测、堤坝安全,地震监测网,实时气象信息网,水源和空气污染监测。在很多环境恶劣,地况复杂的地区,嵌入式系统将实现无人监测。
5.机器人:嵌入式芯片的发展将使机器人在微型化,高智能方面优势更加明显,同时会大幅度降低机器人的价格,使其在工业领域和服务领域获得更广泛的应用。
6.工业控制:相对于其他的领域,机电产品可以说是嵌入式系统应用最典型最广泛的领域之一。从最初的单片机到现在的工控机、SOC在各种机电产品中均有着巨大的市场。工业设备是机电产品中最大的一类,在目前的工业控制设备中,工控机的使用非常广泛,这些工控机一般采用的是工业级的处理器和各种设备,其中以X86的MPU最多。工控的要求往往较高,需要各种各样的设备接口,除了进行实时控制,还须将设备状态,传感器的信息等在显示屏上实时显示。这些要求8位的单片机是无法满足的,以前多数使用16位的处理器,随着处理器快速的发展,目前32位、64位的处理器逐渐替代了16位处理器,进一步提升了系统性能。采用PC104总线的系统,体积小,稳定可靠,受到了很多用户的青睐。不过这些工控机采用的往往是DOS或者Windows系统,虽然具有嵌入式的特点,却不能称作纯粹的嵌入式系统。另外在工业控制器和设备控制器方面,则是各种嵌入式处理器的天下。这些控制器往往采用16位以上的处理器,各种MCU,Arm、Mips、68K系列的处理器在控制器中占据核心地位。这些处理器上提供了丰富的接口总线资源,可以通过它们实现数据采集,数据处理,通讯以及显示(显示一般是连接LED或者LCD)。最近飞利浦和ARM共同推出32位RISC嵌入式控制器,适用于工业控制,采用最先进的0.18微米CMOS嵌入式闪存处理技术,操作电压可以低至1.2伏,它还能降低25%到30%的制造成本,在工业领域中对最终用户而言是一套极具成本效益的解决方案。美国TERN工业控制器基于Am188/186ES、i386EX、NEC V25、Am586(Elan SC520),采用了SUPERTASK实时多任务内核,可应用于便携设备、无线控制设备、数据采集设备、工业控制与工业自动化设备以及其它需要控制处理的设备。
7.家电行业是嵌入式应用的另一大行业。现在只有按钮、开关的电器显然已经不能满足人们的日常需求,具有用户界面,能远程控制,智能管理的电器是未来的发展趋势。据IDG发布的统计数据表明,未来信息家电将会成长五至十倍。中国的传统家电厂商向信息家电过渡时,首先面临的挑战是核心操作系统软件开发工作。硬件方面,进行智能信息控制并不是很高的要求,目前绝大多数嵌入式处理器都可以满足硬件要求,真正的难点是如何使软件操作系统容量小、稳定性高且易于开发。Linux核心可以起到很好的桥梁作用,作为一个跨平台的操作系统,它可以支持二三十种CPU,而目前已有众多家电业的芯片都开始做Linux的平台移植工作。1999年就登录中国的微软“维纳斯”计划给了国人一个数字家庭的概念,引导各大家电厂商纷纷投入到这场革命中来,虽然最终未能获得成功,却使信息家电深入人心。如今各大厂商仍然在努力推出适用于新一代家电应用的芯片,英特尔公司已专为信息家电业研发了名为StrongARM的ARM CPU系列,这一系列CPU本身不象X86CPU需要整合不同的芯片组,它在一颗芯片中可以包括你所需要的各项功能,即硬件系统实现了SOC的概念。美商网虎公司已将全球最小的嵌入式操作系统——QUARK成功移植到StrongARM系列芯片上,这是第一次把Linux、图形界面和一些程序进行完整移植(QUARK的内核只有143K),它将为信息家电提供功能强大的核心操作系统。相信在不久的将来,数字智能家庭必将来到我们身边。
这些应用中,可以着重于在控制方面的应用。就远程家电控制而言,除了开发出支持TCP/IP的嵌入式系统之外,家电产品控制协议也需要制订和统一,这需要家电生产厂家来做。同样的道理,所有基于网络的远程控制器件都需要与嵌入式系统之间实现接口,然后再由嵌入式系统来控制并通过网络实现控制。所以,开发和探讨嵌入式系统有着十分重要的意义。
第五篇:嵌入式系统设计报告
嵌入式系统设计实验报告
班 级:学 号:姓 名:成 绩:指导教师:
20090612 2009112107 侯金钟 武俊鹏、刘书勇 1.实验一
1.1 实验名称
嵌入式系统硬件开发环境
1.2 实验目的
1.熟悉UP-net3000实验平台。
2.超级终端设置及BIOS 功能使用。
1.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
1.4 实验内容及要求
熟悉UP-net3000实验平台的硬件电路和外设,ARM JTAG的安装和使用,利用超级终端检验外设的工作状态。
1.5 实验设计与实验步骤
1.建立工程
(1)运行ARM SDT 2.5 集成开发环境(ARM Project Manager).(2)在新建的工程中,如图1A-2 所示,选中工程树的“根部”。
(3)因为开发板上的嵌入式处理器ARM7TDMI 没有浮点处理器,所以,如图1A-3 所
示,在弹出的对话框中设置Floating Point Processor 为none,并保持其他的设置不变。(4)选中工程树的“根部”,通过菜单Project | Tool Configuration for work1.apj | asmlink | Set,对整个工程的连接方式进行设置。(5)在弹出的对话框中,选中Entry and Base 标签,如图1A-4 所示,设置连接的Read-Only(只读)和Read-Write(读写)地址。
(6)选择Linker Configuration 的ImageLayout 标签,(7)选择Project | Edit Project Tamplete 菜单,弹出Project Template Editor 对话框。
(8)选择Project | Edit Variables for work1.apj,弹出Edit Variables for work1.apj 对话框。
2.进行程序的在线仿真、调试
1.6 实验过程与分析
熟悉UP-net3000实验平台的硬件电路和外设,安装了ARM JTAG,利用超级终端检验了外设的工作状态。
1.7 实验结果总结
软件安装成功,结果显示正常。
1.8 心得体会
通过此次试验,我对ARM的环境的功能有一定的了解与完善。对试验台有了基本的认识与使用。
2.实验二
2.1 实验名称
嵌入式系统软件开发环境
2.2 实验目的
1.熟悉ADS1.2 开发环境,学会ARM 仿真器的使用。
2.使用ADS 编译、下载、调试并跟踪一段已有的程序,了解嵌入式开发的基本思想和过程。
2.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
2.4 实验内容及要求
本次实验使用ADS 集成开发环境。新建一个简单的工程文件,并编译这个工程文件。学习ARM 仿真器的使用和开发环境的设置。下载已经编译好的文件到嵌入式控制器中运行。学会在程序中设置断点,观察系统内存和变量。
2.5 实验设计与实验步骤
(1)运行ADS1.2 集成开发环境(CodeWarrior for ARM Developer Suite)。
(2)在新建的工程中,选择Debug 版本,使用Edit | Debug Settings菜单对Debug 版本进行参数设置。(3)在Debug Settings 对话框中选择Target Settings 项。在Post-linker一栏中选择ARM from ELF。
(4)在Debug Settings 对话框中选择ARM Linker 项
(5)在第四步中如果选择简单的地址连接设置,在Debug Settings 对话框中选择ARM Linker 项
(6)回到的工程窗口中,选择Release 版本,使用Edit | Release Settings 菜单对Release 版本进行参数设置。(7)参照第(3)、(4)、(5)、(6)步在Release Settings 对话框中设置Release版本的Post-linker、连接地址范围、入口模块和输出文件。(8)回到如图1B-3 所示的工程窗口中,选择Targets 选项卡,如图1B-11 所示。选中DebugRel 版本,按Del 键将其删除。DebugRel 子树是一个折衷版本,通常用不到,所以在这里删除。
2.6 实验过程与分析
1)回到工程窗口选中Debug 版本,执行菜单Project | Make 对工程进行编译连接。(2)在ADS 中执行菜单Project | Debug 启动ADS1.2 的调试工具AXD。(3)在AXD 中执行菜单Options | Configure Target 对AXD 进行设置。(4)点Select 按钮选择远程连接为ARM ethernet driver,点Configure 按钮输入仿真器的IP 地址。
(5)等待程序装载完毕以后,通过Execute | Go 菜单以及Execute | Stop(或者工具栏中的相应按钮)运行或暂停程序。程序暂停后在窗口中将显示出程序暂停的位置。(6)通过Execute | Step 菜单(或者工具栏中的相应按钮)可以单步运行程序。
(7)程序停止后可以通过Processor Views | Sources 菜单查看源文件,并可在适当位置按F9 设置端点。
(8)使用在Processor View 菜单下的Registers、Variables 和Memory 命令可以查看工作寄存器或者内存变量。读者可以逐一地尝试,为以后调试程序打下基础。
2.7 实验结果总结
超级终端输出“Hello World!”。
2.8 心得体会
基本了解了ADS1.2的配置条件,学会了ARM仿真器的使用方法。
3.实验三
3.1 实验名称
键盘及LED实验
3.2 实验目的
1.学习键盘及LED 驱动原理。
2.掌握ZLG7289芯片串行接口的使用方法,用ZLG7289芯片驱动17键的键盘和8个共阴极LED。
3.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
3.4 实验内容及要求
通过ZLG7289芯片驱动17键的键盘和8个共阴极LED,将按键值在LED上显示出来。要求从右至左循环显示至少四位数字。
基本功能实现之后可考虑实现从左至右显示四位及四位以上数字(最大八位),并可设置清零键等扩展功能。
3.5 实验设计与实验步骤
利用所给的基础代码进行调试,观察输出结果,结合指导书和教材掌握基本原理和源代码的编写方式。根据实验的要求设计函数流程,并反复调试,实现功能。1.新建工程,将“Exp3 键盘及LED 驱动实验”中的文件添加到工程。2.定义ZLG7289 寄存器(ZLG7289.h)
#define ZLG7289_CS(0x20)//GPB5 #define ZLG7289_KEY(0x10)//GPG4 #define ZLG7289_ENABLE()do{ZLG7289SIOBand=rSBRDR;ZLG7289SIOCtrl=rSIOCON;rSIOCON=0x31;rSBRDR=0xff;rPDATB&=(~ZLG7289_CS);}while(0)#define ZLG7289_DISABLE()do{rPDATB|=ZLG7289_CS;rSBRDR=ZLG7289SIOBand;rSIOCON=ZLG7289SIOCtrl;}while(0)3.编写ZLG7289 驱动函数(ZLG7289.c)4.定义键盘映射表:(Keyboard16.c)
unsigned char KeyBoard_Map[]= {4,8,11,0,0,0,0,0,5,9,12,15,1,0,0,0,6,10,13,16,2,3,0,0,7,0,14,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//64 键值映射表,通过查找键盘映射表来确定键盘扫描码对应的按键值。
5.定义键值读取函数。(Keyboard16.c)6.编写主函数,将按键值在数码管上显示。
3.6 实验过程与分析
利用键盘驱动函数实现基本数字输入,然后利用循环左移函数实现输入数字做一样功能,并通过改变函数中相应delay的值来消除键盘按键带来的抖动。
3.7 实验结果总结
按键值可以在LED上显示出来。要求从右至左循环显示八位数字,同时可以复位清零。达到实验的效果。
3.8 心得体会
通过本次实验,我了解了LED的显示屏幕的数字的移位功能,这个功能不止可以用一个方法实现,而循环左移是其中比较巧妙且省力的一种,在遇到类似情况的时候,可以优先考虑能不能利用到文件中已经存在的函数,这样可以不必自己编写函数,省时省力。是一种可靠的方法。4.实验四
4.1 实验名称
电机转动控制及中断实验
4.2 实验目的
1.熟悉ARM本身自带的六路即三对PWM,掌握相应寄存器的配置。
2.编程实现ARM系统的PWM输出和I/O输出,前者用于控制直流电机,后者用于控制步进电机。
3.了解直流电机和步进电机的工作原理,学会用软件的方法实现步进电机的脉冲分配,即用软件的方法代替硬件的脉冲分配器。
4.了解44B0处理器上中断的应用。5.学习在44B0处理器上中断的应用。
6.进一步熟悉平台外围硬件及其驱动程序的编写。
4.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
4.4 实验内容及要求
1.学习步进电机和直流电机的工作原理,了解实现两个电机转动对于系统的软件和硬件要求。学习ARM 知识,掌握 PWM 的生成方法,同时也要掌握 I/O的控制方法。
2.编程实现ARM芯片的一对PWM输出用于控制直流电机的转动,通过A/D旋钮控制其转动方式。
3.编程实现ARM的四路I/O通道,实现环形脉冲分配用于控制步进电机的转动,通过A/D旋钮控制步进电机的转角。
4.通过键盘控制直流电机与步进电机的切换。5.设置并启动定时器。
6.设置中断,编写定时器中断服务程序,对中断次数进行计数并在LED上显示结果。
4.5 实验设计与实验步骤
1.添加并打开工程。
2.进行直流电机初始化设置和代码编写。3.进行步进电机初始化设置和代码编写。
4.对Timer3编程,编写定时器中断服务程序,完成对中断次数的计数。5.编写LED计数显示函数,使LED能正确计数并显示0-9999。6.编写中断初始化函数和中断响应函数。7.终端下载测试。
4.6 实验过程与分析 1.对直流电机进行编程和测试,掌握转速和旋转方向的设定方法。
2.对步进电机进行编程和测试,掌握ARM的四路I/O通道,实现环形脉冲分配用于控制步进电机的转动,通过A/D旋钮控制步进电机的转角。
3.对主函数进行编程,用键盘响应直流电机与步进电机的切换控制。
4.掌握中断相关语句的应用,弄清定义的中断向量、中断向量号,编写中断响应函数,并完成中断响应控制。
4.7 实验结果总结
实现了直流电机与步进电机的基本设置和控制,可以通过键盘控制电机之间的切换。完成了中断的响应和定时中断。当对其中一个旋钮转动时,就可以由直流电机转换成步进电机的转换,达到实验的效果。
4.8 心得体会
通过本次实验,我了解了直流电机和步进电机的工作原理,同时也知晓了电机间的转换过程,了解其中的道理内涵,熟悉了ARM自带的A/D转换器的工作原理及编程方法,了解了中断的意义和实现方法,实现了简单了中断处理程序。同时我也收获了很多关于ARM处理机的相关知识。
5.实验五
5.1 实验名称
触摸屏驱动实验
5.2 实验目的
1.了解触摸屏的基本概念与原理。
2.理解触摸屏与LCD的关系。3.编程实现对触摸屏的控制。
4.熟悉用 ARM 内置的 LCD控制器驱动 LCD。
5.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
5.4 实验内容及要求
1.了解触摸屏基本原理,理解对触摸屏进行输出标定、与LCD显示器配合的过程。2.通过编程实现触摸两点自动在两点间划直线。3.通过编程实现在触摸屏上动态画出曲线。5.5 实验设计与实验步骤
1.添加并打开工程。
2.在头文件中定义宏和常量及驱动函数。
#define ADS7843_CTRL_START 0x80 #define ADS7843_GET_X 0x50 #define ADS7843_GET_Y 0x10 #define ADS7843_CTRL_12MODE 0x0 #define ADS7843_CTRL_8MODE 0x8 #define ADS7843_CTRL_SER 0x4 #define ADS7843_CTRL_DFR 0x0 #define ADS7843_CTRL_DISPWD 0x3 // Disable power down #define ADS7843_CTRL_ENPWD 0x0 // enable power down #define ADS7843_PIN_CS(1<<6)//GPF6 #define ADS7843_PIN_PEN(1<<5)//GPG5 /////////触摸屏动作//////// #define TCHSCR_ACTION_NULL 0 #define TCHSCR_ACTION_CLICK 1 //触摸屏单击 #define TCHSCR_ACTION_DBCLICK 2 //触摸屏双击 #define TCHSCR_ACTION_DOWN 3 //触摸屏按下 #define TCHSCR_ACTION_UP 4 //触摸屏抬起 #define TCHSCR_ACTION_MOVE 5 //触摸屏移动
#define TCHSCR_IsPenNotDown()(rPDATG&ADS7843_PIN_PEN)(ADS7843_CTRL_START|ADS7843_GET_X|ADS7843_CTRL_12MODE |ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)//采样x 轴电压值,数据为12 位,参考电压输入模式为差分模式,允许省电模式
#defineADS7843_CMD_Y(ADS7843_CTRL_START|ADS7843_GET_Y|ADS7843_CTRL_12MODE |ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)int TchScr_Xmax=1840,TchScr_Xmin=176, TchScr_Ymax=195,TchScr_Ymin=1910;//触摸屏返回电压值范围 #defineADS7843_CMD_X 3.校准触摸屏坐标,进行坐标转换。
4.实现触屏取点并显示功能。
将触摸动作及触摸点坐标在超级终端上显示出来。5.实现两点间自动划线功能。6.实现触摸屏动态划线功能。
可以使用TchScr_GetScrXY()函数(第三个参数为0)来获得液晶屏的x、y 方向的电压
范围,分别点触摸屏有效面积的左上角和右下角,得到下列参数:
TchScr_Xmax=1840;TchScr_Xmin=176;TchScr_Ymax=195;TchScr_Ymin=1910;//此数值仅供参考,请以实际校对为准
5.6 实验过程与分析 1.在定义触屏响应功能的函数中对点击触屏进行响应函数的修改,在其中添加修改点颜色的函数,修改得到的触摸点的颜色,并显示在LCD上。
2.获取第一个点坐标并储存,获取第二个点坐标并储存,由编写的划线函数取得储存的两点间直线上所有点的坐标,并对其改变颜色,显示在LCD上,即完成划直线功能。
3.将划线函数应用到响应触屏移动消息的函数下,即可对连续获得的触摸坐标进行连续的画短直线,连接成曲线,完成动态划线功能。
5.7 实验结果总结
了解了触摸屏响应动作消息的函数的工作原理,通过修改实现了触摸屏响应不同动作进行画点、划线、动态划线的功能。验证触摸屏的灵敏度的实验。
5.8 心得体会
通过这次实验,我基本掌握了通过编程驱动触摸屏以及触摸屏响应时间,实现了触摸屏对不同动作消息的响应。同时也知晓了在触摸屏上的描点画线的实现,但是由于不知名的原因,描点画线的误差较大,位置偏差较大,同时触摸屏有时会不灵敏,出现时好时坏的现象,但是由于我们的辛勤钻研,最终克服了这个困难,实现了最后的触摸屏的实现。
6.实验六
6.1 实验名称
UCOS-Ⅱ在ARM微处理器上的裁剪
6.2 实验目的
1.了解UCOS-Ⅱ内核的主要结构。
2.掌握UCOS-Ⅱ裁剪的基本原理与嵌入式编程实现方法。3.学习如何根据具体情况对UCOS-Ⅱ操作系统进行裁剪。
4.通过对UCOS-Ⅱ配置文件(OS_CFG.H)中相关的配置常量进行设置,实现对UCOS-Ⅱ的裁剪。
6.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
6.4 实验内容及要求
对UCOS-Ⅱ内核进行裁剪并移植到ARM7微处理器上。
6.5 实验设计与实验步骤 1.按照要求,载入STARTUP目录下文件,完成系统初始化、环境配置。2.载入UCOS-Ⅱ的全部源码,与处理器架构相关的文件位于arch目录下。3.在os_cpu.h中编写与处理器和编译器相关的代码。
4.编写os_cpu_c.c等6个与操作系统相关的函数。5.编写os_cpu.asm等4个与处理器相关的函数。
6.6 实验过程与分析
按照实验步骤进行,得到了需要的系统。
6.7 实验结果总结
按照要求进行了裁剪,得到了满足需要又紧凑的应用软件系统。
6.8 心得体会
通过本次实验,我了解了UCOS-Ⅱ内核的主要结构,掌握UCOS-Ⅱ裁剪的基本原理与嵌入式编程实现方法,学会了如何根据具体情况对UCOS-Ⅱ操作系统进行裁剪。
7.实验七
7.1 实验名称
UCOS-Ⅱ在ARM微处理器上的移植和编译
7.2 实验目的
1.了解UCOS-Ⅱ内核的主要结构。
2.掌握将UCOS-Ⅱ内核移植到ARM7处理器上的基本方法。
7.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
7.4 实验内容及要求
1.将UCOS-Ⅱ内核进行移植到ARM7微处理器上。
2.编写两个简单任务,在超级终端上观察两个任务的切换。
7.5 实验设计与实验步骤
1.该实验的文件分为两类,其一是 STARTUP 目录下的系统初始化、配置等文件,其二是 UCOS-Ⅱ的全部源码,arch 目录下的 3 个文件是和处理器架构相关的。
2.设置 os_cpu.h 中与处理器和编译器相关的代码。
3.用 C 语言编写 6 个操作系统相关的函数(OS_CPU_C.C)。4.用汇编语言编写 4 个与处理器相关的函数(OS_CPU.ASM)。5.编写一个简单的多任务程序来测试一下移植是否成功。6.编译并下载移植后的 UCOS-Ⅱ。
7.6 实验过程与分析
1.按照实验步骤进行,将µC/OS-II 内核移植到了ARM7 微处理器上。2编写了两个简单任务,在超级终端上观察两个任务的切换。
7.7 实验结果总结
将µC/OS-II 内核顺利移植到了ARM7 微处理器上。
7.8 心得体会
通过本次实验,使我更加了解了µC/OS-II 内核的主要结构,掌握了ARM的C语言和汇编语言的编程方法,了解了ARM7处理器结构,掌握了将µC/OS-II 内核移植到ARM 7 处理器上的基本原理与嵌入式编程实现方法。
8.实验八
8.1 实验名称
综合实验
8.2 实验目的
对前七次实验进行总结,应用之前所学的知识,将前几次实验内容结合起来,完成键盘,LED,触摸屏,直流电机,步进电机各种功能的组合。实现一个较为全面的功能结构。
8.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
8.4 实验内容及要求
对前七次实验进行总结,应用之前所学的知识,完成自拟的嵌入式系统,要求综合前期基础实验的各种功能。
8.5 实验设计与实验步骤
1.添加并打开工程。2.进行LCD设计,在LCD显示屏输出文本。
3.进行LED及键盘设计,完成LED输出显示功能和键盘输入功能。4.进行电机控制设计,完成键盘控制电机转动功能。5.进行中断设计,完成定时中断功能。
6.进行触摸屏设计,完成触摸屏感应和划线功能。7.进行裁剪和移植功能设计和完成。
8.6 实验过程与分析
1.完成LCD显示功能,在LCD显示屏上输出文本:“Hello World!”。2.进入界面触屏控制选择功能,实现触屏选择功能。
3.自定义四种种功能,第一为电机控制,从键盘读取命令,并将功能编号显示在LED上,LED显示的是计数的数据,同时旋转按钮完成电机转速的控制选择。
4.第三种功能为划线,功能编号显示在LED高四位上,同时LCD屏幕清屏,为划线功能做准备,可以实现划线功能。
5.第四种功能为定时中断,当由键盘控制时,LED显示数值清零,实现了中断。6.实现裁剪与移植功能。
8.7 实验结果总结
完成了各种基本功能,并通过自拟的系统将各种功能整合起来,完成了一个小的嵌入式系统,对前七次的功能有了更深入的了解。通过LED的计数,当在计数值在前30秒之内,由键盘控制LED的数值及显示,按键盘上的某一个按键,实现对LED上的数值清零,后30秒由触摸屏控制清零,并且在前30秒之内,旋转按钮,实现对直流电机的运转,并且到步进电机的转换。
8.8 心得体会
通过这次实验,我更加深刻地掌握了前几次实验中的基本功能的实现方法,并且把几种功能联合在一起,实现一些功能,把LED 显示屏,LCD触摸屏,键盘,直流电机,步进电机等等设备联合在一起,对该实验有一定的帮助与提高,而我和我的队友也对嵌入式系统有了更深入的了解,在此期间,也学习了关于ARM处理器的开发与实践,了解了关于手机的嵌入式设备的产生过程,我也深深的对此充满了兴趣,对未来的嵌入式课程设计奠定了深厚的基础,可是令我遗憾的是,我和队员的水平所限,没有完成中断优先级的控制。本来想完成更多的功能,可是最后由于时间紧迫,也有一些其他的事情来分神分心,所以就只能完成这些,但是在未来的几周内,嵌入式课程设计也给了我们很大的空间去做未完成的事情。我相信我们会做的更加完美,功能更强大,用于未来的生活中去实践。