嵌入式系统实验报告_第1页
嵌入式系统实验报告_第2页
嵌入式系统实验报告_第3页
嵌入式系统实验报告_第4页
嵌入式系统实验报告_第5页
已阅读5页,还剩8页未读, 继续免费阅读

下载本文档

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

文档简介

1、PXA270嵌入式实验开发系统LINUX实验报告本学期通过三节嵌入式实验课的学习,对LINUX系统和嵌入式系统有了一个大致的了解。期间一共做了十四个实验,具体实验内容如下:实验一 建立硬件实验平台本实验是以后所有实验的硬件基础,需要正确连接宿主PC机与PXA270-EP目标板,PXA270目标板与电源连接,用一根串口线将目标板串口0与PC机后方的串口相连,用一根交叉对接的网线将宿主PC机网口与目标板网口相连。实验二 Linux操作系统RedHat 9的安装按照实验书所讲的步骤在Linux虚拟机中正确安装RedHat 9,这是以后所有实验的软件基础。实验三 建立主机软件开发环境建立宿主PC机端的

2、开发环境,此实验开始需要在RedHat 9中的终端窗口(Terminal)中输入命令:虚拟机载入ISO镜像270EP.iso,登陆RedHat,启动终端窗口,对cdrom镜像进行挂载(mount /dev/cdrom /mnt/cdrom),用“./install”命令进行iso安装,安装完成,修改/ect/profile的环境变量(pathmunge /usr/local/arm-linux-/bin)。实验四 配置超级终端 超级终端作为嵌入式实验性的终端,监视并控制其工作状态。串口设置(每秒位数:115200;位数据:8;奇偶校验:无;停止位:1;数据流控制:无;)。实验五 配置TFTP配

3、置宿主PC机端的TFTP(简单文件传输协议)服务,并开通此服务。登陆RedHat,启动终端窗口,输入setup,选择System services,取消ipchains和iptables两项服务,选中tftp服务,取消防火墙,重启TFTP服务(service xinetd restart),设置PC机ip地址为00(ifconfig eth0 00 up),使用tftp服务得到文件zImage。实验六 配置NFS服务 配置宿主PC机端的NFS(网络文件系统)服务,并开通此服务。登陆RedHat,启动终端窗口,输入setup,选择System serv

4、ices,选中nfs服务,保存退出,打开/ect/exports文件,在其中加入“/ 0 (rw,insecure,no_root_squash,no_all_squash)”,然后重启服务(service nfs restart)。注意:每次启动宿主PC机上的Linux操作系统时,需要通过命令ifconfig eth0 00 up重置宿主PC机的IP地址,并在超级终端中用命令ifconfig eth0 0给PXA270实验开发系统设置IP地址。 以上几个实验算是给以后的实验配置了软硬件条件,是以后各个实验的基础。实验七 Hel

5、loWorld 从此实验开始第一次正面接触嵌入式Linux的开发,第一次编写嵌入式系统的应用程序。打开宿主PC机登陆RedHat,打开实验箱连接,root登陆实验箱,设置实验箱ip地址为0(ifconfig eth0 0 up),挂载宿主机根目录到实验板/mnt目录下,然后进入mnt目录;RedHat中打开终端窗口,进入home目录建立文件夹HW,并在其中建立HelloWorld.c文件,vi编辑器编辑它。基本C语言代码为:#include<stdio.h>Int main()printk(“HelloWorld!n”);return 0

6、;在终端窗口下进行交叉编译arm-linux-gcc o HelloWorld HelloWorld.c ,生成.o目标文件,进入超级终端的界面,回到/mnt/home/HW目录下,编译HelloWorld(./HelloWorld),看到打印输出“HelloWorld!”。实验十二 简单设备驱动程序该实验需要在宿主PC机端编辑三个文件:驱动程序、编译驱动程序时用的Makefile、测试程序。驱动程序pxa270_hello_drv.c如下:#include <linux/config.h>#include <linux/kernel.h>#include <li

7、nux/sched.h>#include <linux/timer.h>#include <linux/init.h>#include <linux/module.h>#include <asm/hardware.h> /程序所需的各种同文件/ HELLO DEVICE MAJOR#define SIMPLE_HELLO_MAJOR96#define OURS_HELLO_DEBUG #define VERSION "PXA2700EP-SIMPLE_HELLO-V1.00-060530"void showversion

8、(void)printk("*");printk("t %s tn",VERSION);printk("*"); /显示版本/ - READ -/*读取模块,用于将指定文件描述符中读取数据,file:是文件指针buf:读取数据缓存区count:请求传输的字节数f_ops:文件当前偏移量*/ssize_t SIMPLE_HELLO_read (struct file * file ,char * buf, size_t count, loff_t * f_ops)#ifdef OURS_HELLO_DEBUGprintk("S

9、IMPLE_HELLO_read-kernel-n");#endifreturn count;/ - WRITE -/*写模块,用于向打开的文件写数据,写操作从文件当前偏移量开始file:是文件指针buf:写入数据缓存区count:请求传输的字节数f_ops:文件当前偏移量*/ssize_t SIMPLE_HELLO_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops)#ifdef OURS_HELLO_DEBUGprintk("SIMPLE_HELLO_write-kernel

10、-n");#endifreturn count;/ - IOCTL -/*控制IO设备,设备驱动程序中对设备的I/O通道进行管理的函数inode:设备节点flip:打开的一个文件cmd:驱动程序的特殊命令编号data:接收剩余参数*/ssize_t SIMPLE_HELLO_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, long data)#ifdef OURS_HELLO_DEBUGprintk("SIMPLE_HELLO_ioctl-kernel-n");#endifret

11、urn 0;/ - OPEN -/*打开函数Inode:打开文件所对应的i节点,主要获取从设备号flip:打开的一个文件调用了宏MOD_INC_USE_COUNT,这个宏主要用来增加驱动程序使用计数器,避免不正确卸载程序*/ssize_t SIMPLE_HELLO_open (struct inode * inode ,struct file * file)#ifdef OURS_HELLO_DEBUGprintk("SIMPLE_HELLO_open-kernel-n");#endifMOD_INC_USE_COUNT;return 0;/ - RELEASE/CLOSE

12、 -/*关闭函数Inode:打开文件所对应的i节点,主要获取从设备号flip:打开的一个文件调用了宏MOD_DEC_INC_USE_COUNT,这个宏主要用来减少驱动程序使用计数器*/ssize_t SIMPLE_HELLO_release (struct inode * inode ,struct file * file)#ifdef OURS_HELLO_DEBUGprintk("SIMPLE_HELLO_release-kernel-n");#endifMOD_DEC_INC_USE_COUNT;return 0;/ -/*SIMPLE_HELLO设备向系统注册*/s

13、truct file_operations HELLO_ops =open:SIMPLE_HELLO_open,read:SIMPLE_HELLO_read,write:SIMPLE_HELLO_write,ioctl:SIMPLE_HELLO_ioctl,release:SIMPLE_HELLO_release,;/ - INIT -/*驱动程序初始化devfs_register_chrdev(SIMPLE_HELLO_MAJOR,"hello_serial_ctl",& HELLO_ops) 为最主要的语句,devfs_register_chrdev注册设备驱动

14、程序,包括主设备号、驱动程序名、结构体指针*/static int _init HW_ HELLO_init(void)int ret = -ENODEV;ret = devfs_register_chrdev(SIMPLE_HELLO_MAJOR, "hello_serial_ctl",& HELLO_ops);showversion();if(ret<0)printk("pxa270 init_module failed with %d n-kernel-",ret);elseprintk("pxa270 hello_driv

15、er register success!-kernel-n");return ret; /*模块初始化函数,调用HW_ HELLO_init 函数*/static int _init pxa270_ HELLO_init(void) int ret = -ENODEV;#ifdef OURS_HELLO_DEBUGprintk("pxa270_ HELLO_init-kernel-n");#endif ret = HW_ HELLO_init(); if (ret) return ret; return 0;/*模块卸载函数 devfs_unregister_ch

16、rdev(SIMPLE_HELLO_MAJOR,"hello _ctl") 为最主要的语句,devfs_unregister_chrdev卸载设备驱动程序,包括主设备号、驱动程序名*/static void _exit cleanup_ HELLO_ctl(void)#ifdef OURS_HELLO_DEBUGprintk("cleanup_HELLO_ctl-kernel-n");#endifdevfs_unregister_chrdev (SIMPLE_HELLO_MAJOR, "hello_ctl" );/*/MODULE_D

17、ESCRIPTION("simple hello driver module");/一些描述信息MODULE_AUTHOR("liduo");/驱动作者MODULE_LICENSE("GPL");module_init(pxa270_HELLO_init);/指定驱动程序初始化函数module_exit(cleanup _HELLO_ctl);/指定驱动程序卸载函数编译程序Makefile如下:#TOPDIR := $(shell cd .; pwd)TOPDIR := .KERNELDIR = /pxa270_linux/linux

18、INCLUDEDIR = $(KERNELDIR)/includeCROSS_COMPILE=arm-linux-AS =$(CROSS_COMPILE)asLD =$(CROSS_COMPILE)ldCC =$(CROSS_COMPILE)gccCPP =$(CC) -EAR =$(CROSS_COMPILE)arNM =$(CROSS_COMPILE)nmSTRIP =$(CROSS_COMPILE)stripOBJCOPY =$(CROSS_COMPILE)objcopyOBJDUMP =$(CROSS_COMPILE)objdumpCFLAGS += -I.CFLAGS += -Wal

19、l -O -D_KERNEL_ -DMODULE -I$(INCLUDEDIR)TARGET = pxa270_hello_drv.omodules: $(TARGET)all: $(TARGET)pxa270_hello_drv.o:pxa270_hello_drv.c$(CC) -c $(CFLAGS) $ -o $install:install -d $(INSTALLDIR)install -c $(TARGET).o $(INSTALLDIR)clean:rm -f *.o * core .dependMake工程管理器读入Makefile文件的内容执行编译工作,一个Makefile

20、文件包括:(1)由make工具创建的目标体(target),通常是目标文件或可执行文件;(2)要创建目标体所依赖的文件(dependency_file);(3)创建每个目标需要运行的命令(command)以上两个文件编辑后,然后make modules编译驱动程序,编写测试文件simple_test_driver.c,然后GCC编辑器编译测试程序生成test测试文件,进入超级终端开始挂载,加载驱动程序,./test测试,实验完成。 通过本实验,初步认识了嵌入式系统程序的语法特点以及要运行所需的各种条件,学习了Linux驱动程序构架以及在应用程序中如何调用程序,为以后的实验打下了基础。实验十三

21、CPU GPIO驱动程序设计该实验与实验十二实验步骤基本相同,程序略有不同:/ -IOCTL-switch (cmd)case LED_ON : GPCR3 |= 0x1;break;/如果cmd=LED_ON,那么GPCR3置为1case LED_OFF: GPSR3 |= 0x1;break;/如果cmd=LED_OFF,那么GPSR3置为1 default : printk ("lcd control : no cmd run -kernel- n"); return (-EINVAL); / -INIT-GPDR3 |= 0x00000001; /设置GPIO96输

22、出模式:开灯GPSR3 |= 0x00000001; / 关灯实验现象是目标板的核心板上的LED闪烁。通过本实验,编写了针对实际硬件的驱动程序,是自己对嵌入式程序有了一个更直观的理解,进一步了解了驱动构架。实验十四 中断实验该实验与之前两个实验步骤基本相同,程序略有不同:/ -INIT -ret = request_irq(SIMPLE_INT_IRQ, &SIMPLE_INT_interrupt, SA_INTERRUPT, "int_ctl", NULL);解释:request_irq申请硬件中断,参数包括申请的硬件中断号、设备id、中断处理的一些属性(SA_I

23、NTERRUPT是快速处理程序,调用时屏蔽所有中断)等/-卸载-free_irq(SIMPLE_INT_IRQ,NULL);解释:对应request_irq释放中断实验现象是每当按下目标板上的SW2 键时就会触发中断,并且打印相应的响应信息。实验十五 数码管显示驱动实验 不同之处:/-WRITE-void write_bit(int data)GPCR2 |= (0x1 << 27);if(data & 0x80) = 0x80)GPSR2 |= (0x1 << 26);elseGPCR2 |= (0x1 << 26);GPSR2 |= (0x1 &

24、lt;< 27);void write_byte(int data)int i; for(i=0;i<8;i+) write_bit( data << i ); /-gpio INIT-printk("GPDR2 = %xn",GPDR2);GPDR2 = GPDR2 | (0x3<<26);printk("GPDR2 = %xn",GPDR2);通过本实验,学习了串并转换的相关知识,并编写了驱动程序,对嵌入式系统可实现的功能有了更深入的了解。实验十六 LED点阵驱动程序设计/-WRITE-int tmp_buf;/

25、-tmp_buf = buf1;tmp_buf = tmp_buf<<8;tmp_buf = tmp_buf | buf0;#ifdef OURS_LED_DEBUGprintk("tmp = %xn",tmp_buf);#endifoutw(tmp_buf,ioremap_addr);/-CLOSE-outw(0x0000,ioremap_addr); / close the led ary, all led off/-INIT-ioremap_addr=ioremap(0x0800c000,0x0f); / outw(0x00ff,ioremap_addr); / open led ary, all led on/-程序卸载-outw(0x0000,ioremap_addr);本实验编写了一个针对总线操作的硬件驱动程序。实验十七 AD驱动实验struct ucb1x00 *ad

温馨提示

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

最新文档

评论

0/150

提交评论