嵌入式综合实验报告.docx

上传人:b****6 文档编号:7978544 上传时间:2023-01-27 格式:DOCX 页数:15 大小:346.62KB
下载 相关 举报
嵌入式综合实验报告.docx_第1页
第1页 / 共15页
嵌入式综合实验报告.docx_第2页
第2页 / 共15页
嵌入式综合实验报告.docx_第3页
第3页 / 共15页
嵌入式综合实验报告.docx_第4页
第4页 / 共15页
嵌入式综合实验报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

嵌入式综合实验报告.docx

《嵌入式综合实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式综合实验报告.docx(15页珍藏版)》请在冰豆网上搜索。

嵌入式综合实验报告.docx

嵌入式综合实验报告

ARM嵌入式系统基础

综合实验报告

 

姓名:

班级:

学号:

指导教师:

实验时间:

2014年11月24日

 

一、实验目的-----------------------------------3

二、实验设备-----------------------------------3

三、实验内容-----------------------------------3

四、实验预习要求-------------------------------3

五、实验原理-----------------------------------4

六、实验步骤-----------------------------------9

七、实验参考程序-------------------------------13

八、实验心得-----------------------------------16

 

备注:

在流水灯显示的程序中,显示的字母为LIXUE,分别对应ASCII码:

L--0x4CI--0x49X--0x58U--0x55E--0x45

全亮--0XFF全灭--0X00

流水灯一个周期的显示流程:

①流水灯全亮一次;

②流水灯全灭一次,显示一个字母;

③流水灯全亮一次。

根据字母显示的个数,计算出一个周期的需要的次数为12。

一、实验目的

1、掌握将μC/OS-II操作系统移植到ARM7处理器的方法。

2、了解μC/OS-II操作系统的基本原理和移植条件。

3、掌握LPC2200(forMagicARM2200)专用工程模板的使用;

4、能够在MagicARM2200-S上运行基于μC/OS-II操作系统的程序;

5、掌握基于μC/OS-II操作系统的用户程序的编写格式。

二、实验设备

硬件:

PC机一台

MagicARM2200-S教学实验开发平台一套

软件:

Windows98/XP/2000系统

ADS1.2集成开发环境

μC/OS-II操作系统(V2.52)

三、实验内容

1、编写一个简单的多任务应用程序,实现LED流水灯控制。

2、建立两个μC/OS-II的任务,一个任务用于检测KEY1按键(P0.20口的输入),这里就称之为按键检测任务,另一个任务用于控制蜂鸣器,这里就称之为蜂鸣器控制任务。

蜂鸣器控制任务平时处于等待状态,当按键检测任务检测到有效按键输入时,立即唤醒蜂鸣器控制任务。

四、实验预习要求

1、了解μC/OS-II的组成和移植相关的文件内容。

2、了解ARM7体系结构及其汇编编程,了解LPC2000系列ARM7微控制器的硬件结构(如向量中断控制器和定时器等)和μC/OS-II移植的相关说明。

3、仔细阅读参考文献[1]第5.7节的LPC2000管脚连接模块,第5.9节的GPIO。

4、仔细阅读本书第1章的内容,了解MagicARM2200-S的硬件结构,注意蜂鸣器的控制电路及KEY1按键电路的说明。

5、仔细阅读产品配套光盘附带文档《ADS集成开发环境及仿真器应用》或其它相关资料,

6、了解ADS1.2集成开发环境、LPC2200(forMagicARM2200)专用工程模板、EasyJTAG仿真器的应用

7、阅读参考文献[4]的第16章和第17章的内容,了解μC/OS-II操作系统的配置,系统的初始化,任务的建立,系统的启动等等。

五、实验原理

LED流水灯控制实验原理:

(1)μC/OS-II概述

μC/OS-II是一个完整的、可移植、可固化、可剪裁的占先式实时多任务内核。

μC/OS-II是用ANSIC语言编写,包含一小部分汇编代码,使之可以供不同架构的微处理器使用。

μC/OS-II可以管理64个任务,具有信号量、互斥信号量、事件标志组、消息邮箱、消息队列、任务管理、时间管理和内存块管理等系统功能。

μC/OS-II包括以下3个部分:

ØμC/OS-II核心代码:

包括10个C程序文件和1个头文件,主要实现了系统调度、任务管理、内存管理、信号量、消息邮箱和消息队列等系统功能。

此部分的代码与处理器无关。

ØμC/OS-II配置代码:

包括2个头文件,用于裁剪和配置μC/OS-II。

此部分的代码与用户实际应用相关。

ØμC/OS-II移植代码:

包括1个汇编文件、1个C程序文件和1个头文件,这是移植μC/OS-II所需要的代码。

此部分的代码与处理器相关。

说明:

移植代码的文件名不是固定的,但为了保持μC/OS-II系统的一致性,文件名一般也不要改变(即OS_CPU.H、OS_CPU_A.ASM和OS_CPU_C.C)。

(2)μC/OS-II移植条件

移植μC/OS-II之前需要注意,目标处理器必须满足以下几点要求:

①处理器的C编译器能产生可重入型代码;

②处理器支持中断,并且能产生定时中断(通常为10~100HZ);

③用C语言就可以开/关中断;

④处理器能够支持一定数量的数据存储硬件堆栈(可能是几千字节);

⑤处理器有将堆栈指针以及其它CPU寄存器的内容读出,并保存到堆栈或内存中去的指令。

LPC2000系列ARM7微控制器可以满足第2、4和5点要求,使用ADS1.2的C编译器可以满足第1、3点要求。

(3)μC/OS-II移植步骤

1)OS_CPU.H的移植

在OS_CPU.H文件中定义与处理器相关(实际上是与编译器相关)的数据类型,如BOOLEAN、INT8U、INT8S等等。

2)OS_CPU_C.C的移植

在OS_CPU_C.C文件中,需要编写以下10个简单的C函数:

􀁺OSTaskStkInit();

􀁺OSTaskCreateHook();

􀁺OSTaskDelHook();

􀁺OSTaskSwHook();

􀁺OSTaskIdleHook();

􀁺OSTaskStatHook();

􀁺OSTaskTickHook();

􀁺OSInitHookBegin();

􀁺OSInitHookEnd();

􀁺OSTCBInitHook()。

其中,9个系统Hook函数可以为空函数,也可以根据用户自己的需要编写相应的操作代码。

任务栈结构初始化函数OSTaskStkInit,必须根据移植时统一定义的任务堆栈结构进行初始化。

3)OS_CPU_A.S的移植

由于ADS1.2编译器默认汇编文件后缀名为“S”,所以移植代码OS_CPU_A.ASM改名为OS_CPU_A.S。

在OS_CPU_A.S文件中,需要编写以下4个简单的汇编语言函数:

􀁺OSStartHighRdy();

􀁺OSCtxSw();

􀁺OSIntCtxSw();

􀁺OSTickISR()。

其中,函数OSCtxSw不是必须的,但必须要定义好函数OS_TASK_SW(在OS_CPU.H中声明),以实现任务级任务切换。

启动μC/OS-II是通过调用OSStart()实现,OSStart()最终调用函数OSStartHighRdy()运行多任务启动前优先级最高的任务。

OSStartHighRdy()函数的代码参考程序清单3.5。

函数OSTickISR为系统时钟节拍中断函数,这需要使用到处理器的定时器和定时中断。

为了达到集中地初始化硬件(定时器、中断和I/O等)的目的,此函数可以在用户工程的启动代码文件中实现,参考程序清单3.6。

说明:

系统时钟节拍中断函数的名称并不是固定的,也并不一定要在OS_CPU_A.S文件中实现。

蜂鸣器实验原理:

在MagicARM2200-S上运行基于μC/OS-II操作系统的程序的具体操作步骤如下。

说明:

(PC)----------------属于在PC机上操作,即软件的操作

(硬件)-------------属于MagicARM2200-S硬件操作

(PC+硬件)---------属于在PC机上进行软件操作,硬件上要连接或跳线操作

(1)安装ADS1.2

运行在ADS目录下Setup.exe,开始安装ADS1.2。

(若已安装过,此步省略)按照安装软件的提示安装,与其它软件安装操作方法基本一致。

(2)了解ADS1.2

使用ADS1.2建立工程,编译链接设置,调试操作等,更详细的使用方法参考ADS1.2的在线帮助文档或相关资料。

(若已熟悉ADS1.2,此步省略)

(3)连接EasyJTAG仿真器和MagicARM2200-S

将EasyJTAG仿真器的25针接口通过并口延长线与PC机的并口连接,先给MagicARM2200-S实验箱供电,再将EasyJTAG仿真器的20针接口通过20PIN连接电缆接到MagicARM2200-S的J3上。

(若已连接好,此步省略)

(4)EasyJTAG仿真器的安装与应用

若已安装过,此步省略。

(5)添加工程模板

若已添加过,此步省略。

(6)建立项目目录并添加μC/OS2.52源代码和移植代码

建立一个项目目录,比如uCOS-II。

将μC/OS2.52源代码Source(目录)复制到项目目录,将移植代码ARM(目录)复制到项目目录。

将移植的PC服务代码Arm_Pc复制到项目目录,使用移植的PC服务代码,就可以通过串口向PC发送显示数据(由EasyARM软件的DOS字符窗口显示)。

μC/OS2.52源代码可以从参考文献[4]的附带光盘上获得。

移植代码ARM和移植的PC服务代码Arm_Pc可以从MagicARM2200-S的产品配套光盘上获得。

(7)用工程模板建立工程

使用LPC2200(forMagicARM2200)专用工程模板建立工程(比如“ARMExecutableImageforUCOSII(MagicARM2200)”工程模板),工程存放路径为项目目录下,建立源文件并加入工程,然后编写程序代码。

更改Os_cfg.h文件,配置μC/OS-II操作系统。

编译链接工程,若有错误,则修改程序,然后再次编译。

(8)仿真调试工程

正确设置MagicARM2200-S的跳线;启动AXD进行仿真调试。

六、实验步骤

LED流水灯控制实验步骤:

(1)连接EasyJTAG仿真器和MagicARM2200-S,然后安装EasyJTAG仿真器的驱动程序(若已经安装过,此步省略)。

(2)为ADS1.2增加LPC2200(forMagicARM2200)专用工程模板(若已增加过,此步省略)。

(3)建立一个项目目录uCOS-II,添加μC/OS2.52源代码和移植代码。

将移植的PC服务代码Arm_Pc复制到项目目录uCOS-II下。

(4)将μC/OS2.52源代码Source(目录)复制到项目目录

(5)启动ADS1.2,使用ARMExecutableImageforUCOSII(forMagicARM2200)工程模板建立一个工程LedDisp,工程存储在uCOS-II目录下。

(6)打开工程窗口user组中的main.c文件,编写实验程序并保存。

(7)根据程序设计来更改Os_cfg.h文件,配置μC/OS-II操作系统。

(对于本实验,μC/OS-II的配置使用模板默认设置即可)

(8)选用DebugInExram生成目标,然后编译链接工程

(9)将MagicARM2200-S的JP5、JP7跳线短接,JP13跳线断开。

注意:

JP7与IDE硬盘/CF卡电路的JP13跳线复用P0.7口。

(10)选择【Project】->【Debug】,启动AXD进行JTAG仿真调试。

(11)若JTAG连接出错,或AXD主窗口没有显示startup.s源程序,按产品配套光盘附带文档《ADS集成开发环境及仿真器应用》介绍的方法进行处理。

(12)全速运行程序,程序将会在main.c的主函数中停止(因为main函数起始处默认设置有断点)。

(13)全速运行程序,观察MagicARM2200-S的LED1~LED8显示,监听蜂鸣器是否蜂鸣。

蜂鸣器实验步骤:

(1)启动ADS1.2,使用ARMExecutableImageforUCOSII(MagicARM2200)工程模板建立一个工程GPIO,工程存储在uCOS-II目录下。

(2)打开工程窗口user组中的main.c文件,编写实验程序并保存。

(3)根据程序设计来更改Os_cfg.h文件,配置μC/OS-II操作系统。

(对于本实验,μC/OS-II的配置使用模板默认设置即可)

(4)选用DebugInExram生成目标,然后编译链接工程。

(5)将MagicARM2200-S的JP7、JP11跳线短接,JP4、JP13跳线断开。

注意:

JP7与IDE硬盘/CF卡电路的JP13跳线复用P0.7口;JP11与PS/2键盘鼠标接口的JP4_K_CLK跳线复用P0.20口。

(6)选择【Project】->【Debug】,启动AXD进行JTAG仿真调试。

(7)若JTAG连接出错,或AXD主窗口没有显示startup.s源程序,请按产品配套光盘附带文档《ADS集成开发环境及仿真器应用》介绍的方法进行处理。

(8)全速运行程序,程序将会在main.c的主函数中停止(因为main函数起始处默认设置有断点)。

(9)全速运行程序,然后按下/放开KEY1按键,监听蜂鸣器是否蜂鸣。

(10)当仿真调试通过后关闭AXD,在ADS1.2集成开发环境中选用RelOutChip生成目标,然后编译链接工程。

(11)将MagicARM2200-S的JP7、JP11跳线短接,JP4、JP13跳线断开。

(12)选择【Project】->【Debug】,启动AXD进行JTAG仿真调试。

此时EasyJTAG仿真器将会把程序下载到片外FLASH上(需要正确设置仿真器)。

(13)将JP1跳线断开,然后按MagicARM2200-S上的RST复位键,观察程序是否能脱机运行。

(14)实验结束后,在AXD中设置仿真器为片外RAM调试方式的设置,以便于后面实验的正确操作。

七、实验参考程序

在流水灯显示的程序中,显示的字母为LIXUE,分别对应ASCII码:

L--0x4CI--0x49X--0x58U--0x55E--0x45

全亮--0XFF全灭--0X00

流水灯一个周期的显示流程:

①流水灯全亮一次;

②流水灯全灭一次,显示一个字母;

③流水灯全亮一次。

根据字母显示的个数,计算出一个周期的需要的次数为12。

#include"config.h"

#include"stdlib.h"

//P0.7为蜂鸣器的控制I/O

#defineBEEP(1<<7)

//LED控制宏函数定义。

LED1--LED8的控制I/O为P1.16--P1.23

#defineLED_ADJ16

#defineLED_IOCON(0xFF<

#defineLED_OFF()IO1SET=LED_IOCON

#defineLED_DISP(dat)LED_OFF();IO1CLR=((dat)<

#defineTaskStkLengh100//定义用户任务堆栈长度

OS_STKTaskStk0[TaskStkLengh];//DefinetheTask0stack定义用户任务0的堆栈

OS_STKTaskStk1[TaskStkLengh];//DefinetheTask1stack定义用户任务1的堆栈

voidTask0(void*pdata);//Task0任务0

voidTask1(void*pdata);//Task0任务1

voidTask2(void*pdata);//Task0任务2

/***********************************主函数***********************************/

intmain(void)

{

OSInit

OSTaskCreate(Task0,(void*)0,&TaskStk0[TaskStkLengh-1],2);

OSStart();

return0;

}

/****************************Task0任务0**************************/

voidTask0(void*pdata)

{constuint8DISP_TAB[12]={0XFF,0x00,0x4C,0x00,0x49,0x00,0x58,0x00,0x55,0x00,

0x45,0x00

};

uint8i;

pdata=pdata;

TargetInit();

PINSEL0=0x;//设置P0口管脚连接GPIO

IO0DIR=BEEP;//设置蜂鸣器控制口为输出

IO0SET=BEEP;

IO1DIR=LED_IOCON;//设置LED1—LED8的控制口为输出

LED_OFF();

//建立任务1(用于蜂鸣器控制)

OSTaskCreate(Task1,(void*)0,&TaskStk1[TaskStkLengh-1],3);

while

(1)

{for(i=0;i<12;i++)

{LED_DISP(DISP_TAB[i]);//输出LED显示数据

OSTimeDly(OS_TICKS_PER_SEC/2);//延时0.5S

}

}

}

/**************************Task1任务1**************************/

voidTask1(void*pdata)

{

pdata=pdata;

while

(1)

{

OSTimeDly(OS_TICKS_PER_SEC*10);//延时10S

IO0CLR=BEEP;//控制蜂鸣器响

OSTimeDly(OS_TICKS_PER_SEC/2);

IO0SET=BEEP;

}

}

/**************************Task2任务2**************************/

voidTask2(void*pdata)

{

pdata=pdata;

TargetInit();

PINSEL0=PINSEL0&0xffff3fff;//管脚选择模块初始化

PINSEL1=PINSEL1&0xfffffcff;

IO0DIR&=~KEY1;//设置KEY1的控制I/O为输入

IO0DIR|=BEEP;//设置蜂鸣器为输出

IO0SET=BEEP;

OSTaskCreate(Task1,(void*)0,&TaskStk1[TaskStkLengh-1],5);

for(;;)

{

OSTaskSuspend(OS_PRIO_SELF);

IO0CLR=BEEP;

OSTimeDly(OS_TICKS_PER_SEC/8);

IO0SET=BEEP;

OSTimeDly(OS_TICKS_PER_SEC/4);

IO0CLR=BEEP;

OSTimeDly(OS_TICKS_PER_SEC/8);

IO0SET=BEEP;

OSTimeDly(OS_TICKS_PER_SEC/4);

}

}

八、实验心得

经过不断的修改与查找资料,终于完成了此次综合性设计实验,虽说这次设计的实验不是很大型,但是还是学到了很多东西,收获颇丰,不仅学习到了一些新的知识,回顾了一些以前快要遗忘的知识点,而且是自己的学习目标更加明确,学习方法更加完善,也体会到了软件开发的趣味,更加清楚的认识到了自己在软件开发及学习上的不足之处。

此次设计时按键控制流水灯,老师在我们设计之前讲解的很清晰,使得我们大家操作起来比较娴熟。

让我感觉到了软件编程的趣味性和实用性,虽说一些技术我们在课堂上也曾学习过,但是大都停留在理论基础上,实际开发很少,而这次实验给了我们一个很好的边学习边实践的机会,对我们深入学习这些技术有很大的帮助,深刻体会到了这些技术的实用性。

每当自己成功调试一段代码或者通过自己的努力克服一个技术困难,都颇有收获感。

这次实验让我们体验了软件的实用性,发现自己的不足,增加了一定的编程经验。

结束了此次实验,让我发现我对我们专业、对嵌入式技术、汇编语言都有了新的认识,通过这次实验,我了解到,要真真正正掌握到计算机程序不是一件简单的事情,但真正掌握后,它带给我们的将是无穷的便捷与科技,我会努力学习计算机的!

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1