《嵌入式系统原理》实验指导书目录《嵌入式系统原理》实验指导书 (1)目录 (1)实验报告要求: ....................................................................................... 错误!未定义书签。
实验一Linux的初步使用 (2)实验二linux驱动程序 (5)实验三交叉编译程序 (11)实验四编译内核与下载 (15)实验一Linux的初步使用实验目的:熟练掌握linux命令的使用,linux程序的编译与调试实验学时:3学时实验内容:1.掌握虚拟机VMWARE的基本应用;2. 掌握虚拟机中RED hat linux 的安装;3. 掌握基本linux命令的使用;4. 掌握linux程序编译与调试。
实验设备:装有VMWARE的PC机一台,RED HAT安装光盘(或ISO映像文件)。
实验步骤:1.创建一虚拟机MYLINUX1)从桌面上单击“VMWARE WORKSTAION”启动虚拟机软件,单击新建虚拟机,指定保存路径“D:\MYLINUX”,选择虚拟机操作系统类型:linux,然后完成虚拟机的创建;2)双击虚拟机中CDROM,选择将虚拟机光驱连接修改为:使用ISO映像,并指定映像文件为共享磁盘:I:\redhat-disk-1.iso。
3)单击虚拟机中启动虚拟机,开始从光盘上启动系统并安装linux。
2.安装linux注意:在虚拟机和主机之间进行切换方法:鼠标单击虚拟机,可以进入;要回到主机,请用CTRL+ALT1)输入回车,进入图形化安装;也可以linux text进入文本界面安装;2)选择Skip(跳过CD检查),回车3)点击NEXT(下一步)4)安装语言,选择简体中文;或选择English5)安装类型,选择定制:Custom6)分区选择:自动分区7)网络配置:选择为自动获取IP,无防火墙;8)设置根(root)用户密码:1234569)安装包选择:至少要选择:开发工具、编辑工具、内核开发工具。
如果实在不知选什么,可以选择:所有(everything),但这样安装时间较长。
10)安装过程中提示插入第2张磁盘时,请用鼠标右击虚拟机的标题栏,找到可移动设备中的CDROM,然后指定RED-HAT-disk-2.iso作为光盘映像文件。
3.练习linux命令的使用:启动linux后,在登录框中输入用户名:root,密码:123456(不显示),直到进入提示符状态#:执行如下命令,掌握基本命令的使用1)mkdir /mydir //建立文件夹2)cp /proc/version /mydir/ //复制文件3)cd /mydir //进入文件夹4)mv version myfile //重命名文件5)ls //显示目录6)cat myfile //显示文件内容7)vi myfile (按:q退出) //编辑文件下面是光驱的装载1)cd /mnt2)ls若没有CDROM,执行mkdir cdrom创建CDROM1)mount cdrom //装载光驱2)cd cdrom3)ls4)cd ..5)umount cdrom //卸载光驱4.vi 编辑器的使用用VI编辑一个文件:vi helloworld.c按i键进入插入模式,输入如下内容:#include <stdio.h>#inlcude <stdlib.h>int main(){printf(“hello world!\n”);return 0 ;}按ESC键退出插入模式.按:w保存文件按:q退出文件编辑.5.使用gcc命令编译该文件:gcc –o helloworld helloworld.c若有错,根据提示的行号修改错误,直到编译没有错误.执行:./helloworld查看是否能正确输出:hello world!.6 .用GDB调试test1.c带调试信息的编译:gcc –g –o test1 test1.c启动调试器:gdb test1在提示符下执行如下命令进行调试:1)list2)用回车继续执行上述命令,找到第2个函数的入口点行号3)break n //n为第2个函数的入口点行号(第19行)4)run5)step6)next7)用watch i,string2[i]来观察变量的变化反复执行next,直到循环退出.7.参考test2.c修改test1.c ,重新编译并运行,看是否能正确得到反转的结果. 实验小结:小结实验过程中遇到了哪些问题,是如何解决的?实验二linux驱动程序实验目的:1)熟悉驱动程序的结构;2)掌握驱动程序各函数的作用3)熟悉驱动程序的编译与运行实验学时:3学时实验设备:装有VMWARE的PC机一台,RED HAT安装光盘(或ISO映像文件)。
实验步骤:1.参照附录中的参考代码,使用VI完成skeleton.c与skeleton_test.c的编写.2.执行如下命令编译程序:export PATH=/opt/host/armv4l/bin:$PATHarmv4l-unkown-linux-gcc -D__KERNEL__ _DMODULE -I/s3c2410/kernel/include -o skeleton.o skeleton.carmv4l-unkonw-linux-gcc -o skeleton_test skeleton_test.c3.使用驱动程序插入模块:Insmod skeleton.o查看设备文件:/dev/skeleton执行测试程序./skeleton_test卸载模块:rmmod skeleton.o实验小结:参考代码:1. 驱动程序skeleton.c/* driver/char/skeleton.c* this is a skeleton char device driver*/#include <module.h>#include <linux/fs.h>#include <linux/iobuf.h>#include <linux/major.h>#include <linux/blkdev.h>#include <linux/capability.h>#include <linux/smp_lock.h>#include <asm/uacces.h>#include <asm/hardware.h>#include <asm/arch/cpu_s3c2410.h>#include <asm/io.h>#include <linux/vmalloc.h>#define IOWRITE 0xf021#define IOCLEAR 0xf022#define SKELETON_MAJOR 220#define STRLEN 100char skeleton_drvinfo[100];devfs_handle_t devfs_skeleton;int skeleton_open(struct inode *,struct file *);int skeleton_release(struct inode *,struct file *);int skeleton_ioctl(struct inode *,struct file *,unsigned int ,unsigned long); ssize_t skeleton_read(struct file *,char * ,size_t,loff_t *);ssize_t skeleton_write(struct file *,const char * ,size_t,loff_t *);static struct file_operations skeleton_fops={ioctl: skeleton_ioctl,open: skeleton_open,read: skeleton_read,write: skeleton_write,release: skeleton_release,};int skeleton_open(struct inode *inode,struct file *filp){printk("open ok\n");return 0;}ssize_t skeleton_read(struct file *filp,char *buf,size_t size,loff_t *offp) {char * _buf;_buf=skeleton_drvinfo;copy_to_user(buf,_buf,sizeof(skeleton_drvinfo);return 0;}ssize_t skeleton_write(struct file *filp,char *buf,size_t size,loff_t *offp) {char * _buf;_buf=skeleton_drvinfo;copy_from_user(_buf,buf,sizeof(skeleton_drvinfo);return 0;}int skeleton_release(struct inode *inode,struct file *filp){printk("release ok\n");return 0;}int skeleton_ioctl(struct inode *inode,struct file *filp,unsigned int command,unsigned arg) {int err=0;switch(command){case IOWRITE:printk("write ok\n");return 0;case IOCLEAR:printk("clear ok\n");return 0;default:err=-EINV AL;}return err;}int __init skeleton_init(void){devfs_skeleton=devfs_register(NULL,"skeleton",DEVFS_FL_DEFAULT,SKELETON_MAJOR,0,S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP,&skeleton_fops,NULL);return 0;}void __exit skeleton_exit (void){devfs_unregister(devfs_skeleton);}module_init(skeleton_init);module_exit(skeleton_exit);2.测试程序skeleton_test.c#include <stdio.h>#include <fcntl.h>#include <stdlib.h>char *device="/dev/skeleton";int skeleton_fd;char cBuffer[100];char readchar[100];int main( int argc,char *argv[]){int i,count;char *constchar;constchar="This is a skeleton device driver\n";sprintf(cBuffer,constchar);printf("driver info is %s\n",cBuffer);fflush(stdout);skeleton_fd=open(device,O_RDWR);if (skeleton_fd==-1){printf("Unable to open skeleton device");exit(0);}count=write(skeleton_fd,cBuffer,100);count=read(skeleton_fd,readchar ,100);printf("driver info is :%s\n",readchar );fflush(stdout);close(skeleton_fd);}实验三交叉编译程序实验目的:第一次正面接触嵌入式Linux 的开发,第一次编写嵌入式系统的应用程序,亲身实践一下开发的步骤。