嵌入式原理实验指导书.doc_第1页
嵌入式原理实验指导书.doc_第2页
嵌入式原理实验指导书.doc_第3页
嵌入式原理实验指导书.doc_第4页
嵌入式原理实验指导书.doc_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

嵌 入 式 系 统 原 理实 验 指 导 书马兴录 编信息科学技术学院计算机硬件教研室2009.2目 录第一章嵌入式系统原理实验装置11.1 系统硬件平台1第二章基本实验22.1 ADS开发环境的使用22.2 ARM微控制器工作模式实验62.3 ARM实验装置上C语言程序的设计112.4 ARM实验装置上GPIO实验152.5 uC/OS-II的使用262.6 嵌入式系统综合实验302.7 综合实验示例-温控仪表的设计322.8 综合实验(1)-准备实验3435第一章 嵌入式系统原理实验装置Embest ARM 教学系统包括Embest IDE 集成开发环境,Embest JTAG 仿真器,Flash 编程器,Embest EduKit-III 开发板、各种连接线、电源适配器以及实验指导书等。基本实验模型示意图如1-1 所示:图 1-1 实验模型示意图1.1 系统硬件平台图2-5 实验系统硬件平台第二章 基本实验2.1 ADS开发环境的使用2.1.1 实验目的1、掌握ADS开发环境的使用方法。2、学会AXD调试器的使用,掌握汇编程序的调试以及C语言程序的调试方法。2.1.2 实验设备PC机一台。ADS1.2 集成开发环境、仿真器驱动程序。2.1.3 实验内容及说明1、建立一个工程项目运行ADS1.2 集成开发环境(CodeWarrior for ARM Developer Suite)。选择FileNew菜单,在对话框中选择Project,如图1-1 所示,新建一个工程文件。图中示例的工程名为Exp1.mcp。点set按钮可为该工程选择路径如图1-2 所示,选中CreatFolder 选项后将以图1-1中的ProjectName 或图1-2中的文件名为名创建目录,这样可以将所有与该工程相关的文件放到该工程目录下,便于管理工程。图1-1 新建工程图1-2 保存工程2、建立一个源文件 (1)运行ADS1.2 集成开发环境(CodeWarrior for ARM Developer Suite)。选择FileNew菜单,在对话框中选择File,如图1-3 所示。图1-3 新建文件(2)单击Text File选项,建立一个文本文件。(3)在File name文本框中输入要建立的的文件名称。一定要注意文件的扩展名,汇编语言的扩展名是S,C语言的文件扩展名是C,C+语言的扩展名是CPP。(4)在Location中确定文件的路径,然后单击确定,新文件建立完毕。3、编辑如下的新文件,并保存AREA StrCopy, CODE, READONLY ENTRY start LDR r1, =srcstr LDR r0, =dststr BL strcopy stop MOV r0, #0x18 LDR r1, =0x20026 SWI 0x123456 strcopy LDRB r2, r1,#1 STRB r2, r0,#1 CMP r2, #0 BNE strcopy MOV pc,lr AREA Strings, DATA, READWRITEsrcstr DCB First string - source,0dststr DCB Second string - destination,0 END4、把源文件加入到工程项目中(1)打开Code Warior IDE,单击FileOpen,打开工程项目管理文件,如图1-3.图1-3 打开工程项目文件 (2) 右击窗口,弹出如图1-4所示的窗口,单击Add Files将建立的源文件加入到工程项目中。Add Files 把已经建立的源文件加入到工程项目中。Create Group 创建一个文件组。图1-4工程项目窗口5、编译执行ProjectBring UP to Date命令执行ProjectMake 命令。执行ProjectRun 命令。这时,直接进入调试环境AXD,第一次进入时需要选择Target,选择ARMUL,进入调试界面。6、调试 (1)打开寄存器窗口。 (2)打开存储区窗口,观察地址0x804E0x8064的内容,以及地址0x80380x804E的内容。 (3)单步执行程序并观察和记录寄存器与存储器值的变化。结合实验内容和相关资料,观察程序运行,通过实验加深理解ARM指令的使用。7、C语言程序的调试(1)在ADS中打开一个新的工程文件。选择ADS的Examples中的sorts下的sorts.mcp. Make后选择Debug,进入AXD调试环境。(2)打开源程序文件。ProcessorViewsSource,将sort.c装入。(3)找到main函数,将光标移至某条C语句,点右键,选择ExecuteRun to Cursor,(或按F7键即可)。这样,程序会执行到光标所在位置。(4)观察变量的内容。学会对C语言程序的跟踪调试。8、编写一小段C语言程序,实现S=1+2+。+100的功能,学习工程的创建,C语言程序的调试。2.1.4 思考题C语言程序可以和汇编程序混合编程。从ADS的Examples中找一个例子,分析一下。2.2 ARM微控制器工作模式实验2.2.1 实验目的1、掌握ARM微控制器的各种工作模式的特点。2、学习ARM指令及内部寄存器的操作。3、学习完整汇编语言程序的格式。2.2.2 实验设备PC机一台。ADS1.2 集成开发环境、仿真器驱动程序。2.1.3 实验内容及说明1)ARM的工作模式:ARM微控制器有如下7种工作模式:除用户模式和系统模式外,其他5种为异常模式。系统一上电,首先处于管理模式。在管理模式下进行必要的初始化后,就可以自由切换到其他模式。工作模式的标志体现在CPSR寄存器的D4D0(M4-M0):NZCVIM0M1M2M3M4TF. . .31 30 29 28 27 26 8 7 6 5 4 3 2 1 0条件代码标志保留控制位溢出标志 oVerflow进位或借位扩展 Carry零 Zero负或小于 NegativeIRQ禁止 InterruptFIQ禁止 Fast状态位 Thumb模式位 ModeNZCVIM0M1M2M3M4TFCPSR寄存器的格式CPSR模式位设置表M4:0模式可见的Thumb状态寄存器可见的ARM状态寄存器10000用户R0R7,SP,LR,PC,CPSRR0R14,PC, CPSR 10001快中断R0R7,SP_fiq,LR_fiq,PC,CPSR,SPSR_fiq R0R7,R8_fiqR14_fiq,PC,CPSR, SPSR_fiq 10010中断R0R7,SP_irq,LR_irq,PC,CPSR, SPSR_fiq R0R12,R13_irq,R14_irq,PC,CPSR, SPSR_irq 10011管理R0R7,SP_svc,LR_svc,PC,CPSR, SPSR_svc R0R12,R13_svc,R14_svc,PC,CPSR, SPSR_svc 10111中止R0R7,SP_abt,LR_abt,PC,CPSR, SPSR_abt R0R12,R13_abt,R14_abt,PC,CPSR, SPSR_abt 11011未定义R0R7,SP_und,LR_und,PC,CPSR, SPSR_und R0R12,R13_und,R14_und,PC,CPSR,SPSR_und11111系统R0R7,SP,LR,PC,CPSR R0R14,PC, CPSR 对PSR(包括CPSR和SPSR)寄存器操作的指令有两条:PSR操作指令MRS、MSR* 句法:MRScond Rd, psrMSRcond psr_fields, #immed_8rMSRcond psr_fields, Rm* 符号说明:psr:CPSR或SPSR。 fields:指定传送的区域,包括:c控制域屏蔽字节(PSR7:0)x扩展域屏蔽字节(PSR15:8)s状态域屏蔽字节(PSR23:16)f标志域屏蔽字节(PSR31:24) immed_8r:表达式,其值为对应8位位图的数字常量,该位图在32位字中循环移位,每次移动偶数位。* 指令说明:PSR操作指令MRS和MSR配合使用,可用来更新PSR的读修改写序列的一部分,如改变处理器模式或清除标志Q。其中MRS指令将PSR的内容传送到通用寄存器;MSR指令用立即数或通用寄存器的内容加载PSR的指定区域。因此,指令:MSR CPSR_c, #0xd2 ;M4-M0=10010作用就是切换到中断模式。CPSR状态的显示:nzcv_SVC 小写字母表示该位为0,大写为12)ARM汇编语言程序格式及模式切换程序:*;定义堆栈的大小USR_STACK_LEGTH EQU 64SVC_STACK_LEGTH EQU 0FIQ_STACK_LEGTH EQU 16IRQ_STACK_LEGTH EQU 64ABT_STACK_LEGTH EQU 0UND_STACK_LEGTH EQU 0AREAExample2,CODE,READONLY; 声明代码段Example2ENTRY; 标识程序入口CODE32; 声明32位ARM指令STARTMOVR0,#0MOVR1,#1MOVR2,#2MOVR3,#3MOVR4,#4MOVR5,#5MOVR6,#6MOVR7,#7MOVR8,#8MOVR9,#9MOVR10,#10MOVR11,#11MOVR12,#12BLInitStack; 初始化各模式下的堆栈指针; 打开IRQ中断 (将CPSR寄存器的I位清零)MRSR0,CPSR; R0 = CPSRBICR0,R0,#0x80 MSRCPSR_cxsf,R0; CPSR = R0; 切换到用户模式 MSR CPSR_c, #0xd0 MRSR0,CPSR ; 切换到管理模式 MSR CPSR_c, #0xdf MRSR0,CPSRHALTBHALT; 名称:InitStack; 功能:堆栈初始化,即初始化各模式下的堆栈指针。; 入口参数:无; 出口参数:无; 说明:在特权模式下调用此子程序,比如复位后的管理模式InitStack MOV R0, LR; R0 = LR,因为各种模式下R0是相同的;设置管理模式堆栈 MSR CPSR_c, #0xd3 LDR SP, StackSvc;设置中断模式堆栈 MSR CPSR_c, #0xd2 LDR SP, StackIrq;设置快速中断模式堆栈 MSR CPSR_c, #0xd1 LDR SP, StackFiq;设置中止模式堆栈 MSR CPSR_c, #0xd7 LDR SP, StackAbt;设置未定义模式堆栈 MSR CPSR_c, #0xdb LDR SP, StackUnd;设置系统模式堆栈 MSR CPSR_c, #0xdf LDR SP, StackUsr MOV PC, R0StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH - 1)*4StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)*4StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)*4StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)*4StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)*4StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)*4; 分配堆栈空间 AREA MyStacks, DATA, NOINIT, ALIGN=2UsrStackSpace SPACE USR_STACK_LEGTH * 4 ; 用户(系统)模式堆栈空间SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ; 管理模式堆栈空间IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ; 中断模式堆栈空间FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ; 快速中断模式堆栈空间AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ; 中止义模式堆栈空间UndtStackSpace SPACE UND_STACK_LEGTH * 4 ; 未定义模式堆栈END*3)将上述程序输入ADS环境,进行调试,观察模式的切换。2.2.4 思考题1)实验程序中,能实现从用户模式切换到管理模式吗?为什么?2)能从用户模式切换到系统模式或其它模式吗?如何实现?3)练习ARM状态与Thumb状态的切换:CODE32/16,注意有些指令是不能使用Thumb指令的。4)观察子程序的调用与返回机制。2.3 ARM实验装置上C语言程序的设计2.3.1 实验目的1、掌握在ARM微控制器上C语言程序的开发步骤与方法。2、学习在C语言程序中内嵌汇编的方法。3、学习C语言与汇编语言混合编程的方法。2.3.2 实验设备PC机一台。ADS1.2 集成开发环境、仿真器驱动程序。2.3.3 实验内容及说明n 1、C语言程序的开发方法:在ARM上开发C语言程序与在PC机上没什么太大区别。一些需要注意的地方:(1) 函数库的区别:在ADS环境或交叉开发环境中进行C语言程序开发,首先应该注意函数库的不同。一般说来,在嵌入式环境中,函数库是受限制的,PC机上有的函数在嵌入式环境中可能没有。这需要参考相应的手册。(2) 目标程序的定位:在嵌入式环境下,开发的C语言程序,编译连接时要注意目标程序的定位应该与目标系统的存储器安排是一致的。如实验箱的ROM安排在存储空间的0x40000000H开始的地方,那么,目标程序也应该安排在该位置,这样,程序下载到目标机上后才能正常运行。下面就是针对Magic ARM2200实验箱的设置:(3) ARM复位后,将进入管理模式,并从RESET异常入口处开始执行程序。因此,在正常执行C程序前,需要做一些初始化工作,为C语言的运行做好准备。这段程序通常是汇编语言编写的。初始化C程序的运行环境后再进入C程序代码。下面就是针对MagicARM2200实验箱的启动文件Startup.S:*; 起动文件。初始化C程序的运行环境,然后进入C程序代码。 IMPORT|Image$RO$Limit| IMPORT|Image$RW$Base| IMPORT|Image$ZI$Base| IMPORT|Image$ZI$Limit| IMPORTMain; 声明C程序中的Main()函数AREAStart,CODE,READONLY; 声明代码段StartENTRY; 标识程序入口CODE32; 声明32位ARM指令ResetLDRSP,=0x40003F00 ; 初始化C程序的运行环境 LDR R0,=|Image$RO$Limit| LDR R1,=|Image$RW$Base| LDR R3,=|Image$ZI$Base| CMP R0,R1 BEQ LOOP1LOOP0CMP R1,R3 LDRCC R2,R0,#4 STRCC R2,R1,#4 BCC LOOP0 LOOP1LDR R1,=|Image$ZI$Limit| MOV R2,#0LOOP2CMP R3,R1 STRCC R2,R3,#4 BCC LOOP2 BMain; 跳转到C程序代码Main()函数 END*n 2内嵌汇编的方法在C和C语言中嵌入汇编语言可以实现一些高级语言中没有的功能。语法如下:Linux gcc中嵌入汇编的方法:_asm _ (“instruction . instruction”); /Linux gcc中支持ADS开发环境中嵌入式汇编的方法:_asminstruction instruction ; /ADS中支持 ARM C+中嵌入式汇编的方法:asm(“instruction ; instruction”); /ARM C中使用 举例:*#include void my_strcpy(char* src, const char* dst) int ch; _asmloop:LDRB ch, src, #1STRB ch, dst, #1CMP ch, #0BNE loop ;int main(void) const char* a = Hello World!; char b20; _asmMOV R0, aMOV R1, bBL my_strcpy, R0, R1 ; printf(Original String: %sn,a); printf(“Copied String: %sn,b); return 0;*n 3、混合编程的方法:(1)C语言调用汇编程序的例子:#include extern void strcopy(char *d, const char *s);int main() const char *srcstr = First string - source; char dststr = Second string - destination;/* dststr is an array since were going to change it */ printf(Before copying:n); printf( %sn %sn,srcstr,dststr); strcopy(dststr,srcstr); printf(After copying:n); printf( %sn %sn,srcstr,dststr); return 0; AREA SCopy, CODE, READONLY EXPORT strcopystrcopy ; r0 points to destination string ; r1 points to source string LDRB r2, r1,#1 ; load byte and update address STRB r2, r0,#1 ; store byte and update address; CMP r2, #0 ; check for zero terminator BNE strcopy ; keep going if not MOV pc,lr ; Return END(2)汇编语言调用C函数的例子:/c程序g()返回5个整数的和int g(int a, int b, int c, int d, int e)return a + b + c + d + e;汇编程序调用c程序g()计算5个整数i, 2*i, 3*i, 4*i, 5*i的和EXPORT fAREA f, CODE, READONLYIMPORT g ;使用伪操作数IMPORT声明c程序g()ENTRYSTR lr, sp,#-4! ;保存返回地址ADD r1, r0, r0 ;假设进入程序f时,r0中的值为i,r1值设为2*iADD r2, r1, r0 ;r2的值设为3*iADD r3, r1, r2 ;r3的值设为5*iSTR r3, sp, #-4! ;第五个参数5*i通过数据栈传递ADD r3, r1, r1 ;r4值设为4*iBL g ;调用c程序g()ADD sp, sp, #4 ;调整数据栈指针,准备返回LDR pc, sp, #4 ;返回END2.3.4 思考题1)在仿真环境下,不用启动代码,直接编写运行C程序可以吗?2)C程序是在什么工作模式下运行的?你能换一种工作模式运行C程序吗?2.4 ARM实验装置上GPIO实验2.4.1 实验目的1、 掌握S3C2410X 芯片的I/O 控制寄存器的配置;2、 通过实验掌握ARM 芯片使用I/O 口控制LED 显示;3、 了解ARM 芯片中复用I/O 口的使用方法。2.4.2 实验设备1、 硬件:Embest EduKit-III 实验平台,Embest ARM 标准/增强型仿真器套件,PC 机。2、 软件:Embest IDE for ARM 集成开发环境,Windows 98/2000/NT/XP。2.4.3 实验内容编写程序,控制实验平台的发光二极管 LED1,LED2,LED3,LED4,使它们有规律的点亮和灭,具体顺序如下:LED1 亮-LED2 亮-LED3 亮-LED4 亮-LED1 灭-LED2 灭-LED3灭-LED4 灭-全亮-全灭,如此反复。2.4.4 实验原理S3C2410X 芯片上共有117个多功能的输入输出管脚,它们分为7 组I/O 端口。 一个23 位的输出端口(端口A); 两个11 位的输入/输出端口(端口B、H); 四个16 位的输入/输出端口(端口C、D、E、G); 一个8 位的输入/输出端口(端口F);可以很容易的每组端口来满足不同系统配置和设计的需要。在运行程序之前必须对每个用到的管脚功能进行设置,如果某些管脚的复用功能没有使用,可以先将该管脚设置为I/O 口。1. S3C2410X I/O 口控制寄存器l 端口控制寄存器(GPACON-GPHCON)在 S3C2410X 中,大多数的管脚都复用,所以必须对每个管脚进行配置。端口控制寄存(PnCON)定义了每个管脚的功能。如果GPF0-GPF7 和GPG0-GPG7 在掉电模式使用了弱上拉信号,这些端口必须在中断模式配置。l 端口数据寄存器(GPADAT-GPHDAT)如果端口被配置成了输出端口,可以向 PnDAT 的相应位写数据。如果端口被配置成了输入端口,可以从PnDAT 的相应位读出数据。l 端口上拉寄存器(GPBUP-GPHUP)端口上拉寄存器控制了每个端口组的上拉电阻的允许/禁止。如果某一位为0,相应的上拉电阻被允许,如果是1,相应的上拉电阻被禁止。如果端口的上拉电阻被允许,无论在哪种状态(INPUT,OUTPUT,DATAn,EINTn 等)下,上拉电阻都要起作用。l 多状态控制寄存器这个寄存器控制数据端口的上拉电阻,高阻态,USB pad 和CLKOUT 选项。l 外部中断控制寄存器(EXTINTN)24 个外部中断有各种各样的中断请求信号,EXTINTN 寄存器可以配置信号的类型为低电平触发,高电平触发,下降沿触发,上升沿触发,两沿触发中断请求。8 个外部中断引脚有数字滤波器(参考数据手册中的EINTFLTn)。只有16 个外部中断(EINT15:0)用于唤醒cpu。l 掉电模式和I/O 端口在掉电模式下仍然保持所有的 GPIO 的所有状态值,可以参考相应章节的内容。EINTMASK 在掉电模式下也不能阻止唤醒cpu。但是如果EINTMASK 屏蔽了INT15:4的某一位,仍然可以唤醒cpu,但是SRCPND 的EINT4_7 位和EINT8_23 位不能在cpu 唤醒后马上被置位。(1)I/O 端口控制寄存器l 端口 A 控制寄存器(GPACON/GPADAT)GPACON22:0中的某一位置位,设置与该位相对应的引脚为输出口,清零某位可以设置相应的引脚为功能端口,功能端口的如表2-4-1 所示:表2-4-1 端口A 功能配置端口被配置为输出引脚后,引脚的状态喝相应的bit 位状态一致。当端口被配置为功能引脚后,读出来的值不确定。l 端口B 控制寄存器(GPBCON,GPBDAT,GPBUP)端口B 控制寄存器对端口B 的具体配置如下:端口B 被配置位输入端口后,可以从引脚上读出相应的外部源输入的数据。如果端口被配置位输出端口,向该位写入的数据可以被发送到相应的引脚上。如果该引脚被配置位功能引脚,读出的数据不确定。置位GPBUP10:0中的某位,允许端口B 的相应位的上拉功能,反之禁止上拉功能。l 端口C 控制寄存器(GPCCON,GPCDAT,GPCUP)端口C 控制寄存器(GPCCON)的具体配置如下图所示:如果端口C 被配置为输入端口,可以从引脚读出相应外部输入源输入的数据。如果端口被配置为输出端口,向寄存器写的数据可以被送往相应的引脚。如果端口被配置为功能引脚,从该引脚读出的数据不确定。置位GPCUP15:0的某一位允许相应引脚的上拉功能,否则禁止上拉功能。l 端口D 控制寄存器(GPDCON,GPDDAT,GPDUP)GPDCON 配置情况如下:如果端口D 被配置为输入端口,可以从引脚读出相应外部输入源输入的数据。如果端口被配置为输出端口,向寄存器写的数据可以被送往相应的引脚。如果端口被配置为功能引脚,从该引脚读出的数据不确定。置位GPDUP15:0的某一位允许相应引脚的上拉功能,否则禁止上拉功能。l 端口E 控制寄存器(GPECON,GPEDAT,GPEUP)如果端口E 被配置为输入端口,可以从引脚读出相应外部输入源输入的数据。如果端口被配置为输出端口,向寄存器写的数据可以被送往相应的引脚。如果端口被配置为功能引脚,从该引脚读出的数据不确定。置位GPEUP15:0的某一位允许相应引脚的上拉功能,否则禁止上拉功能。l 端口F 控制寄存器(GPFCON,GPFDAT,GPFUP)如果端口F 被配置为输入端口,可以从引脚读出相应外部输入源输入的数据。如果端口被配置为输出端口,向寄存器写的数据可以被送往相应的引脚。如果端口被配置为功能引脚,从该引脚读出的数据不确定。置位GPFUP15:0的某一位允许相应引脚的上拉功能,否则禁止上拉功能。l 端口G 控制寄存器(GPGCON,GPGDAT,GPGUP)GPGCON 对端口G 的配置详情如下:如果端口G 被配置为输入端口,可以从引脚读出相应外部输入源输入的数据。如果端口被配置为输出端口,向寄存器写的数据可以被送往相应的引脚。如果端口被配置为功能引脚,从该引脚读出的数据不确定。置位GPGUP15:0的某一位允许相应引脚的上拉功能,否则禁止上拉功能。l 端口H 控制寄存器(GPHCON,GPHDAT,GPHUP)如果端口H 被配置为输入端口,可以从引脚读出相应外部输入源输入的数据。如果端口被配置为输出端口,向寄存器写的数据可以被送往相应的引脚。如果端口被配置为功能引脚,从该引脚读出的数据不确定。置位GPHUP15:0的某一位允许相应引脚的上拉功能,否则禁止上拉功能。2. 电路设计图 2-4-1 LED1-4 连接图如图 2-4-1 所示,LED1-4 分别与GPF7-4 相连,通过GPF7-4 引脚的高低电平来控制发光二极管的亮与灭。当这几个管脚输出高电平的时候发光二极管熄灭,反之,发光二极管点亮。2.4.5 实验操作步骤1. 准备实验环境拷贝光盘 CD1SoftwareEduKit2410 文件夹到EmbestIDEExamples Sams ung目录下(如果已经拷贝,跳过该操作);使用EduKit-III 目标板附带的串口线连接目标板上UART0 和PC 机串口COMx;2. 串口接收设置在 PC 机上运行windows 自带的超级终端串口通信程序(波特率115200、1 位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序。3. 打开实验例程1) 运行Embest IDE 开发环境,进入实验例程目录EduKit24104.2_led_test 子目录下的led_test.pjf 例程,编译链接工程;2) 点击IDE 的Debug 菜单,选择Remote Connect 项或F8 键,远程连接目标板;3) 点击IDE 的Debug 菜单,选择Download 下载调试代码到目标系统的RAM 中;4) 在工程管理窗口中双击led_test.c 就会打开该文件, 分别在约第34 行(for(i=0;i100000;i+);)和58 行( for(i=0;i100000;i+);)设置断点后,点击Debug 菜单Go 或F5 键运行程序;5) 程序停到第一个断点处,观察四个灯是否都被点亮(注意观察渐变过程),按step out (shift+F11),跳出这个子函数,继续执行;6) 程序运行到led_off(),按step into (F11),停到第二个断点处,观察四个灯是否都熄灭(注意观察渐变过程)。按step out (shift +F11), 继续执行;7) 去掉断点,重新下载,执行程序;3. 观察实验结果观察发光二极管的亮灭情况,可以观察到的现象与前面实验内容中的相符,说明实验成功的实现了对I/0 的操作。boot success.I/O (Diode Led) Test Exampleend.4. 完成实验练习题理解和掌握实验后,完成实验练习题。2.4.6 实验参考程序/*/* File: led_test.c* Author: embest* Desc: IO port test file* History:*/#include 2410lib.h/*/* name: led_xxx* func: the led operations* para: none* ret: none*/void led_on(void)int i,nOut;nOut=0xF0;rGPFDAT=nOut & 0x70;- 165 -for(i=0;i100000;i+);rGPFDAT=nOut & 0x30;for(i=0;i100000;i+);rGPFDAT=nOut & 0x10;for(i=0;i100000;i+);rGPFDAT=nOut & 0x00;for(i=0;i100000;i+);void led_off(void)int i,nOut;nOut=0;rGPFDAT = 0;for(i=0;i100000;i+);rGPFDAT = nOut | 0x80;for(i=0;i100000;i+);rGPFDAT |= nOut | 0x40;for(i=0;i100000;i+);rGPFDAT |= nOut | 0x20;for(i=0;i100000;i+);rGPFDAT |= nOut | 0x10;for(i=0;i100000;i+);void led_on_off(void)int i;rGPFDAT=0;for(i=0;i100000;i+);rGPFDAT=0xF0;for(i=0;i100000;i+);2.4.7 实验练习题1、自己编写程序使数码管以不同的显示方式显示。2、关闭Beep。2.5 uC/OS-II的使用2.5.1 实验目的(1)了解uC/OS的文件组成。(2)掌握uC/OS的基本功能,学习在uC/OS基础上的程序设计。(3)掌握在uC/OS上开发任务的方法。2.5.2 实验要求:在实验箱上编写uC/OS下的应用程序,实现:(1)编写任务实现LEDs 闪烁显示;. (2)向串口发送0123456789字符串,每2秒发送一遍. (3)空任务,只用于占用CPU时间; 用3个任务分别实现上述功能.2.5.3 实验原理(1)uC/OS的文件组成(2)uC/OS的基本功能u 多任务 mC/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多可以有56个任务u 可确定性 全部m C/OS-II的函数调用与服务的执行时间具有可确定性。u 任务栈 每个任务有自己单独的栈, m C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。u 系统服务 mC/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。u 中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。(3) 在uC/OS上开发程序的方法uC/OS的初始化及启动过程例1:运行在PC机上的uC/OS的主函数void main (void)PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* Clear the screen*/OSInit(); /* Initialize uC/OS-II */*与DOS相关的设置*/ PC_DOSSaveReturn(); /* Save environment to return to DOS */ PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-IIs context switch vector */ OSTaskCreate(TaskStart, (void *)0, &TaskStartStkTASK_STK_SIZE - 1, 0); OSStart(); /* Start multitasking */例2:运行于S3C2410-ARM9上的uC/OS的主函数void Main(void)char Id0 = 0;ARMTargetInit();/* needed by uC/OS */OSInit();OSTimeSet(0);/* create the start task */OSTaskCreate(TaskStart,(void *)0, &StackMainSTACKSIZE - 1, 61);/* start the operating system */OSStart();当OS启动后,就处于uC/OS的管理之下。试比较着两个例子的异同关键在于如何编写任务(Task)。(4) uC/OS下任务的编写每个任务都要开辟一定的堆栈空间。如:#define STACKSIZE 64unsigned int Stack1STACKSIZE;unsigned int Stack2STACKSIZE;unsigned int Stack3STACKSIZE;unsigned int StackMainSTACKSIZE;任务的定义:任务内一般采用死循环:void Task1(void *Id) /*

温馨提示

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

评论

0/150

提交评论