您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文档 > 嵌入式系统实验报告(华中科技大学)
课程实验报告实验名称:嵌入式系统实验专业班级:计算机科学与技术x班学号:Ux姓名:x合作者:x实验时间:xxxx年xx月xx日计算机科学与技术学院试验一:bootloader(ads、引导)一、实验任务1、熟悉ADS1.2开发工具创建、编译、下载、调试工程2、串口通讯串口控制器初始化、收/发数据3、配置主机端的nfs服务器配置主机端的nfs服务器,以连接linux核心4、下载并运行linux核心使用自己的串口程序下载并运行linux核心二、实验内容编写串口接收数据函数编写串口发送数据函数学习ads、jtag调试、flash烧写打印菜单,等待用户输入下载并运行linux核心配置主机的nfs服务器,与linux核心连接三、实验步骤1.编写串口接收数据函数编写串口发送数据函数修改bootloader:菜单、串口收发、命令行;接收串口数据并做相应处理:while(1){打印菜单并等待用户输入;switch(ch)//根据用户输入做相应处理{case'1':imgsize=xmodem_receive((char*)KERNEL_BASE,MAX_KERNEL_SIZE);if(imgsize==0)//下载出错;else//下载成功;break;case'3':nand_read((unsignedchar*)KERNEL_BASE,0x00030000,4*1024*1024);case'2':BootKernel();//这里是不会返回的,否则出错;break;default:break;}}Bootloader的main()函数打印菜单:intmain(void){ARMTargetInit();//目标板初始化;//接收用户命令,传递linux核心;Uart_puts(Menu:\n\r);Uart_puts(1.LoadkernelviaXmodem;\n\r);Uart_puts(2.Bootlinux;\n\r);Uart_puts(3.Loadkernelfromflashandboot;\n\r);Uart_puts(Makeyourchoice.\n\r);do{ch=Uart_getc();}while(ch!='1'&&ch!='2'&&ch!='3');return0;}串口读写:voidUart_putc(charc){while(!SERIAL_WRITE_READY());((UTXH0)=(c));}unsignedcharUart_getc(){while(!SERIAL_CHAR_READY());returnURXH0;}2.使用ads1.2编译bootloader;3.使用uarmjtag下载、调试bootloader;4.使用axd查看变量、内存,单步跟踪;5.配置超级终端,与bootloader通讯;6.配置nfs;编辑/etc/export文件:/home/arm_os/filesystem/rootfs目标板ip(rw,sync)/home/arm_os/filesystem/rootfs主机ip(rw,sync)启动nfs服务器:/etc/init.d/nfsrestart测试nfs服务器是否正常运行:mount主机ip:/home/arm_os/filesystem/rootfs/mnt7.以root用户启动cutecom,将cutecom配置改为115200bps,8位,1位停止位,无校验,xmodem,nolineend;8.使用bootloader重新下载Linux核心映像,启动核心运行后,察看是否成功加载nfs上的root文件系统;9.启动Linux核心运行,察看结果;10.linux核心能够运行到加载root步骤,说明bootloader正常运行;11.将bootloader烧写到flash中,重启目标板电源,察看bootloader是否烧写正常,下载核心测试;目标板linux系统正常运行到命令行模式下,能够正常输入linux命令,说明实验成功。四、实验过程中遇到的问题及解决方案问题一:打开dubug,下载zImage失败,调试时发现下载失败原因是发生错误程序写为无限循环。解决方法:重新做了很多遍,仍然失败,最终发现同样的bootloader初始化及同样的下载操作在别的机器中能够正常运行,最终换了试验台终于成功地下载了核心映像。问题二:实验中虽然下载完成,但是在cutecom中并没有显示成功下载映像,没有出现#号不能进入命令行模式,不能够进行后续的操作。解决方法:因为不明白错误出现的原因,向老师提出疑问,经老师指点,发现linux系统中网络连接处没有网络连接,通过重新配置了ip地址,最终成功下载了核心映像。试验二:linuxkernel(gcc、make)一、实验任务1、熟悉基本的linux命令文件操作、文件编辑串口工具、程序开发2、配置linux核心makemenuconfig3、交叉编译linux核心makezImage二、实验内容熟悉基本的linux命令配置linux核心交叉编译linux核心调试自己编译的核心挂载nfs上的root(根目录)编写一个小程序在目标板上运行三、实验步骤1.登陆linux系统,在终端进入管理员模式;2.解压缩源码包到/home/下;3.察看解压缩后的/home/arm_os目录:Linux核心、编译器、rootfs等;4.配置并测试nfs;5.配置cutecom:115200,XModem,Nolineend;6.配置核心:makemenuconfig;7.编译核心:make;8.下载并运行核心,加载root文件系统;9.重新设置cutecom为LFlineend;熟悉基本的Linux命令;10.编写一个小程序hello.c在目标板上运行,察看结果。#includestdio.hIntmain(){Printf(“hello”);Return0;}四、实验中遇到的主要问题及解决方法问题1:写成的hello.c程序用gcc编译之后不能在目标板上运行。解决方法:通过请教老师才知道编译的命令不对,此实验板需要通过用arm-gcc-linux进行交叉编译,而不是用gcc,得到的可执行文件可以用命令./hello成功运行。试验三:linuxdriver(uart)一、实验任务1、Linux驱动编程基本接口常用函数2、串口驱动申请中断处理串口数据读、写二、实验内容编写串口驱动初始化、释放函数;编写串口驱动接收数据函数;编写串口驱动发送数据函数;编写串口驱动中断处理函数;编写串口访问应用程序;使用模块方式编译驱动;使用模块方式调试驱动;实现基本的串口数据收发。三、实验步骤1.编写初始化、释放函数:uart_init、uart_exit、uart_open、uart_release分别实现串口设备初始化、释放、打开、关闭串口设备初始化函数:intret;dev_tdevno=MKDEV(uart_major,0);if(uart_major){ret=register_chrdev_region(devno,1,uart);}else{ret=alloc_chrdev_region(&devno,0,1,uart);uart_major=MAJOR(devno);}if(ret0){printk(Registerchrdevregionfailed!\n);returnret;}cdev_init(&uart_cdev,&uart_fops);ret=cdev_add(&uart_cdev,devno,1);if(ret){printk(Addcdevicefailed!\n);returnret;}uart=ioremap(S3C2410_PA_UART1,0x4000);device_init();ret=request_irq(IRQ_S3CUART_RX1,irq_rev_uart,IRQF_DISABLED,uart,NULL);if(ret){printk(Requestirqfailed!\n);returnret;}loop_buffer_init(&readb,UART_SIZE);printk(Uartmoduleinit.\n);return0;串口设备释放函数:loop_buffer_free(&readb);free_irq(IRQ_S3CUART_RX1,NULL);cdev_del(&uart_cdev);unregister_chrdev_region(MKDEV(uart_major,0),1);printk(Uartmoduleexit.\n);2.编写串口驱动接收数据函数、发送数据函数、中断处理函数:irq_rev_uart、uart_write、uart_read,实现串口设备中断处理、读、写;串口设备中断处理函数:charc;while(!(__raw_readb(uart+S3C2410_UTRSTAT)&0x1));c=(char)__raw_readl(uart+S3C2410_URXH);loop_buffer_add(&readb,c);return0;串口设备读函数:inti=0;if(*ppos=UART_SIZE)return-EIO;if(*ppos+sizeUART_SIZE)size=UART_SIZE-*ppos;do{charc;if(!loop_buffer_del(&readb,&c)){copy_to_user(buf+i,&c,1);i++;}elseschedule_timeout(10);}while(isize);returnsize;串口设备写函数:inti;charwmem[UART_SIZE];if(*ppos=UART_SIZE)return-EIO;if(*ppos+sizeUART_SIZE)size=UART_SIZE-*ppos;copy_from_user(wmem,buf,size);for(i=0;isize;i++){while(!(__raw_readl(uart+S3C2410_UTRSTAT)&0x4));__raw_writel(*(wmem+i),uart+S3C2410_UTXH);}returnsize;串口访问应用程序:#includestdio.h#includefcntl.hintmain(){intuart_fd,i;charc;uart_fd=open(/dev/uart,O_RDWR);if(uart_fd0){printf(Opendeviceerror!\n);return-1;}for(i=0;i50;i++){read(uart_fd,&c,1);printf(%c,c);write(uart_fd,&c,1);if(c=='q')break;}close(uart_fd);return0;}3.用模块方式编译Linux核心,生成uart.ko,启动目标板Linux核心,用insmod、rmmod等命令操作模块;用printk打印调试串口驱动,包括中断相应,读写等;4.编写应用程序:uart.c,实现打开串口设备、读写等,把主机端由cutecom发过来的串口数据回传给主机;5.将目标板上串口线连到串口1;6.编译应用程序uart.c,实现和主机间的串口通讯。四、实验中遇到的问题及解决方法问题1:由于模块化编译方法不太了解,对其过程不清楚。解决方法:向老师提出疑问后才知道首先修改uart.c中的波特率,然后拷贝驱动:/home/arm_os/test/st/test3/driver/下的makefile和uart.c拷贝到:/home/arm_os/kernel/linux-2.6.29.8/driver/char下,再拷贝应用程序:把:/home/arm_os/test/st/tesT3/下的makefile和uart.c拷贝到自己的文件夹,用于测试。问题2:前面步骤都
本文标题:嵌入式系统实验报告(华中科技大学)
链接地址:https://www.777doc.com/doc-3936363 .html