第一篇:嵌入式Linux网络通信实验
淮阴工学院
Linux操作系统及嵌入式应用
实验报告
系(院): 计算机工程学院 专
业:计算机科学与技术(物联网工程)班
级: 物联网1111
姓
名: 蒋振 学
号:1111307116 指导教师:
孙成富
学年学期:
2014 ~ 2015 学年 第 学期
实验1 Socket全双工通信实验 实验目的
1)了解网络套接字编程
2)掌握网络通信服务器和客户端的工作过程 3)利用多线程实现全双工通信 4)下载并运行网络应用程序
2实验环境
1)宿主机:Fedora 10 2)嵌入式Linux软硬件系统:TQ2440(基于S3C2440A)开发板
3实验准备
3.1Linux下的多线程编程
进程是程序执行时的一个实例,即它是程序已经执行到何种程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。
线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的线程共享进程所拥有的全部资源。
本实验使用多线程解决了并行通信的难题。关于多线程的函数主要是使用pthread.h头文件中定义的多线程操作函数,如pthread_create、pthread_cancel等。
3.2TCP/IP概述
3.2.1TCP/IP的分层模型
OSI协议参考模型,是基于国际标准化组织(ISO)的建议发展起来的,它分为7个层次:应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。这个7层的协议模型虽然规定得非常细致和完善,但在实际中却得不到广泛 的应用,其重要的原因之一就在于它过于复杂。但它仍是此后很多协议模型的基础。与此相区别的TCP/IP协议模型将OSI的7层协议模型简化为4层,从而更有利于实现和使用。
TCP/IP的协议参考模型和OSI协议参考模型的对应关系如下图 1所示:
SYN J SYN K,ACK J+1 ACK K+1 图1 TCP/IP协议与OSI协议参考模型对比图
3.2.2TCP的三次握手
TCP是面向连接的,所谓面向连接,就是当计算机双方通信时必需先建立连接,然后进行数据通信,最后拆除连接三个过程。TCP在建立连接时又分三步走:
第一步(A->B):主机A向主机B发送一个包含SYN即同步(Synchronize)标志的TCP报文,SYN同步报文会指明客户端使用的端口以及TCP连接的初始序号;
第二步(B->A):主机B在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示主机B的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgment)。
第三步(A->B):主机A也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。
3.3套接字(socket)概述
3.3.1套接字类型
1)流式套接字(SOCK_STREAM)
流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,从而保证了数据传输的可靠性和顺序性。2)数据报套接字(SOCK_DGRAM)
数据报套接字定义了一种无可靠、面向无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。它使用数据报协议UDP
3)原始套接字(SOCK_RAW)
原始套接字允许对底层协议如IP或ICMP进行直接访问,它功能强大但使用较为不便,主要用于一些协议的开发。3.3.2
套接字编程
使用TCP时Socket编程流程图如图2所示。
服务器端 socket bind bind listen accept recv/recvfrom send/sendto close connect send/sendto recv/recvfrom close客户端 socket
图2 TCP时Socket编程流程图
使用UDP时Socket编程如图3所示。
socket listen accept recvfrom sendto或 socket connect send recv close或 recv send closesendto recvfrom或或 图3 TCP时Socket编程流程图
实验过程
4.1
简单的Socket通信程序设计
在Fedora 10操作系统的/home目录下创建NetCommunicator目录,并新建client.c和server.c源文件,NetCommunicator目录如图4所示。
图4 NetCommunicator截图
分别编写Socket通信的客户端和服务器端源代码。编写完毕,使用gcc编译上述client.c和server.c源文件生成client和server可执行程序(x86平台),编译过程如图5所示。使用arm-linux-gcc编译上述client.c和server.c源文件生成a_client和a_server可执行程序(ARM平台)。编译过程如图6所示.图5 编译x86 Socket通信程序过程截图
图6 编译ARM平台的可执行程序
PC机测试,测试结果如下图所示:
图7 执行服务器端程序
图8 执行客户端程序
图9 服务器端接收到客户端发来的消息截图
使用gcc-linux-gcc生成ARM平台下的可执行程序a_client和a_server,编译结果如图10所示。
图10 编译ARM平台可执行程序
4.2
全双工Socket通信程序设计
为了实现全双工通信,服务端进程和客户端进程均使用了两个线程,一个负责收,另一个负责发。
在NetCommunicator目录,并新建clientV2.c和serverV2.c源文件,如图11所示,编写完毕,编译通过生成clientV2和serverV2可执行程序。
图11 NetCommunicator工作目录
PC机测试,测试结果如下图所示:
图12 客户端进程
图13 服务器端进程
实验总结
通过本次实验,了解了Linux环境下的Socket程序设计流程,对网络编程有了一定的了解,提高了动手实践的能力。
第二篇:嵌入式linu学习心得
嵌入式Linux学习心得
1、Linux命令
ls:查看目录-l以列表方式查看;ls –l 与ll的功能一样 pwd: 查看当前的目录
cd:改变当前操作目录cd /直接跳到根目录 cd..回到上一级目录 cat: 打印显示当前文件的内容信息
mkdir:创建目录
fdisk: 查看硬盘分区信息,-l以列表方式查看
->代表是链接文件,类似window下的快捷方式。
cp: 复制命令,例子cp 文件名 /home/dir/
mv: 移动或改名,如mv sonf.confsonf.txt(改名)移动:mv sonf.conf / rm:删除命令,如rm –f test.c;如删除目录rm –fr d
man:查看某个命令的帮助,man 命令
2、各系统目录的功能
drw—r—w--:d代表是目录,drw代表当前用户的权限,r代表组用户的权限,w代表其它用户的权限。x代表有执行权限。
/boot/gruff.conf: 启动引导程序
/dev:brw—rw--:b代表是块设备。Linux设备有三种,块设备(b开头)、字符设备(c开头)、网络设备。had代表第一个硬盘,hdb代表第二个硬盘。Hdb2代表第二块硬盘的第二个分区。3,67代表主设备为3,从设备为67./etc:存放的是系统的配置文件。Inittab文件存放不同启动方式下必须启动的进程。Inittab文件中有6个启动level,wait中对应着6个level的目录,respawn代表当一个进程被意外终止了,但会自动启动的进程,如守护进程。rc.d目录中存放了一个rc.sysinit文件,里面存放系统初始化配置信息。/etc还有一个vsftpd里面存放tcp、ftp的配置。
/home : 用户目录,存放用户的文件,/lib:存放库文件,后缀为so的文件代表动态链接库。
/lost+found:系统意外终止,存放一些可以找回的文件。
/mnt:挂载外部设备,如挂载光驱:mount –t /dev/cdrom/mnt/cdrom,如
果在双系统中,要查看windows中D盘的文件,首先应该将D盘的文件映射过来,mount –t /dev/hda2/mnt/windows/d
/opt:用户安装的应用程序
/proc:是系统运行的映射,比较重要。里面的文件数字代表进程号。每个进程号目录下包含进程的基本信息。还有其他信息,如cpuinfo等,内核支持的文件系统filesystem等。系统支持的中断interrupts,iomen代表内存分配情况。ioport存放IO端口号。还有分区信息,modole信息,状态信息,版本信息
对于Linux的设备驱动程序,有两种加载模式,一种是直接加载进linux内核,一种是以模块的方式加载到内核。
/sbin: 系统管理的一些工具。如poweroff关机工具。
/usr: 安装系统时很多文件放在此目录下面,包含一些更新等,include包含的头文件,lib 是Linux的库文件,src包含Linux2.4的内核源码
/var:存放是临时变量
3、
第三篇:嵌入式实验2
南昌航空大学实验报告
二0一一 年 10月 16日
课程名称: 嵌入式系统 实验名称: 串行端口程序设计 班 级: 080611 学生姓名: 曹启斌 学号: 08061107 指导教师评定: 签名:
一、实验目的 了解在linux环境下串行程序设计的基本方法。掌握终端的主要属性及设置方法,熟悉终端IO函数的使用。3 学习使用多线程来完成串口的收发处理。
二、实验内容
读懂程序源代码,学习终端IO函数tcgetattr(), tcsetattr(),tcflush()的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。
三、预备知识
1、有C语言基础。
2、掌握在LINUX下常用编辑器的使用。
3、掌握Makefile 的编写和使用。
4、掌握Linux下的程序编译与交叉编译过程
四、实验设备及工具
硬件:UP-NETARM2410-S嵌入式实验仪,PC机pentumn500以上, 硬盘40G以上,内存大于128M。
软件:PC机操作系统REDHAT LINUX 9.0 +MINICOM + AMRLINUX开发环境
五、实验原理
Linux 操作系统从一开始就对串行口提供了很好的支持,为进行串行通讯提供了大量的函数,我们的实验主要是为掌握在LINUX中进行串行通讯编程的基本方法。
1.程序流程图
程序流程图如图2-3所示:
图2-3 程序流程图
2串口操作需要的头文件
#include /*线程库定义*/ 3打开串口 在 Linux 下串口文件是位于 /dev 下,串口一为/dev/ttyS0,串口二为 /dev/ttyS1,打开串口是通过使用标准的文件打开函数操作: int fd;/*以读写方式打开串口*/ fd = open(“/dev/ttyS0”, O_RDWR);if(-1 == fd){ perror(“ 提示错误!”);} 4设置串口 最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置 struct termios 结构体的各成员值。 struct termio { unsigned short c_iflag;/* 输入模式标志 */ unsigned short c_oflag;/* 输出模式标志 */ unsigned short c_cflag;/* 控制模式标志 */ unsigned short c_lflag;/* local mode flags */ unsigned char c_line;/* line discipline */ unsigned char c_cc[NCC];/* control characters */ };设置这个结构体很复杂,可以参考man手册或者由赵克佳、沈志宇编写的《UNIX程序编写教程》,我这里就只考虑常见的一些设置: 波特率设置: 下面是修改波特率的代码: struct termios Opt;tcgetattr(fd, &Opt);cfsetispeed(&Opt,B19200);/*设置为19200Bps*/ cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);校验位和停止位的设置: 无效验 8位 Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS8;奇效验(Odd)7位 Option.c_cflag |= ~PARENB;Option.c_cflag &= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;偶效验(Even)7位 Option.c_cflag &= ~PARENB;Option.c_cflag |= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;Space效验 7位 Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= &~CSIZE;Option.c_cflag |= CS8;设置停止位: 1位: options.c_cflag &= ~CSTOPB;2位: options.c_cflag |= CSTOPB;需要注意的是,如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(Raw Mode)方式来通讯,设置方式如下: options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);/*Input*/ options.c_oflag &= ~OPOST;/*Output*/ 5读写串口 设置好串口之后,读写串口就很容易了,把串口当作文件读写就可以了。发送数据: char buffer[1024];int Length=1024;int nByte;nByte = write(fd, buffer ,Length)读取串口数据: 使用文件操作read函数读取,如果设置为原始模式(Raw Mode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。 可以使用操作文件的函数来实现异步读取,如fcntl,或者select等来操作。char buff[1024];int Len=1024;int readByte = read(fd, buff, Len);6关闭串口 关闭串口就是关闭文件。close(fd);7空MODEM通讯连接电缆 一般进行串口调试使用空MODEM连接电缆,其接线方式如下图2-4所示: 图2-4 实用RS-232C通讯连线 六、实验步骤 1.2.3.4.进入expbasic 3_tty目录,使用vi编辑器或其他编辑器阅读理解源代码。运行make产生term可执行文件 切换到minicom终端窗口,使用NFS mount开发主机的/arm2410到/host目录。 进入expbasic 3_tty目录,运行term,观察运行结果的正确性。由于内核已经将串口1 作为终端控制台,所以可以看到term发出的数据,却无法看到开发主机发来的数据,可以使用另外一台主机连接串口2进行收发测试。5.修改一些参数,再次运行调试,加深对串口编程的理解。6.参考源代码: #include #define BAUDRATE B115200 #define COM1 “/dev/ttyS0” #define COM2 “/dev/ttyS1” #define ENDMINITERM 27 /* ESC to quit miniterm */ #define FALSE 0 #define TRUE 1 volatile int STOP=FALSE;volatile int fd;void child_handler(int s){ printf(“stop!!n”);STOP=TRUE;} /*-------------------------*/ void* keyboard(void * data){ int c;for(;;){ c=getchar();if(c== ENDMINITERM){ STOP=TRUE;break;} } return NULL;} /*-------------------------*/ /* modem input handler */ void* receive(void * data){ int c;printf(“read modemn”);while(STOP==FALSE){ read(fd,&c,1);/* com port */ write(1,&c,1);/* stdout */ } printf(“exit from reading modemn”);return NULL;} /*-------------------------*/ void* send(void * data){ int c='0';printf(“send datan”);while(STOP==FALSE)/* modem input handler */ { c++;c %= 255;write(fd,&c,1);/* stdout */ usleep(100000);} return NULL;/* wait for child to die or it will become a zombie */ } /*-------------------------*/ int main(int argc,char** argv){ struct termios oldtio,newtio,oldstdtio,newstdtio;struct sigaction sa;int ok;pthread_t th_a, th_b, th_c;void * retval; if(argc > 1)fd = open(COM2, O_RDWR);else fd = open(COM1, O_RDWR);//| O_NOCTTY |O_NONBLOCK); if(fd <0){ error(COM1);exit(-1);} tcgetattr(0,&oldstdtio);tcgetattr(fd,&oldtio);/* save current modem settings */ tcgetattr(fd,&newstdtio);/* get working stdtio */ newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;/*ctrol flag*/ newtio.c_iflag = IGNPAR;/*input flag*/ newtio.c_oflag = 0;/*output flag*/ newtio.c_lflag = 0;newtio.c_cc[VMIN]=1;newtio.c_cc[VTIME]=0;/* now clean the modem line and activate the settings for modem */ tcflush(fd, TCIFLUSH);tcsetattr(fd,TCSANOW,&newtio);/*set attrib*/ sa.sa_handler = child_handler;sa.sa_flags = 0;sigaction(SIGCHLD,&sa,NULL);/* handle dying child */ pthread_create(&th_a, NULL, keyboard, 0);pthread_create(&th_b, NULL, receive, 0);pthread_create(&th_c, NULL, send, 0);pthread_join(th_a, &retval);pthread_join(th_b, &retval);pthread_join(th_c, &retval); tcsetattr(fd,TCSANOW,&oldtio);/* restore old modem setings */ tcsetattr(0,TCSANOW,&oldstdtio);/* restore old tty setings */ close(fd);exit(0);} 七、心得体会 通过本次实验,我了解在linux环境下串行程序设计的基本方法,对它的操作有了更深入的认识。我了解到了实践的重要性。概念固然重要,但是只有用软件真正地实践过,才能发现问题,分析问题,最终解决问题。 南京信息工程大学 实验(实习)报告 实验(实习)名称 电机转动控制及中断实验 实验(实习)日期 2016.5 得分 指导教师 谢胜东 学院 计算机与软件 专业 计算机科学与技术 年级 2013 班次 3 姓名 叶正舟 学号 20131308072 实验名称 电机转动控制及中断实验 实验目的 (1)熟悉ARM本身自带的六路即三对PWM,掌握相应寄存器的配置 (2)编程实现 ARM系统的PWM 输出和I/O 输出,前者用于控制直流电机,后者用于控制步进电机。 (3)了解直流电机和步进电机的工作原理,学会用软件的方法实现步进电机的脉冲分配,即用软件的方法代替硬件的脉冲分配器。 (4)掌握带有PWM 和I/O 的CPU 编程实现其相应功能的主要方法。实验环境 (1)ADS1.2开发环境(2)PC(3)串口线 实验内容及要求 学习步进电机和直流电机的工作原理,了解实现两个电机转动对于系统的软件和硬件要求。学习ARM知识,掌握PWM 的生成方法,同时也要掌握I/O 的控制方法。 (1)编程实现ARM芯片的一对PWM 输出用于控制直流电机的转动,通过A/D 旋钮控制其正反转及转速 (2)编程实现ARM的四路I/O 通道实现环形脉冲分配用于控制步进电机的转动,通过A/D 旋钮转角控制步进电机的转角。 (3)通过超级终端来控制直流电机与步进电机的切换。实验设计与实验步骤 (1)新建工程,将“电机转动控制实验”中的文件添加到工程(2)编写直流电机初始化数(MotorCtrl.c)(3)控制直流电机与步进电机 实验过程与分析 (1)通过把从串口中得到控制信息的代码修改成从zlg7289芯片中读取小键盘信息,从而利用试验台的小键盘来控制步进电机和直流电机的切换 (2)A/D转换可以把电信号转换成数字信号来控制电机的转速。for(;;) { loop: //if((rUTRSTAT0 & 0x1))//有输入,则返回 if(rPDATG&ZLG7289_KEY)//17键小键盘控制电机 { *Revdata=RdURXH0(); goto begin; } Delay(10);ADData=GetADresult(0); if(abs(lastADData-ADData)<20) goto loop;Delay(10);count=-(ADData-lastADData)*3; //(ADData-lastADData)*270/1024为ad旋钮转过的角度,360/512为步距角,//由于接了1/8减速器,两者之商再乘以8为步进电机相应转过的角度 if(count>=0) {//转角大于零 for(j=0;j { for(i=0;i<=7;i++) { SETEXIOBITMASK(stepdata[i], 0xf0); Delay(200); } } } lastADData=ADData; } } 实验结果总结 利用A/D转换器实现了对直流电机和步进电机的控制,利用实验设备上自带的小键盘实现了A/D转换器对两个电机控制的切换。心得体会 通过本次实验,熟悉了ARM自带的六路(三对)PWM,并对直流电机和步进电机的工作原理有了进一步的了解。 1.实验二:利用中断实现 OLED 动态显示实验 1.1 实验名称 1.2 实验目的 (1)深入学习、理解、掌握 OLED 字符显示方法 (2)深入学习、理解、掌握 OLED 图形显示方法(3)学习、理解、掌握中断使用方法 1.3 实验过程与分析 1.3.1 回答实验报告中的实验问题 (1)ISR是什么?简述一下中断的作用和使用方法 答:ISR是中断服务程序。作用是通过处理器执行事先编好的某个特定的程序。使用方法就是在main中写一个中断程序,然后在startup.s中进行注册。 (2)嵌入式系统中有哪些应用有定时性循环处理的要求?举几个例子 答:在各种网络的应用中,设计的一些部件,如计数器,时钟等。 (3)定时时间间隔如何修改? (4)选作内容5-8的编程思路是什么?若做的话应该怎样实现? 答:编程思路:先画直线和竖线,组成一个正方形,将各个参数填写到函数答:通过改变SysTickPeriodSet(SysCtlClockGet()/100)后面的100这个参数。 RIT128x96x4ImageDraw(buf,,); 第6个选作:判断画的原点x,原点y,和画原点x+的长,画原点y+画宽的值要在0-128和0-96。 第7个选作:把RIT128x96x4StringDraw(“hello”,,);就是把画的灰度定义为一个变量x。最后就会出现由不同的亮度而形成的波浪。 第8个就是利用随机函数产生画的原点,随机的在屏幕上进行显示。 (5)拖影现象如何解决?计数值显示为什么没有拖影? 答:在程序结束后执行清屏语句:计数显示是每次重新赋值,所以不会出现拖影。 1.3.2 实验中遇到的问题及解决方法 (1)字符和下方横线,从左至右移动,无法同时到达 通过最大宽度128除以阀值,调整了字符和横线的速度,解决(2)附加字符循环移动,移动到一半,不见了 查看函数排错,得以解决 (3)基本问题做完时,字符显示完整,添加附加任务后,字符显示不全 未解决...1.4实验结果总结 实验结果(附照片) 总结(自己的收获)1.5心得体会 #include 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };unsigned char buf2[] = { 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00 };unsigned char buf3[] = { 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf4[] = { 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf5[] = { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };unsigned char buf6[] = { 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf7[] = { 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf8[] = { 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff }; unsigned char r1[] = { 0xff,0xff };unsigned char r2[] = { 0xf0,0x0f };unsigned char r3[] = { 0xf0,0x0f };unsigned char r4[] = { 0xff,0xff }; unsigned char c1[] = { 0x0f,0xf0 };unsigned char c2[] = { 0xf0,0x0f };unsigned char c3[] = { 0xf0,0x0f };unsigned char c4[] = { 0x0f,0xf0 };void SysTick_Handler(void){ Event = 1;} void printX(){ } int main(){ int count = 0,i,Light=0,x=0,z=0,y=0,zz=0,yy=0,c=0,cc=0,a=0,aa=0;unsigned char buf[5]; //存(数字)字符串 unsigned char name[20] = “";unsigned char number[20] = ”“;SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN SYSCTL_XTAL_8MHZ);RIT128x96x4Init(1000000);RIT128x96x4Clear(); 串 SysTickPeriodSet(SysCtlClockGet()/ 10); //调频率 SysTickEnable();SysTickIntEnable();while(1){ if(Event){ RIT128x96x4Clear(); Event = 0; sprintf(buf,”%3i“,count); //通过sprintf将数字转换为字符 | if(Light >= 15) { Light=0; } else { Light++;} RIT128x96x4StringDraw(name, 50, 55, 15-Light);RIT128x96x4StringDraw(number, 50, 65, Light);sprintf(buf,”%d",count);;RIT128x96x4StringDraw(buf, 50, 75, 12); count++;if(count>=200){ count=0;} RIT128x96x4ImageDraw(buf2,(int)(x*0.50), 5, 20, 1);RIT128x96x4ImageDraw(buf3,(int)(x*0.50), 7, 20, 1);RIT128x96x4ImageDraw(buf4,(int)(x*0.50), 9, 20, 1);RIT128x96x4ImageDraw(buf5,(int)(x*0.50), 11,20, 1);RIT128x96x4ImageDraw(buf6,(int)(x*0.50), 13, 20, 1);RIT128x96x4ImageDraw(buf7,(int)(x*0.50), 15, 20, 1);RIT128x96x4ImageDraw(buf8,(int)(x*0.50), 17, 20, 1);RIT128x96x4ImageDraw(buf1, 0, 20,(int)(x*0.60), 1);RIT128x96x4ImageDraw(c1,(int)(60+c*1.20),(int)(5+a*0.85), 4, 1);RIT128x96x4ImageDraw(c2,(int)(60+c*1.20),(int)(7+a*0.85), 4, 1);RIT128x96x4ImageDraw(c3,(int)(60+c*1.20),(int)(9+a*0.85), 4, 1);RIT128x96x4ImageDraw(c4,(int)(60+c*1.20),(int)(11+a*0.85), 4, 1);RIT128x96x4ImageDraw(r1,(int)(z*0.30),(int)(50+y*0.20), 4, 1);RIT128x96x4ImageDraw(r2,(int)(z*0.30),(int)(52+y*0.20), 4, 1);RIT128x96x4ImageDraw(r3,(int)(z*0.30),(int)(54+y*0.20), 4, 1);RIT128x96x4ImageDraw(r4,(int)(z*0.30),(int)(56+y*0.20), 4, 1);if(x<=200&&x>=0) //直线 { x++;} if(x>=200){ x=0;} if(c<=50&&c>=-50) //圆形循环 { if(cc==0)c++; if(cc==1)c--;} if(c>=50){ cc=1;} if(c<=-50){ cc=0;} if(a<=100&&a>=0){ if(aa==0)a++; if(aa==1)a--;} if(a>=100){ aa=1;} if(x<=0){ aa=0;} if(y<=200&&y>=0){ if(yy==0)y++; if(yy==1)y--;} if(y>=200){ yy=1;} if(y<=-200){ yy=0;} if(z<=400&&z>=0){ if(zz==0)z++; if(zz==1)z--;} if(z>=400){ zz=1;} if(z<=0){ //矩形反弹 } zz=0; } } } return 0;第四篇:嵌入式系统实验
第五篇:嵌入式实验二