嵌入式系统实验报告Word文档格式.docx

上传人:b****2 文档编号:3985949 上传时间:2023-05-02 格式:DOCX 页数:29 大小:2.90MB
下载 相关 举报
嵌入式系统实验报告Word文档格式.docx_第1页
第1页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第2页
第2页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第3页
第3页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第4页
第4页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第5页
第5页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第6页
第6页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第7页
第7页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第8页
第8页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第9页
第9页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第10页
第10页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第11页
第11页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第12页
第12页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第13页
第13页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第14页
第14页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第15页
第15页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第16页
第16页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第17页
第17页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第18页
第18页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第19页
第19页 / 共29页
嵌入式系统实验报告Word文档格式.docx_第20页
第20页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

嵌入式系统实验报告Word文档格式.docx

《嵌入式系统实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式系统实验报告Word文档格式.docx(29页珍藏版)》请在冰点文库上搜索。

嵌入式系统实验报告Word文档格式.docx

使用自己的串口程序下载并运行linux核心

二、实验内容

1.编写串口接收数据函数

2.编写串口发送数据函数

3.打印菜单,等待用户输入

4.下载并运行linux核心

5.配置主机的nfs服务器,与linux核心连接

三、实验步骤

(1)修改bootloader:

菜单、串口收发、命令行;

Bootloader的main()函数:

intmain(void)

{

ARMTargetInit();

//目标板初始化;

//接收用户命令,传递linux核心;

Uart_puts("

Menu:

\n\r"

);

Uart_puts("

1.LoadkernelviaXmodem;

2.Bootlinux;

\n\r"

3.Loadkernelfromflashandboot;

Makeyourchoice.\n\r"

do{

ch=Uart_getc();

}while(ch!

='

1'

&

&

ch!

2'

3'

return0;

}//main;

接收串口数据并做相应处理:

while

(1)

{

打印菜单并等待用户输入;

switch(ch)//根据用户输入做相应处理

{

case'

:

imgsize=xmodem_receive((char*)KERNEL_BASE,MAX_KERNEL_SIZE);

if(imgsize==0)//下载出错;

else//下载成功;

break;

nand_read((unsignedchar*)KERNEL_BASE,0x00030000,4*1024*1024);

BootKernel();

//这里是不会返回的,否则出错;

default:

}

}

串口读写:

voidUart_putc(charc)

while(!

SERIAL_WRITE_READY());

((UTXH0)=(c));

unsignedcharUart_getc()

SERIAL_CHAR_READY());

returnURXH0;

}

(2)使用ads1.2编译bootloader;

(3)使用uarmjtag下载、调试bootloader;

(4)使用axd查看变量、内存,单步跟踪;

(5)配置超级终端,与bootloader通讯;

(6)使用超级终端下载Linux核心映像;

(7)启动Linux核心运行,察看结果;

(8)linux核心能够运行到加载root步骤,说明bootloader正常运行;

(9)将bootloader烧写到flash中,重启目标板电源,察看bootloader是否烧写正常,下载核心测试;

(10)主机重启到Fedora,配置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/mnt

(11)以root用户启动cutecom,将cutecom配置成115200bps,8位,1位停止位,无校验,xmodem,nolineend;

(12)使用bootloader重新下载Linux核心映像,启动核心运行后,察看是否成功加载nfs上的root文件系统;

目标板linux系统正常运行到命令行模式下,能够正常输入linux命令,说明实验成功。

四、实验过程中遇到的问题及解决方案

问题一:

cmd命令行下烧写bootloader时出现错误,ERROR:

K9S1208ISNOTDETECTED.

解决方法:

询问助教,忽略此错误。

问题二:

最后一步使用bootloader重新下载linux核心映像之后,目标板linux系统始终无法正常运行到linux命令模式下。

重新到xp下,设置bootlinux.c中的Linux核心启动命令行:

char*linux_cmd="

noinitrdinit=/initroot=/dev/nfsnfsroot=172.16.68.25:

/home/arm_os/filesystem/rootfs,tcpip=172.16.68.24console=ttySAC0"

;

通过此设置指定root在nfs服务器上,保持nfs:

ip地址的一致。

linuxkernel(gcc、make)

1、熟悉基本的linux命令

文件操作、文件编辑

串口工具、程序开发

2、配置linux核心

makemenuconfig

3、交叉编译linux核心

makezImage

●熟悉基本的linux命令

●配置linux核心

●交叉编译linux核心

●调试自己编译的核心

●挂载nfs上的root(根目录)

●编写一个小程序在目标板上运行

1.登陆Fedora,在终端进入管理员模式;

2.解压缩源码包到/home/下;

3.察看解压缩后的/home/arm_os目录:

Linux核心、编译器、rootfs等;

4.配置并测试nfs;

5.配置cutecom:

115200,XModem,Nolineend;

6.配置核心:

makemenuconfig;

7.编译核心:

make;

8.下载并运行核心,加载root文件系统;

9.重新设置cutecom为LFlineend;

10.熟悉基本的Linux命令;

11.编写一个小程序hello.c在目标板上运行,察看结果。

#include<

stdio.h>

Intmain(){

Printf(“hello”);

Return0;

四、实验中遇到的主要问题及解决方法

问题一:

核心的配置和编译都成功了,但是打开cutecom不能进入命令行模式,说明加载root文件系统失败,不能调试自己编译的核心。

观察mount之后的/mnt目录下是空的,进入XP下发现D盘是空的,于是重新拷贝核心映像文件,重复实验一的工作,最后成功加载root文件系统,进入cutecom命令行。

问题二:

写成的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_major=MAJOR(devno);

if(ret<

0){printk("

Registerchrdevregionfailed!

\n"

returnret;

cdev_init(&

uart_cdev,&

uart_fops);

ret=cdev_add(&

uart_cdev,devno,1);

if(ret){printk("

Addcdevicefailed!

returnret;

uart=ioremap(S3C2410_PA_UART1,0x4000);

device_init();

ret=request_irq(IRQ_S3CUART_RX1,irq_rev_uart,IRQF_DISABLED,"

NULL);

Requestirqfailed!

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);

串口设备读函数:

inti=0;

if(*ppos>

=UART_SIZE)return-EIO;

if(*ppos+size>

UART_SIZE)size=UART_SIZE-*ppos;

do

charc;

if(!

loop_buffer_del(&

readb,&

c))

copy_to_user(buf+i,&

c,1);

i++;

else

schedule_timeout(10);

}while(i<

size);

returnsize;

串口设备写函数:

inti;

charwmem[UART_SIZE];

=UART_SIZE)return-EIO;

UART_SIZE)

size=UART_SIZE-*ppos;

copy_from_user(wmem,buf,size);

for(i=0;

i<

size;

i++){

while(!

(__raw_readl(uart+S3C2410_UTRSTAT)&

0x4));

__raw_writel(*(wmem+i),uart+S3C2410_UTXH);

串口访问应用程序:

#include<

fcntl.h>

intmain()

{

intuart_fd,i;

uart_fd=open("

/dev/uart"

O_RDWR);

if(uart_fd<

0)

{printf("

Opendeviceerror!

return-1;

}

for(i=0;

50;

read(uart_fd,&

printf("

%c"

c);

write(uart_fd,&

if(c=='

q'

)break;

close(uart_fd);

(3)用模块方式编译Linux核心,生成uart.ko,启动目标板Linux核心,用insmod、rmmod等命令操作模块;

用printk打印调试串口驱动,包括中断相应,读写等;

(4)编写应用程序:

uart.c,实现打开串口设备、读写等,把主机端由cutecom发过来的串口数据回传给主机;

(5)将目标板上串口线连到串口1;

(6)编译应用程序uart.c,实现和主机间的串口通讯。

四、实验中遇到的问题及解决方法

在超级终端下打开cutecom失败

由于没有使用交换机,网络需要重新激活,激活网络之后,cutecom打开成功。

对模块化编译方法不太了解,对其过程不清楚。

经老师点拨,逐渐明白其过程:

首先修改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/tes

T3/下的makefile和uart.c拷贝到自己的文件夹,用于测试。

linuxdriver(touchscreen)

1、触摸屏驱动

初始化

坐标值

2、触摸屏、图形系统协调工作

触摸屏校准

拨号键盘

●编写触摸屏驱动初始化、释放函数;

●编写触摸屏驱动读取数据函数;

●编写触摸屏驱动中断处理函数;

●使用模块方式调试驱动;

●编写触摸屏读取应用程序;

●编写简单图形系统绘制应用程序,绘制一个数字键盘;

●实现基本的触摸键盘程序。

(1)函数:

ts_init、ts_exit、ts_open、ts_release,实现触摸屏设备初始化、释放、打开、关闭;

触摸屏设备初始化函数:

dev_tdevno=MKDEV(ts_major,0);

if(ts_major){

ret=register_chrdev_region(devno,1,“ts_ads7843"

ts_ads7843"

ts_major=MAJOR(devno);

ts_cdev,&

ts_fops);

ts_cdev,devno,1);

spi0_base=ioremap(S3C2410_PA_SPI,0x20);

init_waitqueue_head(&

wq);

ret=request_irq(IRQ_EINT5,ts_isr,IRQF_DISABLED,"

ts_ads7843"

TS_OPEN_INT();

ts_time=jiffies;

Ts_ads7843moduleinit.\n"

触摸屏设备释放函数:

free_irq(IRQ_EINT5,NULL);

ts_cdev);

unregister_chrdev_region(MKDEV(ts_major,0),1);

Ts_ads7843moduleexit.\n"

ts_isr、ts_read,实现触摸屏读、中断处理

触摸屏设备中断处理函数:

if(jiffies<

ts_time+HZ/20)

if((s3c2410_gpio_getpin(S3C2410_GPF5)

ADS7843_PIN_PEN)==0)

udelay(10);

get_XY();

wake_up_interruptible(&

udelay

(2);

触摸屏设备读函数:

structts_retts_ret;

intsize=0;

while(count>

=sizeof(structts_ret))

interruptible_sleep_on(&

ts_ret.x=x;

ts_ret.y=y;

ts_ret.pressure=PEN_DOWN;

copy_to_user(buffer,(char*)&

ts_ret,sizeof(structts_ret));

count-=sizeof(structts_ret);

size+=sizeof(structts_ret);

}

(3)用模块方式编译Linux核心,生成ts_ads7843.ko,启动目标板Linux核心,用insmod、rmmod等操作模块;

(4)用printk打印调试触摸屏驱动,包括中断相应,读等;

(5)编写应用程序:

ts_ads7843.c,实现打开触摸屏设备、读等;

(6)根据该算法得到相应程序。

触摸屏访问应用程序:

#defineXmin500

#defineXmax2200

#defineYmin1400

#defineYmax3000

staticstructts_ret{

unsignedintpressure;

unsignedintx;

unsignedinty;

}ts_ret;

intmain()

intx,y;

intts_fd,i;

structts_retts_ret;

ts_fd=open("

/dev/ts_ads7843"

if(ts_fd<

0){

Opentsdeviceerror!

i++){

if(read(ts_fd,&

ts_ret,sizeof(structts_ret))){

if(ts_ret.x<

Xmin)ts_ret.x=Xmin;

if(ts_ret.x>

Xmax)ts_ret.x=Xmax;

if(ts_ret.y<

Ymin)ts_ret.y=Ymin;

if(ts_ret.y>

Ymax)ts_ret.y=Ymax;

x=(ts_ret.x-Xmin)*640/(Xmax-Xmin);

y=(ts_ret.y-Ymin)*480/(Ymax-Ymin);

%d,%d,%d\n"

x,y,ts_ret.pressure);

close(ts_fd);

(7)在ts_ads7843.c中增加简单图形系统绘制函数,绘制数字键盘,对触摸屏设备数据进行校正,实现触摸键盘的功能。

四、实验中出现的主要问题和解决方法

挂载网络文件系统上的root再次失败。

经过仔细观察总结,发现系统中的编辑/etc/export文件设置为:

/home/rootfs目标板ip(rw,sync)

/home/rootfs主机ip(rw,sync)

分析可能是上一次做实验的人用的主目录路径跟我们的不一样,于是我们重新以/home/rootfs为路径测试测试nfs服务器:

/homerootfs/mnt,在后续文件操作中也一直注意这个方面,解决了多次挂载失败的问题。

主要是触摸屏校正的问题

按课件上的方法耐心地测试,多次实验后将所得到的值进行求平均数。

这样,可以让触摸屏稍微正确一点。

但是还是会有偏差。

如果用指尖去点,可以准确很多

GPRS综合试验(framebuffer)GPRS综合试验

1、GPRS模块控制试验

串口控制GPRS模块

AT命令集

2、综合实验

电话拨号

短消息发送

二、实验过程

对应的命令集:

1、加载必要的模块和程序。

2、插入SIM卡到串口的GPRS模块,准备通信。

3、拨打电话和发送短

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

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2