《嵌入式开发平台》-模块五:开发嵌入式Linux应用程序_第1页
《嵌入式开发平台》-模块五:开发嵌入式Linux应用程序_第2页
《嵌入式开发平台》-模块五:开发嵌入式Linux应用程序_第3页
《嵌入式开发平台》-模块五:开发嵌入式Linux应用程序_第4页
《嵌入式开发平台》-模块五:开发嵌入式Linux应用程序_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

任务1:对讲机子任务1:程序分析对讲机需要使用串口通信程序设计。常见的数据通信的基本方式分为并行通信和串行通信。并行通信是指利用多条数据传输线将一个文件的各位同时传送,特点是传输速度快,适用于短距离通信,但要求传输速度较高的场合。串行通信是指利用一条数据传输线将一个文件一位一位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。下一页返回任务1:对讲机常用的串口有RS-232-C接口,它是1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的串行通信标准,它的全称是:数据终端设备(DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准。该标准规定采用一个DB25芯引脚的连接器或9芯引脚的连接器,其中9芯引脚的连接器如图5-1所示。子任务2:程序设计串口一:/dev/ttyS0串口二:/dev/ttyS1上一页下一页返回任务1:对讲机如果在目标板的终端有这样的提示:/dev/ttyS0:Nosuchfileordirectory则解决方法为:使用命令ln-s/dev/tts/0/dev/ttyS0给目标板的串口设备文件/dev/tts/0做一个软链接文件/dev/ttyS0。同理,可以为目标板的串口设备文件/dev/tts/1设置一个软链接文件/dev/ttyS1,命令如下:ln-s/dev/tts/1/dev/ttyS1上一页下一页返回任务1:对讲机子任务3:对讲机编程一、需要的头文件二、打开串口上一页下一页返回任务1:对讲机三、读取串口数据(相对于终端而言是接收数据)四、往串口写数据(相对于终端而言是发送数据)五、关闭串口上一页下一页返回任务1:对讲机六、设置串口属性波特率115200b/s,数据位8位,检验位无,停止位1位。主要设置structtermios结构体的各成员值。其中主要是c_cflag成员。1.波特率上一页下一页返回任务1:对讲机2.数据位8位,检验位无3.停止位1位上一页返回任务2:ATM取款机子任务1:程序分析ATM取款机就是多线程应用程序设计。一、概念操作系统是多任务的,指的是多进程,进程即为运行的程序。一个应用程序是多任务的,指的是多线程,线程即为运行的程序段或函数。下一页返回任务2:ATM取款机二、使用应用程序多线程的原因(1)与多进程比,它是一种“节俭”的多任务方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段;而运行一个进程的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据。启动一个线程所花费的空间远远小于一个进程所花的时间,线程间彼此切换所需时间也远远小于进程间切换所需的时间。(2)线程间方便的通信机制。不同的进程具有独立的数据空间,要进行数据的传递只能通过通信的方式;而同一进程的多线程之间共享数据空间,所以一个线程间的数据可以直接为其他线程所使用。上一页下一页返回任务2:ATM取款机三、多线程程序的优点(1)提高应用程序的响应。(2)使多CPU系统更加有效。(3)改善程序结构。子任务2:程序设计编写多线程程序,需要使用头文件pthread.h,连接时需要使用libpthread.a或lib—pthread.so(/usr/lib)。一、数据类型:线程标识符pthread_t上一页下一页返回任务2:ATM取款机二、线程创建函数pthread_create函数原型:intpthread_create(pthread_t*tid,constpthread_attr_t*tattr,void*(*start_routine)(void*),void*arg);功能:创建一个新的线程,并将线程加入当前进程。头文件:#include<pthread.h>注意事项:pthread非linux系统的默认库,需手动链接-线程库-lpthread。第一个参数为指向线程标识符的指针。第二个参数用来设置线程属性,NULL表示默认属性。第三个参数线程运行函数的起始地址。上一页下一页返回任务2:ATM取款机第四个参数是运行函数的参数。返回值为int,当创建成功时,函数返回0,新创建的线程则运行参数三、参数四确定的函数,原来的线程继续运行下一行代码。三、线程阻塞函数pthread_join函数原型:intpthread_join(pthread_ttid,void**status);功能:pthread_join()函数会一直阻塞调用线程,直到指定的线程tid终止。当pthread_join()返回之后,应用程序可回收与已终止线程关联的任何数据存储空间(另外,也可设置线程attr属性,当线程结束时,直接回收资源)。如果没有必要等待特定的线程终止之后再进行其他处理,则应当将该线程分离pthread_detach()。上一页下一页返回任务2:ATM取款机第一个参数为被等待的线程标识符。第二个参数为一个用户定义的指针,用来存储被等待线程返回值。调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待的资源被收回。四、线程的结束函数pthread_exit函数原型:voidpthread_exit(void*retval);函数功能:使用函数pthread_exit退出线程,这是线程的主动行为;由于一个进程中的多个线程是共享数据段的,因此,通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放,但是可以用pthread_join()函数(下篇博客中讲到)来同步并释放资源。上一页下一页返回任务2:ATM取款机一个线程的结束一种是函数结束了,调用它的线程也结束了;另一种就通过该函数实现。唯一的参数是函数的返回代码。注意:一个线程不能被多个线程等待。五、互斥锁和条件变量1.互斥锁(1)用来保证同一段时间内只有一个线程在执行一段代码。(2)pthread_mutex_t声明互斥锁数据类型。(3)pthread_mutex_init用来生成一个互斥锁,一个参数为互斥锁的属性。(4)pthread_mutex_lock用于互斥锁的加锁。(5)pthread_mutex_unlock用于互斥锁的解锁。上一页下一页返回任务2:ATM取款机2.条件变量(1)互斥锁只有两种状态:锁定和非锁定;而条件变量通过允许线程阻塞和等待另一个线程的发送信号的方法来弥补互斥锁的不足,使用时,条件变量被用来阻塞一个线程。当条件不满足时,线程解开相应的互斥锁并等待条件发生变化,一旦其他某个线程改变了条件变量,相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程,这些线程将重新锁定互斥锁并重新测试条件是否满足。(2)条件变量数据类型pthread_cond_t。(3)pthread_cond_init条件变量的初始化,返回值int,参数分别为指向条件变量的指针和指向pthread_condattr_t条件变量属性类型的指针。上一页下一页返回任务2:ATM取款机(4)pthread_cond_wait使线程阻塞在一个条件变量上,返回值int,参数分为指向条件变量的指针和指向互斥锁的指针。pthread_cond_timedwait也可以用来阻塞线程,比前一个多了一个时间参数,也就是说,即使条件变量不满足,经历该时间段后,阻塞也解除。(5)pthread_cond_signal用来释放被阻塞在条件变量上的一个线程,即释放信号的函数。返回值int,参数就是指向条件变量的指针。多个线程阻塞在此条件变量上,哪一个线程被唤醒是由线程的调度策略所决定的。上一页下一页返回任务2:ATM取款机子任务3:ATM取款机编程案例为著名的存款人-取款人问题模型的实现。主程序中分别启动存款人线程和取款人线程。存款人线程不断顺序地将0~1000的数字写入共享的循环缓冲区,同时取款人线程不断地从共享的循环缓冲区读取数据。案例分析:一、程序结构流程图(图5-2)上一页下一页返回任务2:ATM取款机二、存款人写入共享的循环缓冲区函数put上一页下一页返回任务2:ATM取款机三、取款人读取共享的循环缓冲区函数get上一页下一页返回任务2:ATM取款机四、取款(生产)、取款(消费)流程图(图5-3)五、实验步骤(1)进入exp/basic/02_pthread目录,使用vi编辑器或其他编辑器阅读理解源代码。(2)运行make,产生pthread可执行文件。(3)切换到minicom终端窗口,使用NFSmount开发主机的/up-techpxa270到/mnt目录。(4)进入/mnt/exp/basic/pthread目录,运行./pthread,观察运行结果的正确性。若显示结果太快,可以用“/pthread>pthread.txt”命令输出显示结果到pthread.txt文件,然后再用catpthread.txt查看文件内容,结合程序分析结果。(5)修改一些参数,再次运行调试,加深对多线程的理解。上一页返回任务3:聊天室子任务1:简单嵌入式WEB服务器一、客户/服务器模式在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器模式(Client/Servermodel),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造成拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是基于客户/服务器模式的TCP/IP。下一页返回任务3:聊天室客户/服务器模式在操作过程中采取的是主动请求方式。首先服务器方要先启动,并根据请求提供相应服务:(1)打开一通信通道并告知本地主机,它愿意在某一公认地址(如FTP为21)上接收客户请求。(2)等待客户请求到达该端口。(3)接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程来处理这个客户请求(如UNIX系统中用fork、exec)。新进程处理此客户请求,并不需要对其他请求做出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。(4)返回第(2)步,等待另一客户请求。上一页下一页返回任务3:聊天室(5)关闭服务器。客户方:(1)打开一通信通道,并连接到服务器所在主机的特定端口。(2)向服务器发服务请求报文,等待并接收应答;继续提出请求……(3)请求结束后关闭通信通道并终止。从上面所描述过程可知:(1)客户与服务器进程的作用是非对称的,因此编码不同。(2)服务进程一般是先于客户请求而启动的。只要系统运行,该服务进程一直存在,直到正常或强迫终止。图5-4所示为使用socket建立连接的过程。上一页下一页返回任务3:聊天室子任务2:功能需求(1)获取服务器当前目录文件列表:将服务器当前目录下所有文件的信息发送给客户端,包括:文件名、大小、日期。(2)获取指定文件:将客户请求的文件发送给客户。(3)获取HTML文件:将客户请求的HTML类型文件发送给客户。(4)获取纯文本文件:将客户请求的纯文本文件发送给客户。(5)获取JPEG图像文件:将客户请求的JPEG图像发送给客户。上一页下一页返回任务3:聊天室(6)获取GIF图像文件:将客户请求的GIF图像文件发送给客户(7)解析用户请求:分析客户的请求,将请求信息解析为几个变量,包括请求的命令、请求的文件名、请求的文件类型。子任务3:主程序分析建立TCP类型SOCKET(套接字)在80端口进行监听连接请求。接收到连接请求,将请求传送给连接处理模块处理,并继续进行监听。上一页下一页返回任务3:聊天室一、功能说明(1)建立环境设置。(2)设置信号处理方式。(3)建立监听TCP流方式SOCKET并绑定80端口。(4)建立连接监听及客户连接处理调用主循环。二、主程序流程图主程序流程图如图5-6所示。子任务4:各处理模块分析一、客户处理模块用户初步处理客户的连接请求,并将请求信息传递给客户请求解析函数处理。上一页下一页返回任务3:聊天室流程步骤如下:(1)开始。(2)打开文件描述字,并建立文件描述符。(3)读取连接信息。(4)获取Refferer字段信息。(5)赋值给Refferer全局变量。(6)获取content_length字段信息。(7)调用客户请求。(8)解析模块。(9)关闭文件流。(10)结束。上一页下一页返回任务3:聊天室二、客户请求解析处理模块设计用于解析客户的请求,并根据请求信息调用相应的函数进行请求处理。三、发送HTTP协议数据头模块设计根据参数的不同,发送不同的HTTP协议头信息。四、相关函数、接口(1)客户连接处理函数。intHandleConnect(intfd)(2)解析客户请求。intParseReq(FILE*,char*)上一页下一页返回任务3:聊天室(3)发送HTTP协议数据头。intPrintHeader(FIlE*,int)第2个参数int为信息类型,用于确定发送的HTTP协议数据头信息。(4)发送当前目录文件列表信息。intDoDir(FILE*,char*)第2个参数char*为目录名称的类型,表示客户请求的目录信息。(5)发送HTML、TXT、JPEG、GIF文件内容。intDoHTML(FILE*,char*)intDoTEXT(FILE*,char*)intDoJpeg(FILE*,char*)intDoGif(FILE*,char*)上一页返回任务4:数码相框子任务1:产品简介数码相框,作为一个电子产品,早在2000年的时候就出现在硅谷,由于它的新颖性、便携性,在美国产生了强烈的反响,拥有数码相框成为一种时尚。但是,直到2005年,数码相框才出现在中国的北京———中关村。随后的几年,数码相框在中国的销售量逐年增长,越来越多的人去关注这个时尚的数码产品。由于它技术门槛较低,各种大小电子厂商都尝试来做这个产品,因此出现了现在市场上数码相框价格相差较大的局面,从几十元到几千元。本任务并非为了追求时尚,而是通过这个数码相框来熟悉嵌入式Linux的开发环境及流程,熟悉文件系统,然后结合自己的思考,提出数码相框还可以做哪些功能上的扩展。下一页返回任务4:数码相框子任务2:知识储备一、FrameBuffer(一)什么是FrameBufferFrameBuffer是出现在Linux2.2.xx内核当中的一种驱动程序接口。Linux抽象出Frame—Buffer这个设备来供用户态进程实现直接写屏。FrameBuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过FrameBuffer的读写直接对显存进行操作。用户可以将FrameBuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反映在屏幕上。上一页下一页返回任务4:数码相框(二)工作原理Framebuffer本身不具备任何运算数据的能力,就好比是一个暂时存放水的水池。CPU将运算后的结果放到这个水池,水池再将结果流到显示器,中间不会对数据做处理。应用程序也可以直接读写这个水池的内容。在这种机制下,尽管FrameBuffer需要真正的显卡驱动的支持,但所有显示任务都由CPU完成,因此CPU负担很重。上一页下一页返回任务4:数码相框(三)FrameBuffer的设备文件FrameBuffer的设备文件一般是/dev/fb0、/dev/fb1等。可以用命令:#ddif=/dev/zeroof=/dev/fb清空屏幕;如果显示模式是1024x768-8位色,用命令!ddif=/dev/zeroof=/dev/fb0bs=1024count=768清空屏幕;用命令#ddif=/dev/fbof=fbfile可以将fb中的内容保存下来;用命令#ddif=fbfileof=/dev/fb可以重新写回屏幕。上一页下一页返回任务4:数码相框在使用Framebuffer时,Linux是将显卡置于图形模式下的。在应用程序中,一般通过将FrameBuffer设备映射到进程地址空间的方式使用。本任务应用程序的任务就是打开/dev/fb0设备,并通过mmap系统调用进行地址映射,随后用memset将屏幕清空。二、Libjpeg库Libjpeg是一个被广泛使用的jpeg压缩/解压缩函数库,它能够读写JFIF格式的jpeg图像文件,通常这类文件是以.jpg或者.jpeg为后缀名的。通过Libjpeg库,应用程序可以每次从jpeg压缩图像中读取一个或多个扫描线,而诸如颜色空间转换、降采样/增采样、颜色量化之类的工作则都由Libjpeg去完成了。上一页下一页返回任务4:数码相框对于Libjpeg而言,图像数据是一个二维的像素矩阵。对于彩色图像,每个像素通常用三个分量表示,即R、G、B三个分量。每个分量用一个字节表示,因此每个分量的取值范围为0~255;对于灰度图像,每个像素通常用一个分量表示,一个分量同样由一个字节表示,取值范围为0~255。三、Libjpeg库的编译在Fedora12中,测试应用程序,执行tarzxvfjpegsrc.v8.tar.gz将文件解压到与源码文件夹相同的父目录下,进入目录cdjpeg-8,执行./configure配置makefile文件。configure脚本默认选项是X86PC系统环境。然后执行make命令,编译libjpeg。这步完成后,最好不要执行makeinstall命令,否则会导致其他程序的错误。上一页下一页返回任务4:数码相框子任务3:项目设计该数码相框项目的设计主要通过两部分来说明:项目project目录结构和Makefile文件。project目录结构如下:Makefile代码如图5-7所示。上一页下一页返回任务4:数码相框下面逐行分析这个Makefile:第2行src=!(wildcard*.c)找出当前目录下所有c文件,将文件名保存在src变量中。第3行obj=!(patsubst%c,%.o,!(src))将变量src中c文件的文件名,都替换成.o文件,保存到变量obj中。第6行CC=gcc第7行#CC=arm-linux-gcc这两行很关键,是本机编译和交叉编译的开关,gcc是本机编译器,而arm-linux-gcc是目标及编译器。上一页下一页返回任务4:数码相框最后介绍clean,它只是make命令的一个可选参数,只不过当输入make时,默认执行的是all后面的命令。可以用命令行makeclean来执行clean后面的命令。.PHONY表示clean是个伪目标文件,为什么要将其申明为伪目标我们这也不做详细的讨论。至此,Make—file文件说明完了。子任务4:项目实现怎么让图片显示在液晶显示器上,从显示一个点,到一条直线,再到曲线,然后到一幅图片。上一页下一页返回任务4:数码相框一、显示设备初始化要在一个屏幕上显示一个点,就要对显示设备进行操作。由于Linux下一切设备都可看作文件,则对显示设备的操作就相当于对文件的操作,只要打开,然后进行相应的读写即可。在对这个“文件”操作之前,要做一些初始化的工作,步骤如下:(1)打开设备文件。(2)读取设备文件中关于显示屏幕的信息(长、宽、深度等)。(3)用mmap将设备文件以共享方式映射到内存,以后对该块内存的操作就相当于对设备文件的操作(操作系统自动将更新同步到设备文件)。程序片段如图5-8所示。上一页下一页返回任务4:数码相框到了这一步,就在内存和显示屏幕之间建立了一一对应的关系。现在说明下内存和显示屏幕是怎么对应的,假设显示屏幕长x,宽y,深度d。先解释下深度,当深度为32位即四个字节时,作用如下:8位表示红色8位表示蓝色8位表示绿色8位表示灰度上一页下一页返回任务4:数码相框当深度位24位时,内存各位分布如下:5位表示红色6位表示蓝色5位表示绿色8位表示灰度不同的平台有不同的长度和深度的情况,我们写的程序要能够应对所有的情况,不管是32位、24位,还是16位,或者8位。解释完内存与显示屏对应关系后,将列出这个程序。上一页下一页返回任务4:数码相框现在我们知道了,屏幕上的每个点要占用内存中的d个bit,即d/8个字节。因为屏幕是映射在一个线性的地址空间的,假设该地址空间的起始地址为start_addr,则地址与屏幕上的一个点(a,b)的对应关系如下:start_addr+(b*x+a)*d/8;二、显示图形1.显示点当进行了显示设备的初始化过程后,我们的工作将变得很简单,对设备的操作转化为我们熟悉也觉得简单的对内存的操作。函数代码如图5-9所示。到此为止,显示一个点的工作已全部完成。上一页下一页返回任务4:数码相框2.显示直线和曲线有了显示一个点的函数之后,显示直线和图形就变得轻而易举了,因为不管是直线还是图形,都是由一个个点组成的。任何直线或曲线,只要能用公式表示,就能显示出来。下面举个显示直线的例子,这个函数的接口需要提供起点和终点的x及y坐标,代码如图5-10所示。3.显示图片当需要显示一张图片的时候,工作就多了一步:读取图片的信息。这个过程比较复杂,现在也已经有很多开源的库,本部分主要参考Libjpeg的函数库,主要用到其中的三个函数,如下:上一页下一页返回任务4:数码相框解码jpeg图片,将图片信息解密保存到jpeg_inf这个结构体中,其中包括图片的长、宽、深度等。由于上一个函数解析出的信息是24位的,而主机上的显示器是32位,所以用这个函数将其转换为32位的。如果开发板上的触摸屏是16位的,那么就需要一个类似rgb24to16的函数。这个函数用于将图片的大小缩放到屏幕的大小,当然,完全可以不进行缩放,这样将显示一部分图片或是图片没有覆盖整个屏幕。上一页下一页返回任务4:数码相框4.管理多张图片由于数码相框是用来显示多张图片的信息的,所以程序运行的开始要读取某个文件夹下的图片,然后将其保存到数据结构中。这里用到结构体来保存图片的信息,将每张图片用双向链表链接起来,数据结构如下:当打开一个目录,里面有一个个目录项,每个目录项都对应一个inode,然后通过文件的inode可以到磁盘上找到该文件的信息。上一页返回任务5:探月车子任务1:项目需求在规定时间组装调试一台“探月车”,并在嵌入式开发环境下编制个性化的控制软件。“探月车”制作完成后,在大赛提供的模拟环境中执行寻迹、定位、图像识别与成像、无线通信等任务。在完成产品基本功能的基础上,可以在一定范围内进行扩展发挥。1.电路调试与装配利用提供的探月车探测板套件,按照大赛所提供的工艺文件焊接、装配与调试模块电路。参赛选手完成探月车探测板电路模块的制作后,即可将探月车探测板电路模块由工作人员送到裁判组进行焊接和安装技能工艺的评分。裁判组完成评判后,将探月车探测板电路模块归还给参赛队。焊接和安装技能工艺评分组在比赛第一天晚上6:00停止接受评分申请。下一页返回任务5:探月车2.嵌入式系统调试与装配利用现场焊接、调试的探测板电路模块与预先准备好的探月车其他部件,组装调试一台探月车,在嵌入式开发环境下编制、安装(或固件升级)个性化的控制软件,并进行整机调测。制作完成后的“探月车”,在大赛提供的模拟“月球环境”中行进,并对模拟“月球环境”中的地形标志物等进行探测,同时通过无线通信发回探测数据和地形标志物图像。3.技术文件编写与整理(以现场赛题要求为准,通过网络提交电子文档)(1)文字性文件:技术说明、使用说明、安装说明。(2)表格性设计文件主要有:明细表、程序流程图、程序说明、接线表。上一页下一页返回任务5:探月车(3)电子工程图主要有:电路图、方框图、印制板图、装配图、接线图、逻辑图、流程图。4.任务比赛(1)任务比赛时,只能有2名参赛选手入场,其中一名进行操作。(2)“探月车”车体的任何一部分不得超过出发区边线,在收到裁判发出的比赛开始命令后开始比赛,如不能自动开始,允许选手在10s后手动启动探月车进行比赛。比赛开始后,未经裁判允许,参赛队员不得接触探月车,否则酌情扣分或取消比赛资格。比赛期间可由选手申请、经裁判同意,探月车由裁判从比赛区取出交选手手动技术处理,再由选手将探月车放到出发区手动启动,每次手动启动探月车扣除一定分数,同时计时连续进行。上一页下一页返回任务5:探月车(3)任务比赛共进行两轮,每场为5min(从裁判允许选手进场开始计算,超出规定时间后完成的比赛任务不予承认),依次根据完成探测任务数量的多少和完成任务时间(从裁判发出的比赛开始命令后开始计算)的短长为原则,取最好的一次成绩为最终成绩。(4)第一轮比赛后,参赛选手可自愿选择任一方式进行外援求救。外援求救方式为电话求救、远程视频求救、网络求救(不得传输程序)等,救助队伍可由各个参赛队自行组织。参赛选手可以在赛项组委会提供的专用准备室对小车进行调整后再次比赛。(5)比赛必须使用现场焊接、调试的探测电路模块,完成探月车的探测数据功能,否则取消比赛资格。(6)探月车在比赛中只能与赛项组委会指定的比赛服务器进行无线信息传输,不得与其他参赛队或赛场外的其他设备进行无线或有线信息传输,否则经裁判认定取消比赛资格。上一页下一页返回任务5:探月车子任务2:项目准备包含交叉编译器arm-Linux-gcc等。使用压缩

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论