嵌入式综合实验报告

嵌入式综合实验报告
嵌入式综合实验报告

基于OV511芯片的摄像头图像采集显示系统

【实验目的】

1、掌握OV511摄像头和V4L视频驱动的配置方法。

2、掌握JPEG的交叉编译与移植的过程。

3、掌握帧缓冲编程原理以及利用帧缓冲显示图像的编程方法。

【实验原理】

USB摄像头以其良好的性能和低廉的价格得到广泛应用。同时因其灵活、方便的特性,易于集成到嵌入式系统中,现有的符合Video for Linux标准的驱动程序配合通用应用程序,可以实现USB摄像头视频数据的采集及应用开发。

摄像头属于视频类设备。在目前的Linux核心中,视频部分的标准是Video for Linux(简称V4L)。这个标准其实定义了一套接口,内核、驱动、应用程序以这个接口为标准进行交流。目前的V4L涵盖了视、音频流捕捉及处理等内容,USB摄像头也属于它支持的范畴。

1、Video4Linux和USB摄像头驱动配置

如果需要在Linux操作系统中使用USB摄像头进行视频数据采集,则必须在进行内核配置时,应检查Linux 内核中是否已经添加了对Video4Linux驱动和对USB摄像头驱动模块的支持。

本实验采用静态加载驱动。

首先切换linux源代码所在的目录,并终端输入make menuconfig,系统弹出基于Ncurses 内核配置图形界面(如图1所示),便可进行内核选项的配置。

图1内核配置主界面

1.1、配置界面的使用方法

(1)、在菜单方式的配置界面上可用上下方向键来在各菜单之间移动;

(2)、在标有"---->" 标志的地方按回车键进入下级菜单;

(3)、按两次或选择则返回到上级菜单;

(4)、按“h” 键或选择下面的则可看到配置帮助信息;

(5)、按 键则在各控制选项之间移动;

(6)、Y表示包含该功能选项配置在内核中,M表示以模块的方式编译到内核中,N表示该功能选项不进行编译;

(7)、设置状态在[ ] 或< > 中以“ * “(选择), “ M “ (模块), 空格(除外)来表示。

1.2、Video4Linux驱动配置

对Video4Linux支持驱动进行配置,选中多媒体设备选项“Multimedia device->”(如图1-1所示)按回车,进入多媒体设备配置界面(如图2所示),在多媒体配置界面中,选中“Video For Linux”,加载video4linux模块,就可以使内核实现对Video4Linux驱动的支持,为视频采集设备提供编程接口。

图2 内核配置-多媒体设备配置界面

1.3、USB驱动配置

配置好内核对Video4Linux驱动后,返回内核配置主界面,选中USB支持选项(如图3 所示)“USB support—>”按回车,进入USB支持配置界面。

图3 内核配置主界面-USB支持

在USB支持配置界面中,选中“USB Multimedia device”选项下的“USB OV511 Camera support”,使内核中加入OV511接口芯片的USB数字摄像头的驱动支持。(如图4 所示)。

图4 OV511 USB 摄像头驱动配置界面

2、JPEG的交叉编译与移植

本实验为了节省有限的存储空间,将数据帧转为JPEG格式存储,为了支持对实验过程中生成的JPEG格式图片的各种操作,例如将JPEG格式的图片转为BMP格式图片显示时,需要JPEG的交叉编译与移植。在移植前,需要找到libjpeg,可以在以下网址下载:https://www.360docs.net/doc/4215064013.html,/source/libjpeg/libjpeg-6b.tar.gz。

jpeg的交叉编译与移植的过程如下:

tar -zxvf libjpeg-6b.tar.gz

cd libjpeg-6b

./configure --enable-shared --enable-static --prefix=/usr/local/arm/3.4.5/arm-linux --build=i386 --host=arm

然后修改生成的Makefile

gedit Makefile

cc =gcc 改为CC=arm-linux-gcc

AR=ar rc 改为AR=arm-linux-ar rc

AR2=ranlib 改为AR2=arm-linux-rablib

make

make install-lib

然后在当前的目录下

ls –a

cd .libs

ls

会出现图5所示的结果,这就是需要移植到目标板上面的文件。

图5

把libjpeg.a、https://www.360docs.net/doc/4215064013.html,、libjpeg.so、libjpeg.so.62、libjpeg.so.62.0.0拷到目标板的/lib目录下,把cjpeg、djpeg拷到目标板的/bin目录下就完成了jpeg的交叉编译与移植。

3、帧缓冲编程原理以及利用帧缓冲显示图像

在PC上面仿真的时候需要开启并使用帧缓冲设备。

3.1、帧缓冲编程原理

帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,它允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。

Linux FrameBuffer 本质上只是提供了对图形设备的硬件抽象,在开发者看来,FrameBuffer 是一块显示缓存,往显示缓存中写入特定格式的数据就意味着向屏幕输出内容。所以说FrameBuffer就是一块白板。例如对于初始化为16 位色的FrameBuffer 来说,FrameBuffer中的两个字节代表屏幕上一个点,从上到下,从左至右,屏幕位置与内存地址是顺序的线性关系。

帧缓存可以在系统存储器(内存)的任意位置,视频控制器通过访问帧缓存来刷新屏幕。帧缓存也叫刷新缓存Frame buffer 或refresh buffer, 这里的帧(frame)是指整个屏幕范围。

帧缓存有个地址,是在内存里。我们通过不停的向frame buffer中写入数据,显示控制器就自动的从frame buffer中取数据并显示出来。全部的图形都共享内存中同一个帧缓存。

CPU指定显示控制器工作,则显示控制器根据CPU的控制到指定的地方去取数据和指令,目前的数据一般是从显存里取,如果显存里存不下,则从内存里取,内存也放不下,则从硬盘里取,当然也不是内存放不下,而是为了节省内存的话,可以放在硬盘里,然后通过指令控制显示控制器去取。帧缓存Frame Buffer,里面存储的东西是一帧一帧的,显卡会不停的刷新Frame Buffer, 这每一帧如果不捕获的话,则会被丢弃,也就是说是实时的。这每一帧不管是保存在内存还是显存里,都是一个显性的信息,这每一帧假设是800x600的分辨率,则保存的是800x600个像素点和颜色值。

显示器可以显示无限种颜色,目前普通电脑的显卡可以显示32位真彩、24位真彩、16位增强色、256色。除256色外,大家可以根据自己的需要在显卡的允许范围之内随意选择。很多用户有一种错误概念,认为256色是最高级的选项,而实际上正好相反。256色是最低级的选项,它已不能满足彩色图像的显示需要。16位不是16种颜色,而是2的16次平方(256×256)种颜色,但256色就是256(2的8次平方)种颜色。所以16位色要比256色丰富得多。

帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达32 个,分别为/dev/fb0到/dev/fb31,而/dev/fb则为当前缺省的帧缓冲设备,通常指向/dev/fb0。当然在嵌入式系统中支持一个显示设备就够了。帧缓冲设备为标准字符设备,主设备号为29,次设备号则从0到31。分别对应/dev/fb0-/dev/fb31。通过/dev/fb,应用程序的操作主要有这几种:

(1)读/写(read/write)/dev/fb:相当于读/写屏幕缓冲区。例如用cp /dev/fb0 tmp命令可将当前屏幕的内容拷贝到一个文件中,而命令cp tmp > /dev/fb0 则将图形文件tmp显示在屏幕上。

(2)映射(map)操作:由于Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。为此,Linux在文件操作

file_operations结构中提供了mmap函数,可将文件的内容映射到用户空间。对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。实际上,使用帧缓冲设备的应用程序都是通过映射操作来显示图形的。由于映射操作都是由内核来完成,下面我们将看到,帧缓冲驱动留给开发人员的工作并不多。

(3)I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,显示颜色数,屏幕大小等等。ioctl的操作是由底层的驱动程序来完成的。

在本实验中,使用内存映射(mmap)将帧缓冲设备中的屏幕缓冲区映射到进程中的一段虚拟地址空间,接着,通过读写该虚拟地址来访问屏幕缓冲区,实现在屏幕上绘图或者保存屏幕上的绘图信息等操作。

3.2、帧缓冲设备的开启

(1)只需要将/etc/grub.conf改成如下形式就行了(加粗那一行中的vga=0x314是修改过的): # grub.conf generated by anaconda

# Note that you do not have to rerun grub after making changes to this file

# NOTICE: You do not have a /boot partition. This means that

# all kernel and initrd paths are relative to /, eg.

# root (hd0,0)

# kernel /boot/vmlinuz-version ro root=/dev/sda1

# initrd /boot/initrd-version.img

#boot=/dev/sda

default=0

timeout=10

splashimage=(hd0,0)/boot/grub/splash.xpm.gz

title Red Hat Linux (2.4.18-14)

root (hd0,0)

kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/ hdc=ide-scsi vga=0x314

其中

(2)设置完成后,重启系统,会发现启动过程中出现一个企鹅的图标,说明修改成功,已经启动帧缓冲设备。

【实验仪器】

1、装有Linux操作系统的PC机一台;

2、XSBase270或XSBase255 ARM实验开发平台一套

【实验内容】

在Linux下,利用基于OV511芯片的摄像头进行图像采集,把采集到的图片以.JPEG,BMP两种格式进行存储,并把采集到的图像循环显示在LCD上。

1、编译内核,静态加载Video4Linux和USB摄像头驱动;

2、交叉编译移植JPEG库,如图6所示;

图6 JPEG库移植

3、开启帧缓冲设备,以实现在PC上的仿真;

4、编辑及编译源代码,生成目标板的可执行文件,如图7所示。

图7 编译源代码并生成可执行文件

5、启动minicom,把生成的test文件传送到目标板

(1)在超级终端输入指令:chmod +x test

(2)在超级终端输入指令:./test

(3)运行程序,按提示进行操作,即可以实现摄像头的图像采集及显示。显示效果如图8和图9所示。

图8 LCD显示1

图9 LCD显示2

【编程指南】

采用系统功能模块化设计。系统包括图像采集模块,图像存储模块以及图像显示模块。下面分别介绍三大模块的实现流程。

1、图像采集模块

1.1 图像采集的编程流程

(1)打开图像设备

(2)读取设备信息

(3)更改设备当前设置

(4)进行图像采集:内存映射

(5)对采集的图像进行处理

(6)关闭视频设备。

1.2 图像采集所定义的数据结构及使用函数

struct _v4l_struct

{

int fd;

struct video_capability capability;

struct video_buffer buffer;

struct video_window window;

struct video_channel channel[8];

struct video_picture picture;

struct video_mmap mmap;

struct video_mbuf mbuf;

unsigned char *map;

};

typedef struct _v4l_struct v4l_device;

extern int v4l_open(char *, v4l_device *);

extern int v4l_close(v4l_device *);

extern int v4l_get_capability(v4l_device *);

extern int v4l_set_norm(v4l_device *, int);

extern int v4l_get_picture(v4l_device *);

extern int v4l_grab_init(v4l_device *, int, int);

extern int v4l_grab_frame(v4l_device *, int);

extern int v4l_grab_sync(v4l_device *);

extern int v4l_mmap_init(v4l_device *);

extern int v4l_get_mbuf(v4l_device *);

extern int v4l_get_picture(v4l_device *);

extern int v4l_grab_picture(v4l_device *, unsigned int);

extern int v4l_set_buffer(v4l_device *);

extern int v4l_get_buffer(v4l_device *);

extern int v4l_switch_channel(v4l_device *, int);

1.3 Video4linux支持的数据结构及其用途

(1)video_capability 包含设备的基本信息(设备名称、支持的最大最小分辨率、信号源信息等)

name[32](设备名称)、maxwidth、maxheight、minwidth、minheight、Channels(信号源个数)、type (是否能capture),彩色还是黑白,是否能裁剪等,如VID_TYPE_CAPTURE 等。

(2)video_picture 设备采集的图象的各种属性

Brightness 0~65535

hue

colour

contrast

whiteness

depth 8 16 24 32

palette VIDEO_PALETTE_RGB24 | VIDEO_PALETTE_RGB565|VIDEO_PALETTE_JPEG| VIDEO_PALETTE_RGB32

(3)video_channel 关于各个信号源的属性

Channel 信号源的编号

name

tuners

Type VIDEO_TYPE_TV | IDEO_TYPE_CAMERA

Norm 制式PAL|NSTC|SECAM|AUTO

(4)video_window 包含关于capture area的信息

x(x windows中的坐标)、y(y windows中的坐标)、width(捕获图像的宽度)、height(捕获图像的高度)、chromakey(A host order RGB32 value for the chroma key)、flags(Additional capture flags)、clips A list of clipping rectangles. (只能设置)、clipcount The number of clipping rectangles. (只能设置)。

(5)video_mbuf 利用mmap进行映射的帧的信息

size 每帧大小、Frames 最多支持的帧数、Offsets 每帧相对基址的偏移。

(6)video_mmap 用于内存映射

1.4 关键步骤介绍

(1)打开视频:

int v4l_open(char *dev, v4l_device *vd)

{

if (!dev)

dev = ”/dev/video0”;

if ((vd ->fd = open(dev, O_RDWR)) < 0) {

perror("v4l_open:");

return -1;

}

if (v4l_get_capability(vd))

return -1;

if (v4l_get_picture(vd))

retu rn -1;

return 0;

}

(2)读video_capability 中信息

int v4l_get_capability(v4l_device *vd)

{

if (ioctl(vd ->fd, VIDIOCGCAP, &(vd->capability)) < 0) {

perror("v4l_get_capability:");

return -1;

}

return 0;

}

成功后可读取vd->capability各分量。

(3)读video_picture中信息

int v4l_get_picture(v4l_device *vd)

{

if (ioctl(vd ->fd, VIDIOCGPICT, &(vd->picture)) < 0) {

perror("v4l_get_picture:");

return -1;

}

return 0;

}

成功后可读取图像的属性。

(4)改变video_picture中分量的值(可以不做的)

先为分量赋新值,再调用VIDIOCSPICT

vd->picture.colour = 65535;

if(ioctl(vd->fd, VIDIOCSPICT, &(vd->picture)) < 0)

{

perror("VIDIOCSPICT");

return -1;

}

(5)初始化channel

必须先做得到vd->capability中的信息

int v4l_get_channels(v4l_device *vd)

{

int i;

for (i = 0; i < vd ->capability.channels; i++) {

vd ->channel[i].channel = i;

if (ioctl(vd ->fd, VIDIOCGCHAN, &(vd->channel[i])) < 0) {

perror("v4l_get_channel:");

return -1;

}

}

return 0;

}

(6)关闭设备

int v4l_close(v4l_device *vd)

{

close(vd ->fd);

return 0;

}

(6)用mmap(内存映射)方式截取视频

mmap( )系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、

B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。

1)设置picture的属性

2)初始化video_mbuf,以得到所映射的buffer的信息

ioctl(vd->fd, VIDIOCGMBUF, &(vd->mbuf))

3)可以修改video_mmap和帧状态的当前设置

4)将mmap与video_mbuf绑定

void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset )

其中:len:映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算起;

Prot:指定共享内存的访问权限PROT_READ(可读), PROT_WRITE(可写),PROT_EXEC (可执行);

Flags:MAP_SHARED MAP_PRIVATE中必选一个,MAP_ FIXED不推荐使用;

Addr:共内存享的起始地址,一般设0,表示由系统分配

Mmap( ) 返回值是系统实际分配的起始地址

int v4l_mmap_init(v4l_device *vd)

{

if (v4l_get_mbuf(vd) < 0)

return -1;

if ((vd ->map = mmap(0, vd->mbuf.size, PROT_READ|PROT_WRITE,

MAP_SHARED, vd->fd, 0)) < 0) {

perror("v4 l_mmap_init:mmap");

return -1;

}

return 0;

}

5)Mmap方式下真正做视频截取的VIDIOCMCAPTURE

ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)) ;

若调用成功,开始一帧的截取,是非阻塞的,是否截取完毕留给VIDIOCSYNC来判断。

6)调用VIDIOCSYNC等待一帧截取结束

if(ioctl(vd->fd, VIDIOCSYNC, &frame) < 0)

{

perror("v4l_sync:VIDIOCSYNC");

return -1;

}

若成功,表明一帧截取已完成。可以开始做下一次VIDIOCMCAPTURE。frame是当前截取的帧的序号。

2、图像存储模块

图像存储模块主要包括get_time()以及write_jpeg()函数。

2.1 get_time()函数

用于获取系统时间,并生成两个以当前时间为名字的文件名,例如21_54_19.bmp,21_54_19.jpeg,为保存图片做准备。

2.2 write_jpeg()函数

用于实现把保存在数据帧的图像资料,压缩为GPEG格式的图像。然后再利用djpeg指令

生成相应的BMP格式文件。

2.3 存储时将BGR流转换为RGB流

经过摄像头采集的图像的通道排列顺序为BGR,如果想保存为JPEG格式的文件,需要在压缩前将其顺序先按RGB排列,然后压缩再保存成JPEG格式的文件。具体的转换方法为:

image_buffer = tmp = (unsigned char *)map + m_buf.offsets[frame];

for(i =0;i

for(j=0;j

{

buf = *tmp;

*tmp = *(tmp+2);

*(tmp+2) = buf;

tmp += 3;

}

其中image_buf为采集的数据,在此只需要将指向R和B的指针互调一下就行,经过处理重新得到的image_buf为RGB排列。

2.4 程序中代码

write_jpeg(NAME,img,90,NTSC_WIDTH,NTSC_HEIGHT,0);

char mingling[300]="djpeg -bmp -outfile ";

sprintf(mingling,"djpeg -bmp -outfile %s %s",NAME1,NAME);

printf("%s\n",mingling);

system(mingling); //调用系统指令djpeg,需要移植djpeg到/bin目录(见JPEG的交叉编译与移植)

3 图像显示模块

3.1 图像显示编程流程

(1)打开/dev/fb设备文件。

(2)用ioctrl操作取得当前显示屏幕的参数,如屏幕分辨率,每个像素点的比特数。根据屏幕参数可计算屏幕缓冲区的大小。

(3)将屏幕缓冲区映射到用户空间。

(4)映射后就可以直接读写屏幕缓冲区,进行绘图和图片显示了。

3.2 程序段

struct fb_var_screeninfo vinfo; //记录帧设备和指定显示模式的不可修改的信息

struct fb_fix_screeninfo finfo; //记录帧缓冲设备和指定显示模式的可修改的信息

long int location=0; //初始化显示的位置

ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo); //获取帧设备和指定显示模式的不可修改的信息

ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo); //获取帧缓冲设备和指定显示模式的可修改的信息

screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8; //计算帧缓冲数据区大小

fbp=(char*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED, fbfd, 0); //内存映射

memset(fbp,0,screensize); //清屏

bmpshow(NAME1,fbp); //将图片送到显存,该函数的具体实现请看源程序

munmap(fbp,screensize);

close(fbfd);

3.3 消除显示过程中的失真

在利用djpeg指令将JPEG格式的图片转换为BMP格式的图像进行显示时,需要行调整才能实现图片的无失真显示。具体方法为(部分代码,具体见附录):

struct colors

{

char red;

char blue;

char green;

//char Reserved;

}co124;//将JPEG转换为BMP文件中的RGB读到此结构体中

blue=(unsigned int)((co124.blue>>3)&31);

green=(unsigned int)((co124.green>>2)&63);

red=(unsigned int)((co124.red>>3)&31);

*((unsigned long int*)(fbp+location))=blue|green<<5|red<<11;//location为每一个像素点的位置,fbp为指向BMP文件的指针,实现每一个像素点的RGB值的调整

【总结】

通过本次综合实验,我掌握了(1)内核的编译,实现了Video4Linux和USB摄像头驱动的静态加载;(2)库文件的交叉编译与移植,实现了JPEG的交叉编译与移植;(3)V4L 的编程思想,实现了视频图像的采集;(3)帧缓冲设备的使用,利用帧缓冲设备实现图像的显示;(4)将摄像头采集的BRG流转为RGB流,实现图像的正常显示以及JPEG格式图片的保存。在本次实验中也遇到了一些困难,(1)将JPEG格式转为BMP格式的图片中的困难,主要问题在于JPEG的移植过程中,有一些文件无法传到目标板上,原因在于存储空间不足,删除一些无用的文件之后就可以实现了;(2)将图像无失真的显示的困难,主要是因为经过摄像头采集的图像的通道排列顺序为BGR,如果你想保存为JPEG格式的文件,需要在压缩前将其顺序先按RGB排列,然后压缩再保存成JPEG格式的文件。再者在显示通过JPEG转换而来的BMP图像时,需要调整每一个像素点的RGB值,以使图像能够无失真的显示。当然本次实验还存在一些不足和需要改进的地方,比如没有必要存储BMP格式的图像,可以只是存储JPEG格式,待要显示时,在对JPEG格式的图像进行实时的转换和显示,以节省存储空间,当然这只需要在代码上稍加改动即可实现;再者就是没有实现使用QT编译的图像采集界面等,这些都是值得改进的地方。

【附录】

本实验主要源代码的源代码如下。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "v4l.h"

#include "v4lctoh.h"

#define norm VIDEO_MODE_NTSC

/*typedef struct _v4l_struct v4l_device;*/

v4l_device vd;

int count=0;

char NAME[100]="/home/"; //定义.jpeg图片的存放地址

char NAME1[100]="/Documents/"; //定义.bmp图片的存放地址

char base[100]="/home/"; //作为一个临时的变量

char NAME_TOTAL[10][100];

int temp=0;

struct fb_var_screeninfo vinfo; //用于记录帧缓冲设备和指定的显示模式的可修改的信息struct fb_fix_screeninfo finfo; //用于记录帧缓冲设备和指定的显示模式的不可修改的信息long int location=0; //显示定位

/*保存影像到frame里面*/

int device_grab_frame()

{

vd.frame_current =0;

if (v4l_grab_frame(&vd,0)<0)

return -1;

return 0;

}

int device_next_frame()

{

vd.frame_current ^=1;

if(v4l_grab_frame(&vd,vd.frame_current)<0)

return -1;

return 0;

}

/*返回frame的地址*/

unsigned char *device_get_address()

{

int i,j;

unsigned char *image_buffer="";

unsigned char *tmp="";

image_buffer = tmp = vd.map +vd.mbuf.offsets[vd.frame_current];

/*经过摄像头采集的图像通道排列为BGR,但是保存为jpeg格式时要将其顺序改变为RGB*/

for(i =0;i

for(j=0;j

{

int buf = *tmp;

*tmp = *(tmp+2);

*(tmp+2) = buf;

tmp += 3;

}

return (image_buffer);

// return (vd.map +vd.mbuf.offsets[vd.frame_current]);

}

/*初始化,打开设备,获取设备采集图片的各种属性,各个信号源的属性*/

int device_init(char *dev)

{ if (dev==NULL)

dev = "/dev/video0";

if (v4l_open(dev,&vd)!=0) // initial set 1

return -1;

if(v4l_get_picture(&vd)!=0) // initial set 2

return -1;

if(v4l_get_channels(&vd)!=0) // initial set 3

return -1;

printf("%s:initialization OK...%s\n"

"%d channels \n"

"%d audios \n",

dev,https://www.360docs.net/doc/4215064013.html,,vd.capability.channels,vd.capability.audios);

return 0;

}

/*获取系统时间,作为.bmp ,jpeg文件的文件名*/

int get_time()

{

struct tm *ptm;

char str[30];

time_t rawtime;

time (&rawtime);

ptm = localtime(&rawtime);

sprintf(str,"%d_%d_%d",ptm->tm_hour, ptm->tm_min, ptm->tm_sec);

char *shuxing=".jpeg";

char *shuxing1=".bmp";

sprintf(NAME,"%s%s%s",NAME,str,shuxing);//.jpeg的文件名

sprintf(NAME1,"%s%s%s",NAME1,str,shuxing1);//.bmp图片的文件名

}

/*将rgb流转化为.jpeg格式图片*/

int write_jpeg(char *filename,unsigned char *buf,int quality,int width, int height, int gray) {

struct jpeg_compress_struct cinfo;

struct jpeg_error_mgr jerr;

FILE *fp;

int i;

unsigned char *line;

int line_length;

fp = fopen(filename,"w");

cinfo.err = jpeg_std_error(&jerr);

jpeg_create_compress(&cinfo);

jpeg_stdio_dest(&cinfo, fp);

cinfo.image_width = width;

cinfo.image_height = height;

cinfo.input_components = gray ? 1: 3;

cinfo.in_color_space = gray ? JCS_GRAYSCALE: JCS_RGB;

jpeg_set_defaults(&cinfo);

jpeg_set_quality(&cinfo, quality, TRUE);

jpeg_start_compress(&cinfo, TRUE);

line_length = gray ? width : width * 3;

for (i = 0, line = buf; i < height; i++, line += line_length)

jpeg_write_scanlines(&cinfo, &line, 1);

jpeg_finish_compress(&(cinfo));

jpeg_destroy_compress(&(cinfo));

fclose(fp);

return 0;

}

/*摄像头采集图片,并将采集到的图片保存为.jpeg格式的图片,把图片显示在LCD上面*/ int v41_capture()

{

int total=0;

unsigned char *img="";

printf("please enter the number of picture you want to capture \n");

scanf("%d",&total);

temp=total;

while(count

{

printf("If you are ready to capture picture,please enter a num \n");

int num=0;

scanf("%d",&num);

if(device_grab_frame()!=0)

return -1;

else

printf("v4l_grab_frame :OK \n");

if(device_next_frame()!=0)

return -1;

else

printf("v4l_grab_frame_next frame ready...: OK \n");

if(v4l_grab_sync(&vd)!=0)

return -1;

else

printf("v4l_grab_sync : OK \n");

img= device_get_address();//返回所采集的数据的起始地址

get_time();//获得图片的名字

write_jpeg(NAME,img,90,NTSC_WIDTH,NTSC_HEIGHT,0);//保存采集到的图片

char mingling[300]="djpeg -bmp -outfile ";

sprintf(mingling,"djpeg -bmp -outfile %s %s",NAME1,NAME);

printf("%s\n",mingling);

system(mingling);//保存.bmp格式的图片,用于LCD显示

sprintf(NAME_TOTAL[count],"%s",NAME1);

int fbfd ;

long int screensize = 0;

char *fbp;

fbfd = open("/dev/fb0", O_RDWR); //打开帧缓冲设备

printf("fbfd=%d\n",fbfd);

if(fbfd<=0)

{

printf("can not open fb0\n");

return -1;

}

/*获取帧缓冲设备的信息*/

ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo);

ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo);

screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8; //计算帧缓冲数据区大小

fbp=(char*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED, fbfd, 0); //内存映射

memset(fbp,0,screensize);//清屏

bmpshow(NAME1,fbp);//将图像数据送到显存

munmap(fbp,screensize);

close(fbfd);

/*采集一幅图像后重新初始化基本变量*/

vd.frame_current=0;

strcpy(NAME,base);

strcpy(NAME1,base);

count=count+1;

printf("%d %d\n",count,total);

}

while(1)

{

int show;

for(show=0;show

{

bmpshow_total(NAME_TOTAL[show]);

sleep(2);

}

}

}

int bmpshow_total(char *filename2)

{

int fbfd_total ;

long int screensize_total = 0;

char *fbp_total;

fbfd_total = open("/dev/fb0", O_RDWR); //打开帧缓冲设备

printf("fbfd=%d\n",fbfd_total);

if(fbfd_total<=0)

{

printf("can not open fb0\n");

return -1;

}

/*获取帧缓冲设备的信息*/

ioctl(fbfd_total, FBIOGET_FSCREENINFO, &finfo);

ioctl(fbfd_total, FBIOGET_VSCREENINFO, &vinfo);

screensize_total = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8; //计算帧缓冲数据区大小

fbp_total=(char*)mmap(0,screensize_total,PROT_READ|PROT_WRITE,MAP_SHARED,

fbfd_total, 0); //内存映射

memset(fbp_total,0,screensize_total);//清屏

bmpshow(filename2,fbp_total);//将图像数据送到显存

munmap(fbp_total,screensize_total);

close(fbfd_total);

}

/*显示图像*/

int bmpshow(char *filename1,unsigned char *fbp)

{

FILE *fp1;

int width,height;

int blue,green,red;

int x=0,y=0;

struct colors

{

char red;

char blue;

char green;

//char Reserved;

}co124;

fp1=fopen(filename1,"rb");

printf("filename1=%s\n",filename1);

printf("fp1=%d\n",fp1);

fseek(fp1,18L,0);//定位到文件的第18字节处以确定图片的宽与高

fread(&width,sizeof(width),1,fp1);//读出4字节为图片宽

fread(&height,sizeof(height),1,fp1);//读出4字节为图片高

printf("width=%d,height=%d\n",width,height);

for(y=height+120-1;y>=120;y--)

{

for(x=160;x

{

//定位每个象素点

location=(x+vinfo.xoffset)*(vinfo.bits_per_pixel/8)+(y+vinfo.yoffset)*finfo.line_length;

//显示

if(fread(&co124,3,1,fp1)!=1)

{

printf("file read error\n");

break;

}

blue=(unsigned int)((co124.blue>>3)&31);

green=(unsigned int)((co124.green>>2)&63);

red=(unsigned int)((co124.red>>3)&31);

*((unsigned long int*)(fbp+location))=blue|green<<5|red<<11;

// printf("b=%d g=%d r=%d ",blue,green,red);

// *((unsigned long int*)(fbp+location))=((red>>3)<<11)|((green>>2)<<5)|(blue>>3);

// *((unsigned long int*)(fbp+location))=(blue>>3)|((green>>2)<<5)|((red>>3)<<11);

// *((unsigned long int*)(fbp+location))=blue<<3|green<<2|red<<3 ;

// *((unsigned long int*)(fbp+location))=blue ;

// *((unsigned long int*)(fbp+location+1))=green ;

// *((unsigned long int*)(fbp+location+2))=red ;

}

}

fclose(fp1);

return 0;

}

int main()

{

int frame=0;//初始化保存数据帧的位置

//设备初始化

if (device_init("/dev/video0")==-1)

{

perror("device_init:failed ....");

exit(1);

}

else

printf("device_init: OK \n");

//设定norm

if(v4l_set_norm(&vd, norm)!=0)

return -1;

else

printf("v4l_set_norm: OK \n");

//内存映射

if(v4l_mmap_init(&vd)!= 0)

return -1;

else

printf("v4l_mmap_init: OK \n");

//初始化要采集的图像的相关信息,例如宽,高等

if(v4l_grab_init(&vd,NTSC_WIDTH,NTSC_HEIGHT)!= 0)

return -1;

else

printf("v4l_grab_init: OK \n");

//等待采集结束

嵌入式操作系统实验报告

中南大学信息科学与工程学院实验报告 姓名:安磊 班级:计科0901 学号: 0909090310

指导老师:宋虹

目录 课程设计内容 ----------------------------------- 3 uC/OS操作系统简介 ------------------------------------ 3 uC/OS操作系统的组成 ------------------------------ 3 uC/OS操作系统功能作用 ---------------------------- 4 uC/OS文件系统的建立 ---------------------------- 6 文件系统设计的原则 ------------------------------6 文件系统的层次结构和功能模块 ---------------------6 文件系统的详细设计 -------------------------------- 8 文件系统核心代码 --------------------------------- 9 课程设计感想 ------------------------------------- 11 附录-------------------------------------------------- 12

课程设计内容 在uC/OS操作系统中增加一个简单的文件系统。 要求如下: (1)熟悉并分析uc/os操作系统 (2)设计并实现一个简单的文件系统 (3)可以是存放在内存的虚拟文件系统,也可以是存放在磁盘的实际文件系统 (4)编写测试代码,测试对文件的相关操作:建立,读写等 课程设计目的 操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。 本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。 I.uC/OS操作系统简介 μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。 μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。 严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全 可以由用户自己根据需要分别实现。 uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。 uC/OS操作系统的组成 μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。如下图:

嵌入式实验报告

课题:按键控制流水灯 专业:物联网工程 班级:01 学号:14154951 姓名:李政 指导教师:何建军 设计日期:2016.12.21—2016.12.30 成绩: 重庆大学城市科技学院电气学院

嵌入式设计报告 一、设计目的作用 通过编程实现对LED灯项目的改变,加深对stm32芯片的理解,对keil软件的熟悉掌握,工程的搭建以及头文件的使用。掌握外部设备的接入以及外部中断的实现。 二、设计要求 用四个按键控制8个流水灯的流水显示 (1).按键A按下时候流水灯按从左往右的流水显示。 (2).按键B按下时候流水灯按从右往左的流水显示。 (3).按键C按下时候流水灯按中心开花的方式流水显示:从中间向两边流水显示 (4).按键D按下时候流水灯按从两边到中心移动的方式流水显示。(5).(选做)引入时针中断: 默认的流水方式: (1)对时钟中断的次数进行计数 (2)当时钟中断的次数除以4的余数为0时:按从左到右的顺序流水显示(3)当时钟中断的次数除以4的余数为1时:按从右到左的顺序流水显示(4)当时钟中断的次数除以4的余数为2时:按中心开花的方式流水显示(5)当时钟中断的次数除以4的余数为3时:从两边到中心移动的方式流水显示。 系统启动时按默认的流水方式显示,当按下A、B、C、D四个按键时,按指定的方式流水显示,当按下按键E时恢复按默认的流水方式。 三、设计的具体实现 1、设计原理 这次使用的是stm32f103系列芯片,芯片引脚如下图

Stm32内部资源

GPIO原理及应用: 有7个16位并行I/O口:PA、PB、PC、PD、 PE、PF、PG 都是复用的,最少有2种 功能,最多有6种功能

嵌入式实验报告

嵌入式技术 实验报告 系别:计算机与科学技术系 班级:计12-1班 姓名:刘杰 学号:12101020128 总成绩: 评语: 日期:

2.在弹出的对话框中依次选择“cedevice emulator emulator kdstub”。 3.选择“Build OS”菜单的“sysgen”开始构建平台。 1.1.4连接,下载和运行平台 1.选择“Target”菜单下的“Connection option”菜单项。 2.在新的对话框中,配置连接关系 3.选择“Target”菜单下的“attach”菜单项,开始下载。 ?实验结果 操作系统定制成功,能正常运行。 ?结果截图 ?问题总结 由于对实验平台了解不够,致使操作过程中添加和删除组件时不知道该如何下手,影响整个实验进度。 实验1.2: 1.打开Platform Builder,并且打开实验1的工程,在实验1的工程基础上做本实验。

进程显示 IE信息查看

报文监测 实验1.3使用Platform Builder开发应用程序 简单实验步骤 1.打开Platform Builder。 2.选择“File”菜单下的“Open Workspace…”,然后打开实验1中创建的平台,本实验要基于 上面的实验的基础上做。 3.选择“File”菜单下的“New Project or File…”,打开“New Project or File”对话框。 4.在“Projects”选项页中选择“WCE Application”;在“Project Name”中输入项目的名字,例 如“MyApp”。 5.在“New Project Wizard – step 1 of 1”中选择“A typical Hello World Application”,点击“Finish” 按钮。 6.选择“Build”菜单中的“Build MyApp.exe”来编译应用程序。

嵌入式实验报告二

实习二建立交叉编译环境 实习内容: 本次实验主要包括二部分内容:开发环境配置,主要有配置NFS,Samba和超级终端;编写编译程序。 1、配置NFS(实现宿主机和目标机的信息共享) 打开Linux虚拟机,点击主菜单运行系统设置->服务器设置->NFS 服务器,点击增加,在出现的界面中的目录中填入需要共享的路径,在主机中填入允许进行连接的主机的IP地址(注意:这里主机IP指的是开发板的IP)。并选择允许客户对共享目录的操作为只读或读写(注意:实验中选的是读写,一定不能忽略),如下图: 对客户端存取服务器的一些其他设置,一般不需要设置,取默认值。然后退出,完成了NFS配置。 2、配置Samba(实现Windows和Linux系统的文件共享) ①关闭防火墙,这个地方和上面的NFS的配置是一样的。 ②配置Samba服务器 选择“系统设置”—>“服务器配置”—>“Samba服务”,进行Samba 服务器配置。首先创建Samba共享,选择“基本”选项卡,在“目录”

的文本框中输入要共享的文件,基本权限设为读/写。在“访问”选项卡中选择“允许所有用户访问”选项,通过“首选项”进行服务器配置。在“基本”选项卡中设置工作组和描述,在“安全性”选项卡中设置“验证模式”为共享,“加密口令”为否,“来宾账号”为无来宾账号。 ③设置Samba服务器IP地址(与前面的NFS的设置相同) ④启动Samba服务器 在命令行中输入service smb start,即可启动Samba服务器。 ⑤配置Windows下的IP地址 将Windows下的IP地址和Samba服务器IP地址设置在同一网段中即可(注意:这里设置IP时一定要注意在同一网段) ⑥在Windows下访问共享 在Windows中的“运行”窗口中输入Samba服务器的IP地址,就可以看见在虚拟机中共享的文件。 3、配置超级终端 ①在linux操作系统Xwindow界面下建立终端,在终端的命令行提示符后输入minicom,回车,然后就会看见minicom的启动画面,若没有启动Xwindow则在命令行提示符后直接输入minicom即可。 ② minicom启动后,先按Ctrl+A键,然后按Z键进入主配置界面,按“O”进入配置界面,按上下键选择Serial port setup,进入端口设置界面,然后按照指导书中的指示修改几个重要选项。 ③选好后按ESC键退出端口设计界面,选择Save setup as df1保存

嵌入式操作系统实验报告

中南大学信息科学与工程学院实验报告 :安磊 班级:计科0901 学号: 0909090310 指导老师:宋虹

目录 课程设计容 ----------------------------------- 3 uC/OS操作系统简介 ------------------------------------ 3 uC/OS操作系统的组成 ------------------------------ 3 uC/OS操作系统功能作用 ---------------------------- 4 uC/OS文件系统的建立 ---------------------------- 6 文件系统设计的原则 ------------------------------ 6 文件系统的层次结构和功能模块 --------------------- 6 文件系统的详细设计 -------------------------------- 8 文件系统核心代码 --------------------------------- 9 课程设计感想 ------------------------------------- 11 附录 -------------------------------------------------- 12

课程设计容 在uC/OS操作系统中增加一个简单的文件系统。 要求如下: (1)熟悉并分析uc/os操作系统 (2)设计并实现一个简单的文件系统 (3)可以是存放在存的虚拟文件系统,也可以是存放在磁盘的实际文件系统 (4)编写测试代码,测试对文件的相关操作:建立,读写等 课程设计目的 操作系统课程主要讲述的容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。 本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。 I.uC/OS操作系统简介 μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统核。它被广泛应用于微处理器、微控制器和数字信号处理器。 μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小核可编译至 2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。 严格地说uC/OS-II只是一个实时操作系统核,它仅仅包含了任务调度,任务管理,时间管理,存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。 uC/OS-II目标是实现一个基于优先级调度的抢占式的实时核,并在这个核之上提供最基本的系统服务,如信号量,,消息队列,存管理,中断管理等。 uC/OS操作系统的组成 μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。如下图:

嵌入式系统实验报告

实验报告 课程名称:嵌入式系统 学院:信息工程 专业:电子信息工程 班级: 学生姓名: 学号: 指导教师: 开课时间:学年第一学期

实验名称:IO接口(跑马灯) 实验时间:11.16 实验成绩: 一、实验目的 1.掌握 STM32F4 基本IO口的使用。 2.使用STM32F4 IO口的推挽输出功能,利用GPIO_Set函数来设置完成对 IO 口的配置。 3.控制STM32F4的IO口输出,实现控制ALIENTEK 探索者STM32F4开发板上的两个LED实现一个类似跑马灯的效果。 二、实验原理 本次实验的关键在于如何控制STM32F4的IO口输出。IO主要由:MODER、OTYPER、OSPEEDR、PUPDR、ODR、IDR、AFRH和AFRL等8个寄存器的控制,并且本次实验主要用到IO口的推挽输出功能,利用GPIO_Set函数来设置,即可完成对IO口的配置。所以可以通过了开发板上的两个LED灯来实现一个类似跑马灯的效果。 三、实验资源 实验器材: 探索者STM32F4开发板 硬件资源: 1.DS0(连接在PF9) 2.DS1(连接在PF10) 四、实验内容及步骤 1.硬件设计 2.软件设计 (1)新建TEST工程,在该工程文件夹下面新建一个 HARDWARE文件夹,用来存储以后与硬件相关的代码。然后在 HARDWARE 文件夹下新建一个LED文件夹,用来存放与LED相关的代码。 (2)打开USER文件夹下的test.uvproj工程,新建一个文件,然后保存在 LED 文件夹下面,保存为 led.c,在led.c中输入相应的代码。

(3)采用 GPIO_Set 函数实现IO配置。LED_Init 调用 GPIO_Set 函数完成对 PF9 和 PF10 ALIENTEK 探索者 STM32F407 开发板教程 119 STM32F4 开发指南(寄存器版) 的模式配置,控制 LED0 和 LED1 输出 1(LED 灭),使两个 LED 的初始化。 (4)新建一个led.h文件,保存在 LED 文件夹下,在led.h中输入相应的代码。 3.下载验证 使用 flymcu 下载(也可以通过JLINK等仿真器下载),如图 1.2所示: 图1.2 运行结果如图1.3所示:

嵌入式实验报告

嵌入式实验报告 学院:信息工程学院 专业:计算机科学与技术班级:计算机班 姓名: 学号: 指导老师:

实验目录 实验一嵌入式系统开发环境实验 (2) 实验二系统节拍定时器实验 (12) 实验三 GPIO控制实验 (16) 实验四外部中断实验 (19) 实验五串口通讯实验 (23)

实验一嵌入式系统开发环境实验 【实验目的】 1.熟悉RealView MDK集成开发环境以及使用方法。 2.熟悉嵌入式系统软件设计方法和流程。 【实验内容】 1. 通过例程熟悉、掌握嵌入式系统的编辑、编译、调试、下载及运行过程。 2. 建立自己的工程文件,在开发板板上调试程序。 【实验步骤】 (一)程序安装 1. 建议在安装之前关闭所有的应用程序,双击安装文件,弹出如图对话框,Next 2.默认选择C盘文件下安装。

3.这样就在c盘底下出现keil文件夹。 4.单击选择菜单“File”-->"License Management" 将弹出下面一张图的界面:复制其中CID号,以便在粘贴到下一步中的破解软件。 5.复制CID

6.运行破解软件,将出现下面一张图的界面,把上步复制的CID号粘贴到相应位置,其他选项如图,然后点击“Generate”按钮,然后复制产生的序列号,粘贴到上一步的下面一张图的LIC输入框中,然后点击右侧的Add LIC,即可完成破解。 7.安装文件夹中的jlink驱动。 (二)工程创建、编译 使用Realview MDK创建、完成一个新的工程只需要以下几个环节: →创建工程并选择处理器→选择工具集→创建源文件→配置硬件选项→配置对应启动代码→编译链接→下载→调试。 1.创建工程并选择处理器 选择Project→New Project…,输入创建的新工程的文件名,即可创建一个新的工程。 2.创建一个新工程时,需要为工程选择一款对应处理器,在NXP 列表下选择LPC1768 芯片。然后点击OK。接下来出现的对话框选择“是或者也可以通过单击Project→Select Device for Target…在本次课程中,我们选择

嵌入式实验报告心得

嵌入式实验报告心得 篇一:嵌入式系统原理实验总结报告 嵌入式系统原理实验总结报告 车辆座椅控制系统实验 XX/5/23 嵌入式系统原理实验总结报告 一、技术性总结报告 (一)题目:车辆座椅控制系统实验(二)项目概述: 1.为了实现车辆座椅控制的自动化与智能化。 2.方便用户通过智能手机与车载传感器之间的联动。 3.使车辆作为当今物联网中重要的一个节点发挥作用。 4.通过车辆座椅控制系统实验实现对嵌入式系统原理课程的熟练掌握与对嵌入式系统原理知识的深化记忆。 5. 加强本组学生对嵌入式系统原理的更深层次的理解与运用。 (三)技术方案及原理 本次试验分为软件、硬件两个部分。 1.软件部分。 A.智能手机部分,包括通过智能手机对座椅的控制部分、手机所携带的身份信息部分。 本部分软件使用Java编写,其程序部分为:主程序:package ;

import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ;import ; import ; import ; public class MainActivity extends ActionBarActivity { private Button Up = null; private Button Left = null; private Button Dowm = null; private Button Right = null; private Socket socket = null; private static final String HOST = "";private static final int PORT = 10007; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(; initControl();} private void initControl() {

南邮嵌入式系统B实验报告2016年度-2017年度-2

_* 南京邮电大学通信学院 实验报告 实验名称:基于ADS开发环境的程序设计 嵌入式Linux交叉开发环境的建立 嵌入式Linux环境下的程序设计 多线程程序设计 课程名称嵌入式系统B 班级学号 姓名 开课学期2016/2017学年第2学期

实验一基于ADS开发环境的程序设计 一、实验目的 1、学习ADS开发环境的使用; 2、学习和掌握ADS环境下的汇编语言及C语言程序设计; 3、学习和掌握汇编语言及C语言的混合编程方法。 二、实验内容 1、编写和调试汇编语言程序; 2、编写和调试C语言程序; 3、编写和调试汇编语言及C语言的混合程序; 三、实验过程与结果 1、寄存器R0和R1中有两个正整数,求这两个数的最大公约数,结果保存在R3中。 代码1:使用C内嵌汇编 #include int find_gcd(int x,int y) { int gcdnum; __asm { MOV r0, x MOV r1, y LOOP: CMP r0, r1 SUBLT r1, r1, r0 SUBGT r0, r0, r1 BNE LOOP MOV r3, r0 MOV gcdnum,r3 //stop // B stop // END } return gcdnum; } int main() { int a; a = find_gcd(18,9);

printf("gcdnum:%d\n",a); return 0; } 代码2:使用纯汇编语言 AREA example1,CODE,readonly ENTRY MOV r0, #4 MOV r1, #9 start CMP r0, r1 SUBLT r1, r1, r0 SUBGT r0, r0, r1 BNE start MOV r3, r0 stop B stop END 2、寄存器R0 、R1和R2中有三个正整数,求出其中最大的数,并将其保存在R3中。 代码1:使用纯汇编语言 AREA examp,CODE,READONL Y ENTRY MOV R0,#10 MOV R1,#30 MOV R2,#20 Start CMP R0,R1 BLE lbl_a CMP R0,R2 MOVGT R3,R0 MOVLE R3,R2 B lbl_b lbl_a CMP R1,R2 MOVGT R3,R1 MOVLE R3,R2 lbl_b B . END 代码2:使用C内嵌汇编语言 #include int find_maxnum(int a,int b,int c)

嵌入式实验报告

目录 实验一跑马灯实验 (1) 实验二按键输入实验 (3) 实验三串口实验 (5) 实验四外部中断实验 (8) 实验五独立看门狗实验 (11) 实验七定时器中断实验 (13) 实验十三ADC实验 (15) 实验十五DMA实验 (17) 实验十六I2C实验 (21) 实验十七SPI实验 (24) 实验二十一红外遥控实验 (27) 实验二十二DS18B20实验 (30)

实验一跑马灯实验 一.实验简介 我的第一个实验,跑马灯实验。 二.实验目的 掌握STM32开发环境,掌握从无到有的构建工程。 三.实验内容 熟悉MDK KEIL开发环境,构建基于固件库的工程,编写代码实现跑马灯工程。通过ISP 下载代码到实验板,查看运行结果。使用JLINK下载代码到目标板,查看运行结果,使用JLINK在线调试。 四.实验设备 硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。 软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。 五.实验步骤 1.熟悉MDK KEIL开发环境 2.熟悉串口编程软件ISP 3.查看固件库结构和文件 4.建立工程目录,复制库文件 5.建立和配置工程

6.编写代码 7.编译代码 8.使用ISP下载到实验板 9.测试运行结果 10.使用JLINK下载到实验板 11.单步调试 12.记录实验过程,撰写实验报告 六.实验结果及测试 源代码: 两个灯LED0与LED1实现交替闪烁的类跑马灯效果,每300ms闪烁一次。七.实验总结 通过本次次实验我了解了STM32开发板的基本使用,初次接触这个开发板和MDK KEILC 软件,对软件操作不太了解,通过这次实验了解并熟练地使用MDK KEIL软件,用这个软件来编程和完成一些功能的实现。作为STM32 的入门第一个例子,详细介绍了STM32 的IO口操作,同时巩固了前面的学习,并进一步介绍了MDK的软件仿真功能。

嵌入式系统看门狗实验报告

竭诚为您提供优质文档/双击可除嵌入式系统看门狗实验报告 篇一:《嵌入式系统原理与应用》实验报告04-看门狗实验 《嵌入式系统原理与接口技术》实验报告 实验序号:4实验项目名称:看门狗实验 1 2 3 4 篇二:嵌入式实验报告 目录 实验一跑马灯实验................................................. (1) 实验二按键输入实验................................................. .. (3)

实验三串口实验................................................. . (5) 实验四外部中断实验................................................. .. (8) 实验五独立看门狗实验................................................. (11) 实验七定时器中断实验................................................. (13) 实验十三ADc实验................................................. .. (15) 实验十五DmA实验................................................. .. (17) 实验十六I2c实验................................................. .. (21) 实验十七spI实

嵌入式实验报告二work2.

实验报告 课程名称嵌入式系统编程实践 实验仪器清华同方辰源嵌入式系统实验箱 实验名称实验二:利用中断实现OLED动态显示实验 系别__计算机学院_ 专业___ __ 班级/学号_ 学生姓名___ __ ___ _ _ 实验日期_ 2013年9月22日 成绩___________________ 指导教师_ _ 朱敏玲 ___

实验二:利用中断实现OLED动态显示实验 一、实验问题回答 (1)ISR是什么?简述一下中断的作用和使用方法 答:ISR是中断服务程序。作用是通过处理器执行事先编好的某个特定的程序。使用方法就是在main中写一个中断程序,然后在startup.s中进行注册。 (2)嵌入式系统中有哪些应用有定时性循环处理的要求?举几个例子答:在各种网络的应用中,设计的一些部件,如计数器,时钟等。 (3)定时时间间隔如何修改? 答:通过改变SysTickPeriodSet(SysCtlClockGet()/100)后面的100这个参数。(4)选作内容5-8的编程思路是什么?若做的话应该怎样实现? 答:编程思路:先画直线和竖线,组成一个正方形,将各个参数填写到函数RIT128x96x4ImageDraw(buf,,,,);第6个选作:判断画的原点x,原点y,和画原点x+的长,画原点y+画宽的值要在0-128和0-96。第7个选作:把RIT128x96x4StringDraw("hello",,,);就是把画的灰度定义为一个变量x。最后就会出现由不同的亮度而形成的波浪。第8个就是利用随机函数产生画的原点,随机的在屏幕上进行显示。 (5)拖影现象如何解决?计数值显示为什么没有拖影? 答:在程序结束后执行清屏语句:计数显示是每次重新赋值,所以不会出现拖影。 二、实验目的和效果(效果即是否达到实验目的,达到的程度如何) (1)深入学习、理解、掌握OLED字符显示方法 (2)深入学习、理解、掌握OLED图形显示方法 (3)学习、理解、掌握中断使用方法 实验效果图: 三、实验内容和步骤(重点阐述自己的思路及遇到的问题)

嵌入式系统实验实验报告

嵌入式系统实验实验报告 一、实验目的 1.基本实验

. Word 资料搭建PXA270嵌入式LINUX开发软硬件环境;安装LINUX操 作系统;安装与配置建立宿主机端交叉编译调试开发环境;配置宿主机 PC 机端的minicom(或超级终端)、TFTP服务、NFS服务,使宿主PC机与PXA270开发板可以通过串口通讯,并开通TFTP 和NFS服务。 2.人机接口 键盘驱动;LCD控制;触摸屏数据采集与控制实验; 3.应用实验 完成VGA显示;Web服务器实验;网络文件传输实验;多线程应用实验。 4.扩展应用实验 完成USB摄像头驱动与视频采集;GPS实验;GSM/GPRS通讯;视频播放移植;USB蓝牙设备无线通讯;NFS文件服务器;蓝牙视频文件服务器。 5.QT实验 完成基本嵌入式图形开发环境搭建;“Hello world!”QT初探;创建一个窗口并添加按钮;对象通信:Signal和Slot;菜单和快捷键;工具条和状态栏;鼠标和键盘事件;对话框;QT的绘图;俄罗斯方块;基于QT的GSM手机在嵌入式LINUX下的设计与实现。 二、实验内容 1.人机接口实验 实验十九键盘驱动实验 ?实验目的:矩阵键盘驱动的编写

?实验内容:矩阵键盘驱动的编写 ?作业要求:完成键盘加减乘除运算 ?实验作业源码及注释: #INCLUDE #INCLUDE #INCLUDE #INCLUDE #INCLUDE #INCLUDE #DEFINE DEVICE_NAME “/DEV/KEYBOARD” INT MAIN(VOID){ INT FD; INT RET; UNSIGNED CHAR BUF[1]; INT I,F,J; DOUBLE X; INT A[2]={0}; CHAR PRE_SCANCODE=0XFF; FD=OPEN(DEVICE_NAME,O_RDWR); IF(FD==-1)PRINTF(“OPEN DEVICE %S ERROR\N”,DEVICE_NAME); ELSE{ BUF[0]=0XFF; I=0;F=0; WHILE(1){ READ(FD,BUF,1);

嵌入式综合实验报告

《嵌入式系统综合实验》报告 学号: 姓名: Shanghai University of Engineering Science School of Electronic and Electrical Engineering

基于STM32的GPS信息显示系统 ——嵌入式系统综合实验报告 班级:0211112 姓名:褚建勤学号:021111228 班级:0211112 姓名:于心忆学号:021111216 班级:0211112 姓名:乐浩奎学号:021111232 一、产品设计要求(产品规格描述) 1 、嵌入式产品名称 GPS信息显示系统 2 、嵌入式产品目的 在学校的生活中,你经常可能需要联系不是同一间宿舍的同学,但是你不能确定他现在在什么地方,这时候全球定位系统(GPS)就可以发挥作用了,但是传统的GPS系统只能提供经纬度信息,不能直观的显示你想要找到人在何处,我们的系统就在传统的GPS的基础上添加了对应位置显示的功能,方便你更方便更快捷的找到你想找的同学 3 、嵌入式产品功能 使用GPS输入用户位置信息 GPS将相关经纬度信息反馈给主处理器 主处理器处理相关位置信息并将信息转换为对应位置在LCD上显示出来 在LCD上输出用户状态信息 4 、嵌入式产品的输入和输出 输入设备:GPS系统 输出设备:LCD 二、产品方案设计(产品设计方案) 1 2 1 )处理器选择 本系统选用基于ARMCortex-M3内核的STM32F103RB嵌入式微控制器作为处理器。 ①选用原因 A 技术因素 工作频率: 最高72MHz。 内部和外部存储器: 128K字节的闪存程序存储器,用于存放程序及数据;多达20K字节的内置SRAM,CPU能以0等待周期访问(读/写)。

西安邮电大学嵌入式实验报告

西安邮电大学 (计算机学院) 课内实验报告 实验名称:嵌入式系统原理与应用 专业名称:软件工程 班级:1101班 学生姓名: 学号(8位): 指导教师:李宥谋 实验日期:2013年12月25日

实验一流水灯实验 一.实验目的及实验环境 1.实验目的 ●熟悉LPC2000系列ARM7微控制器的GPIO输出控制。 2.实验环境 ●硬件:PC机一台 LPC2131教学实验开发平台一套 ●软件:Windows 98/XP/2000系统,ADS1.2集成开发环境。 二.实验内容 使用GPIO口控制8个LED流水灯显示。 三.方案设计 ①启动ADS1.2IDE集成开发环境,选择ARM Executable Image for lpc2131 工程模板建立一个工程LedDisp_C。 ②在user组里编写主程序代码main.c。 ③选用DebugInRam生成目标,然后编译链接工程。 ④将EasyARM教学实验开发平台上的P1.[18:25]管脚对应与LED[1:8]跳线 短接。 ⑤选择Project->Debug,启动AXD进行JTAG仿真调试。 ⑥全速运行程序,程序将会在main.c的主函数中停止。

⑦单击Context Variable图标按钮(或者选择Processor Views->Variables)打开变量观察窗口,通过此窗口可以观察局部变量 和全局变量。选择System Views->Debugger Internals 即可打开 LPC2000系列ARM7微控制器的片内外寄存器窗口。 ⑧可以单步运行程序,可以设置/取消断点;或者全速运行程序,停止程 序运行,观察变量的值,判断LED1~LED8控制是否正确。 四.测试数据及运行结果

嵌入式系统实验报告

郑州航空工业管理学院 嵌入式系统实验报告 (修订版) 20 – 20第学期 赵成,张克新 院系: 姓名: 专业: 学号: 电子通信工程系 2014年3月制

实验一ARM体系结构与编程方法 一、实验目的 了解ARM9 S3C2410A嵌入式微处理器芯片的体系结构,熟悉ARM微处理器的工作模式、指令状态、寄存器组及异常中断的概念,掌握ARM指令系统,能在ADS1.2 IDE中进行ARM汇编语言程序设计。 二、实验内容 1.ADS1.2 IDE的安装、环境配置及工程项目的建立; 2.ARM汇编语言程序设计(参考附录A): (1)两个寄存器值相加; (2)LDR、STR指令操作; (3)使用多寄存器传送指令进行数据复制; (4)使用查表法实现程序跳转; (5)使用BX指令切换处理器状态; (6)微处理器工作模式切换; 三、预备知识 了解ARM嵌入式微处理器芯片的体系结构及指令体系;熟悉汇编语言及可编程微处理器的程序设计方法。 四、实验设备 1. 硬件环境配置 计算机:Intel(R) Pentium(R) 及以上; 内存:1GB及以上; 实验设备:UP-NETARM2410-S嵌入式开发平台,J-Link V8仿真器; 2. 软件环境配置 操作系统:Microsoft Windows XP Professional Service Pack 2; 集成开发环境:ARM Developer Suite (ADS) 1.2。 五、实验分析 1.安装的ADS1.2 IDE中包括和两个软件组件。在ADS1.2中建立类型的工程,工程目标配置为;接着,还需要对工程进行、及链接器设置;最后,配置仿真环境为仿真方式。 2.写出ARM汇编语言的最简程序结构,然后在代码段中实现两个寄存器值的加法运算,给出运算部分相应指令的注释。 ; 文件名:

嵌入式系统实验报告

嵌入式系统实验报告文件排版存档编号:[UYTR-OUPT28-KBNTL98-UYNN208]

大连理工大学 本科实验报告 课程名称:嵌入式系统实验 学院(系):电子信息与电气工程学部 专业:自动化 班级: 0804 学号: 学生姓名:何韬 2011年 11月 18日 大连理工大学实验报告 学院(系):电信专业:自动化班级: 0804 姓名:何韬学号:组: ___ 实验时间: 2011-11-12 实验室: d108 实验台: 指导教师签字:成绩: 实验二ARM的串行口实验 一、实验目的和要求 见预习报告 二、实验原理和内容 见预习报告 三、主要仪器设备

硬件:ARM嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC机Pentium100 以上、串口线。 软件:PC 机操作系统win98、Win2000 或WinXP 、ARM SDT 或集成开发环境、仿真器驱动程序、超级终端通讯程序。 四、实验步骤 见预习报告 五、核心代码 在主函数中实现将从串口0接收到的数据发送到串口0() int main(void) { char c1[1]; char err; ARMTargetInit(); 通过调用OSTaskCreate()或OSTaskCreateExt()创建至少一个任务; . OSStart(); /ucos-ii/" /* uC/OS interface */ #include "../ucos-ii/add/" #include "../inc/" #include "../inc/sys/" #include "../src/gui/" #include <> #include <>

嵌入式基础实验报告

嵌入式基础实验报告 ——Linux下编译环境的设置 姓名:张耀丹 学号:131012692 班级:13级网络工程二班

一、实验目的 1、熟悉嵌入式Linux 开发环境,学会基于UP-CUP IOT-4412-II 型网关部分平台的Linux 开 发环境的配置和使用 2、利用arm-none-linux-gnueabi-gcc 交叉编译器编译程序,使用基于NFS 的挂载方式进行 实验,了解嵌入式开发的基本过程 二、实验环境 1、硬件:UP-CUP IOT-4412-II 型网关部分嵌入式实验平台,PC 机Pentium 500 以上, 硬盘 40G 以上,内存大于256M 2、软件:Vmware Workstation + Fedora Core 14 + 超级终端/Xshell + ARM-LINUX 交叉编译开 发环境 三、实验内容 1、本次实验使用Fedora14 操作系统环境,安装ARM-Linux 的开发库及编译器。创建一个新 目录,并在其中编写hello.c 和Makefile 文件。 2、学习在Linux 下的编程和编译过程,以及ARM 开发板的使用和开发环境的设置。将已 经编译好的文件通过NFS 方式挂载到目标开发板上运行 四、实验步骤 实验目录:/UP-CUP4412/SRC/exp/basic/Cortex/ 1、编译源程序 (1)在宿主机端任意目录下建立工作目录CortexA9,实际光盘目录中已经给出本次实验所需全面文件及代码,存放在Cortex目录下。 [root@localhost ~]# mkdir CortexA9 [root@localhost ~]# cd CortexA9 (2)编写程序源代码 在Linux 下的文本编辑器有许多,常用的是vim 和Xwindow 界面下的gedit 等,我们在开发过程中推荐使用vim,用户需要学习vim 的操作方法,请参考相关书籍中的关于vim 的操作指南。Kdevelope、anjuta 软件的界面与vc6.0 类似,使用它们对于熟悉windows 环境下开发的用户更容易上手。 实际的CortexA9.c 源代码较简单,如下: #include main() { printf(“**********\n” ); printf(“CortexA9 \n”); printf(“**********\n” ); return 0; }

嵌入式实验报告心得

竭诚为您提供优质文档/双击可除 嵌入式实验报告心得 篇一:嵌入式系统各实验实验报告 嵌入式系统设计实验报告 班级:学号:姓名:成绩:指导教师: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 1.实验一 1.1实验名称 博创up-net3000实验台基本结构及使用方法 1.2实验目的 熟悉up-net3000实验平台的核心硬件电路和外设 通过操作系统自带的通讯软件超级终端,检验各个外设的工作状态 1.3实验环境 硬件:ARm嵌入式开发平台、用于ARm7TDmI的JTAg仿真器、pc机 pentium100以上。 软件:pc机操作系统windows、ADs1.2集成开发环境、

仿真器驱动程序、 超级终端通讯程序。 1.4实验内容及要求 一、内容 ①嵌入式系统开发流程概述 ②熟悉up-net3000实验平台的核心硬件电路和外设 ③ARmJTAg的安装与使用 ④通过操作系统自带的通讯软件超级终端,检验各个外设的工作状态 二、要求 通过本次课程对各个外设的了解,为今后各个接口实验打下基础。 1.5实验设计与实验步骤 一、JTAg的驱动程序的安装: 执行armJtag目录下armJtagsetup.exe程序,选择安装目录,安装JTAg软件。 二、通过通讯软件超级终端来检验外设的工作状态: ①运行windows系统下的超级终端(hyperTerminal)应用程序,新建一个通信终端。为所建超级终端取名为arm,可以为其选择第一个图标。单击“确定”按钮。 ②在接下来的对话框中选择ARm开发平台实际连接的pc 机串口(如com1),按确定按钮后出现属性对话框,设置通

嵌入式实验报告

《嵌入式系统导论》实验报告学院: 学号: 姓名: 上海工程技术大学 电子电气工程学院

实验一 GPIO(按键和LED)实验 一、实验要求 1 、掌握基于STM32F103微控制器的嵌入式系统、仿真器和开发用PC机之间的连接方法,能够搭建基于STM32F103微控制器的嵌入式系统交叉开发环境。 2 、熟悉常用的嵌入式开发工具KEIL MDK或IAR EWARM的操作环境和基本功能(包括编辑、编译、链接、调试和下载等),学会创建、配置和管理STM32工程,掌握嵌入式程序的基本调试方法,学会使用逻辑分析仪窗口和外设窗口等信息窗口调试嵌入式程序。 3 、理解LED和按键的构件原理,学会设计它们与微控制器间的接口电路 4 、掌握STM32F103微控制器GPIO的工作原理,熟悉STM32的GPIO库函数 5 、学会使用STM32的GPIO库函数在KEIL MDK或IAR EWARM下开发基于LED和按键的简单嵌入式应用程序 二、实验环境 1 、硬件: ALIENTEK STM32F103嵌入式开发板 2 、软件: KEIL MDK或IAR EWARM 三、实验内容 1 、流水灯实验一: 在KEIL MDK或IAR EWARM 中建立STM32工程,并使用GPIO库函数和延时循环设计基于无限循环架构的嵌入式应用程序,使开发板上的红色LED以一定周期闪烁。 采用软件仿真的方式调试程序,通过“Logic Analyzer”,观察程序模拟运行时连接红色LED的引脚PA8上的输出波形。 采用硬件下载的方式调试程序,观察程序下载硬件运行时红色LED的闪烁情况。 2 、按键控制LED实验:

相关文档
最新文档