版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式Linux系统原理与应用第九章嵌入式Linux高级编程目录9.1嵌入式Linux下的Socket编程9.2Linux多线程应用程序设计9.3一个简单的Linux驱动程序9.4通过YoctoProject构建Linux9.5嵌入式人工智能TensorFlowLite9.6基于“ARM-Linux”的嵌入式WEB服务器设计9.7本章小结
嵌入式Linux下的Socket编程PartOne9.1何为Socket,其功用是什么?嵌入式Linux系统通常通过提供套接字(socket)来进行网络编程,Socket有一个类似于打开文件的函数socket(),连接建立、数据传输等操作都是通过该socket()函数实现。9.1.1Socket函数简介1.基本socket函数(1)socket函数原型:intsocket(intdomain,inttype,intprotocol);功能说明:调用成功,返回socket文件描述符;调用失败,返回-1,并设置errno。参数说明:domain指明所使用的协议族,type参数指定socket的类型,protocol通常赋值"0"。(2)bind函数原型:intbind(intsock_fd,structsockaddr_in*my_addr,intaddrlen);功能说明:将套接字和指定的端口相连。参数说明:sock_fd是调用socket函数返回值,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针,addrlen为sockaddr的长度。(3)connect函数原型:intconnect(intsock_fd,structsockaddr*serv_addr,intaddrlen);功能说明:客户端发送服务请求。参数说明:sock_fd是socket函数返回的socket描述符;serv_addr是包含远端主机IP地址和端口号的指针;addrlen是结构sockaddr_in的长度。(4)listen函数原型:intlisten(intsock_fd,intbacklog);功能说明:等待指定的端口的出现客户端连接参数说明:sock_fd是socket()函数返回值;backlog指定在请求队列中允许的最大请求数。(5)accecpt函数原型:intaccept(intsock_fd,structsockadd_in*addr,intaddrlen);功能说明:用于接受客户端的服务请求。调用成功返回新的套接字描述符,失败返回-1参数说明:sock_fd是被监听的socket描述符,addr通常是一个指向sockaddr_in变量的指针,addrlen是结构sockaddr_in的长度。(6)write函数原型:ssize_twrite(intfd,constvoid*buf,size_tnbytes);功能说明:write函数将buf中的nbytes字节内容写入文件描述符fd。调用成功时返回写的字节数。(7)read函数原型:
ssize_tread(intfd,void*buf,size_tnbyte);函数说明:read函数负责从fd中读取内容。当读成功时,read返回实际所读的字节数(8)close函数原型:intclose(sock_fd);函数说明:释放该socket,从而停止在该socket上的任何数据操作。2.socket编程的其他函数(1)网络字节顺序转换函数功能说明:将每一台机器内部对变量的字节不同存储顺序,转换为网络传输的统一顺序。函数原型定义在netinet/in.h里*unsignedshortinthtons(unsignedshortinthostshort);该函数将主机字节顺序转换成网络字节顺序,对无符号短型进行操作4bytes。*unsignedlonginthtonl(unsignedlonginthostlong);该函数将主机字节顺序转换成网络字节顺序,对无符号长型进行操作8bytes。*unsignedshortintntohs(unsignedshortintnetshort);该函数将网络字节顺序转换成主机字节顺序,对无符号短型进行操作4bytes。*unsignedlongintntohl(unsignedlongintnetlong);该函数将网络字节顺序转换成主机字节顺序,对无符号长型进行操作8bytes。(2)IP地址转换函数 功能说明:将形式表示为(*.*.*.*)的字符串IP地址与32位网络字节顺序的二进制形式的IP地址进行转换常用的有三个:unsignedlongintinet_addr(constchar*cp);把一个用(*.*.*.*)表示的IP地址的字符串转换成一个无符号长整型intinet_aton(constchar*cp,structin_addr*inp);该函数将字符串形式的IP地址转换成二进制形式的IP地址;char*inet_ntoa(structin-addrin);该函数将32位二进制形式的IP地址转换为(*.*.*.*)形式的IP地址,返回一个指向字符串的指针。(3)字节处理函数Linux提供了两组函数来处理多字节数据,一组以b(byte)开头,是和BSD系统兼容。另一组以mem(内存)开头,是ANSIC提供的函数。以b开头的函数:voidbzero(void*s,intn);该函数将参数s指定的内存的前n个字节设置为0,通常它用来将套接字地址清0voidbcopy(constvoid*src,void*dest,intn);该函数从参数src指定的内存区域拷贝指定数目的字节内容到参数dest指定的内存区域。intbcmp(constvoid*s1,constvoid*s2,intn);该函数比较参数s1指定的内存区域和参数s2指定的内存区域的前n个字节内容,以mem开头的函数:void*memset(void*s,intc,size_tn);该函数将参数s指定的内存区域的前n个字节设置为参数c的内容。void*memcpy(void*dest,constvoid*src,size_tn);该函数的功能与bcopy()相同,区别是函数bcopy()能处理参数src和参数dest所指定的区域有重叠的情况,memcpy()则不能。intmemcmp(constvoid*s1,constvoid*s2,size_tn);该函数比较参数s1和参数s2指定区域的前n个字节内容。套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。TCP同时为多个应用程序进程提供并发服务如何处理?应用层和传输层通过socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。9.1.2Socket中TCP交互过程Socket中TCP交互过程使用vim编辑server.c代码使用vim编辑client.c代码用交叉编译器(arm-Linux-gcc)编译server.c和client.c。将可执行文件server和client拷贝到本地Linux系统中的tftproot目录cpserver/tftprootcpclient/tftproot9.1.3设计步骤telnet进开发板,下载server、client,加上可执行权限[root@FriendlyARMwork]#tftp-g-rserver09
server100%|*******************************|8704--:--:--ETA[root@FriendlyARMwork]#tftp-g-rclient09
client100%|*******************************|8704--:--:--ETA[root@FriendlyARMwork]#lsclientserver[root@FriendlyARMwork]#chmod+x*[root@FriendlyARMwork]#ls-l
-rwxr-xr-x1rootroot8265May1003:27client-rwxr-xr-x1rootroot8226May1003:26server
在开发板上运行server,在PC机上运行“gcc–oclientclient.c”,编译出client,然后运行clientxxxxxxxx(此处为开发板ip),发送字符串到开发板。PC端:[lmzl@localhostproj1]$gcc-oclientclient.c[lmzl@localhostproj1]$./client10sendmsgtoserver:hello开发板:[root@FriendlyARMwork]#./server
======waitingforclient'srequest======recvmsgfromclient:helloTCP通信成功
Linux多线程应用程序设计PartTwo9.2
Linux系统下的多线程遵循POSIX线程接口,称为pthread,主要涉及线程相关操作和互斥锁相关操作,需要使用头文件pthread.h,连接时需要使用库libpthread.a。1.标志符pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义typedefunsignedlongintpthread_t;9.2.1线程相关操作涉及的主要函数2.pthread_create函数原型:extern
intpthread_create((pthread_t*__thread,__constpthread_attr_t*__attr,void*(*__start_routine)(void*),void*__arg));功能说明:创建一个线程,当创建线程成功时,函数返回0,若不为0则说明创建线程失败参数说明:第一个参数为指向线程标志符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。3.pthread_join函数externintpthread_join((pthread_t__th,void**__thread_return));功能说明:该函数是一个线程阻塞的函数,调用该函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。参数说明:第一个参数为被等待的线程标志符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。4.pthread_exit函数externvoidpthread_exit((void*__retval))__attribute__((__noreturn__));
功能说明:结束线程
参数说明:函数的返回代码
互斥锁用来保证多个线程互斥执行各自的部分代码。1.pthread_mutex_init函数
功能说明:生成一个互斥锁,
参数说明:NULL参数表明使用默认属性
说明:生成特定属性的互斥锁,须调用函数pthread_mutexattr_init(),函数pthread_mutexattr_setpshared()实现不同进程中的线程同步pthread_mutexattr_settype()实现属于同一进程的不同线程的同步9.2.2互斥锁相关涉及的主要函数2.pthread_mutex_lock和pthread_mutex_unlock函数
说明:pthread_mutex_lock()上锁
pthread_mutex_unlock()开锁在本地Linux系统中使用vim编辑thread.c代码
用交叉编译器(arm-Linux-gcc)编译thread.c。将可执行文件thread拷贝到本地Linux系统中的tftproot目录,执行命令cpserver/tftprootcpclient/tftproot9.2.3设计步骤telnet进开发板,下载thread,加上可执行权限。[root@FriendlyARMwork]#tftp-g-rthread11thread100%|*******************************|8704--:--:--ETA[root@FriendlyARMwork]#./thread-/bin/sh:./thread:Permissiondenied[root@FriendlyARMwork]#chmod+xthread在开发板上运行thread。[root@FriendlyARMwork]#./threadmian:createthread.createthread1.createthread2.mian:waitthreadend.thread2:I'mthread2thread2:number=0thread1:I'mthread1thread1:number=1thread1:number=2thread2:number=3thread1:number=4thread2:number=5thread1:number=6thread1:number=7thread2:number=8thread1:number=9thread2:number=10thread1:mainwaitthread1thread1ended.thread2:mainwaitthread1thread2ended.[root@FriendlyARMwork]#
一个简单的Linux驱动程序PartThree9.3有源蜂鸣器的驱动程序的设计过程
蜂鸣器一般是通过GPIO(General-PurposeInput/OutputPorts,通用编程I/O端口)的控制来实现,GPIO是CPU的引脚,可以通过它们向外输出高低电平,或者读入引脚的状态。每个GPIO端口至少需要两个寄存器,一个是用于控制的“通用I/O端口控制寄存器”,一个是存放数据的“通用I/O端口数据寄存器”。控制和数据寄存器的每一位和GPIO的硬件引脚相对应,由控制寄存器设置每一个引脚的数据流向,数据寄存器设置引脚输出的高低电平或读取引脚上的电平。蜂鸣器一般分为无源蜂鸣器和有源蜂鸣器。无源蜂鸣器一般不内置放大和驱动电路,有源蜂鸣器一般都内置放大和驱动电路。设计过程:首先获得蜂鸣器使用的是XpwmTOUT0引脚的信息再到CPU原理图上找XpwmTOUT0对应引脚信息。找到XpwmTOUT0引脚对应的是GPH2_0。查看数据手册,查询GPH2相关的寄存器。GPH2相关的寄存器有:GPH2CON,GPH2DAT,GPH2PUD以及GPH2DRV。通过对不同寄存器的操作,可以配置GPIO的功能。寄存器物理地址读/写属性描述初始值GPH2CON0Xe020_0C40R/WGPH2CON端口配置寄存器0x00000000GPH2DAT0Xe020_0C44R/WGPH2DAT端口数据寄存器0x00GPH2PUD0Xe020_0C48R/WGPH2PUD端口上拉寄存器0x5555GPH2DRV0Xe020_0C4CR/WGPH2DRV端口驱动能力寄存器0x0000GPH2寄存器族GPH2CON位描述初始值GPH2CON[0][3:0]0000=Input0001=Output0010=Reserved0011=KP_COL[0]0100~1110=Reserved1111=EXT_INT[16]0000GPH2CON端口配置寄存器GPH2DAT位描述初始值GPH2DAT[7:0][7:0]8位数据输入或者输出0x00GPH2DAT端口数据寄存器GPH2PUD位描述初始值GPH2PUD[n][2n+1:2n]N=0~700=禁止上拉/下拉01=下拉使能10=上拉使能11=Reserved0x5555GPH2PUD端口上拉寄存器GPH2DRV位描述初始值GPH2DRV[n][2n+1:2n]N=0~700=1x01=2x10=3x11=4x0x00GPH2DRV端口驱动能力寄存器编写驱动程序在同一目录下编写Makefile:obj-m+=buzzer.oPWD:=$(Shellpwd)#PC机内核模块使用以下两行进行内核代码路径指定(根据需要打开#注释)#KERN_VER=$(Shelluname-r)#KERN_DIR=/lib/modules/$(KERN_VER)/build#ARM内核模块使用以下进行内核代码路径指定(根据需要打开#注释)KERN_DIR=/homw/work/Linux-3.0.8modules: $(MAKE)-C$(KERN_DIR)M=$(PWD)modulesclean: rm–rf*.o*~core.depend.*.cmd*.ko*.mod.c.tmp_versions编写驱动测试程序测试生成buzzer.ko模块文件编写驱动测试程序用arm-Linux-gcc编译后生成test可执行文件,加载内核将buzzer.ko下载到开发板,用insmod命令加载buzzer.ko模块。[root@FriendlyARM/home]#tftp-g-rbuzzer.ko01
buzzer.ko100%|*******************************|69120--:--:--ETA[root@FriendlyARM/home]#insmodbuzzer.ko[1709.164933]initbuzzer.[root@FriendlyARM/home]#lsmod
buzzer31430-Live0xbf1e1000libertas_sdio83290-Live0xbf1db000…检查buzzer的设备号:[root@FriendlyARM/home]#cat/proc/devices|grepbuzzer
250buzzer创建字符设备:[root@FriendlyARM/home]#mknod/dev/buzzerc2500测试驱动:将test程序下载到开发板:[root@FriendlyARM/home]#tftp-g-rtest02
test100%|*******************************|8192--:--:--ETA添加可执行权限:[root@FriendlyARM/home]#chmod+xtest
运行测试程序:[root@FriendlyARM/home]#./test
[4093.658547]openmajor=250,minor=0.Iamtestingmydevice.[4098.658817]closemajor=250,minor=0.
通过YoctoProject构建LinuxPartFour9.4YoctoProject是一个开源协作项目,帮助开发人员为嵌入式产品创建基于Linux的定制系统。特点:(1)YoctoProject适用于任何架构。支持Intel,ARM,MIPS,AMD,PPC等硬件厂商。(2)大多数ODM和芯片供应商提供SDK,BSP和其他支持结构,以便与YoctoProject一起使用。(3)它专为受限制的嵌入式和物联网设备需求而设计。(4)YoctoProject提供全面的工具链功能。(5)YoctoProject遵循严格的发布计划,在所有受支持的版本中包含安全补丁。YoctoProject,Poky和OpenEmbeddedYoctoProject一组集成工具,使嵌入式Linux成功运行,包括自动构建和测试工具,BSP板级支持包和许可证合规流程,以及基于Linux的自定义嵌入式操作系统的组件信息。参考嵌入式发行版(Poky),用于验证Yocto项目。OpenEmbedded构建系统。相互关系:Poky参考嵌入式操作系统实际上是一个有效的构建示例,它将构建一个小型嵌入式操作系统,使用的是它内置的构建系统。9.4.1YoctoProject概述术语描述追加文件(appendfile)追加文件扩展现有的菜谱。BitBake逐字追加该文件内容到对应菜谱,追加文件使用bbappend后缀BitBake作为OpenEmbedded构建系统中的构建引擎,BitBake是任务执行器和调度器。类似于make构建引擎板级支持包(BSP)板级支持包中的二进制,代码和其他支持数据使一个特定的操作系统运行在特定的目标硬件系统上类(class)类提供封装和基本继承机制,是可以在多个菜谱中使用的元数据文件。BitBake类文件使用bbclass后缀配置文件(conf)包含变量的全局定义,用户定义的变量和硬件配置信息的文件镜像用于加载到设备上的Linux发行版的二进制形式。通常包括bootloader,内核和根文件系统层(layer)层是组织进目录和文件的元数据(配置文件,菜谱等)集合。层允许开发者合并相关元数据以自定义构建和扩展,并隔离多个体系结构构建的信息元数据(metadata)元数据包括类,菜谱,配置文件和引用构建指令本身的其他信息,以及用于控制构建内容并影响构建方式的数据。OpenEmbeddedCore是一组重要的经过验证的元数据OpenEmbeddedCore是由基础菜谱,类和配置文件组成的元数据包(package)包是软件包,其中包含可执行的二进制文件,库,文档,配置信息和其他文件Yocto项目还使用术语“包”来表示用于建立各自的软件包的菜谱和其他元数据Poky基本级功能参考发行版,Poky用于验证Yocto项目,它也是定制的良好起点,另外Poky是oe-core之上的集成层菜谱(recipe)最常见的元数据形式,类似于Makefile文件。菜谱将包含用于构建包的设置和任务(指令)的列表,然后用于构建二进制映像。菜谱描述了获取源代码的位置以及要应用的补丁。菜谱描述了库或其他配方的依赖关系,以及配置和编译选项。菜谱使用bb文件后缀可扩展软件开发工具包(ESDK)面向应用程序开发人员的自定义SDK,允许他们将库和编程更改合并到映像中,以使其代码可供其他应用程序开发人员使用1.构建主机配置
构建主机要符合如下要求:50GB的磁盘空间;运行一个主流的Linux发行版(Fedora,openSUSE,CentOS,或者Ubuntu),这里运行Ubuntu16.04;Git或者更高版本;tar1.27或者更高版本;Python3.4.0或者更高版本;另外还需要按照如下软件包:$sudoapt-getinstallgawkwgetgit-corediffstatunziptexinfogcc-multilib\build-essentialchrpathsocatcpiopythonpython3python3-pippython3-pexpect\xz-utilsdebianutilsiputils-pinglibsdl1.2-devxterm9.4.2快速构建典型镜像2.使用Git下载Poky克隆Poky仓库$gitclonegit:///pokyCloninginto'poky'...remote:Countingobjects:428632,done.remote:Compressingobjects:100%(101203/101203),done.remote:Total428632(delta320463),reused428532(delta320363)Receivingobjects:100%(428632/428632),153.01MiB|12.40MiB/s,done.Resolvingdeltas:100%(320463/320463),done.Checkingconnectivity...done.进入poky目录,查看所有的tags。$cdpoky$gitfetch--tags$gittag基于yocto-2.6.1版本创建分支:$gitcheckouttags/yocto-2.6.1-bmy-yocto-2.6.13.构建镜像步骤1.初始化构建环境:在poky目录中,运行oe-init-build-env环境设置脚本以在构建主机上定义YoctoProject的构建环境。$cd~/poky$sourceoe-init-build-env###Shellenvironmentsetupforbuilds.###Youcannowrun'bitbake<target>'Commontargetsare:core-image-minimalcore-image-satometa-toolchainmeta-ide-supportYoucanalsorungeneratedqemuimageswithacommandlike'runqemuqemux86'步骤2.检查本地配置文件:在新设置的构建环境里面,该脚本增加了一个conf并且把一个名为local.conf的配置文件放在里面,是构建环境的主要配置文件。步骤3.启动构建:继续使用以下命令为目标构建操作系统镜像,在此示例中使用core-image-sato:
$bitbakecore-image-sato步骤4.使用QEMU模拟镜像:构建此特定镜像后可以启动QEMU,它是Yocto项目附带的QuickEMUlator:
$runqemuqemux86步骤5.退出QEMU:通过单击关闭图标或键入Ctrl-C退出QEMU。4.为特定硬件定制化构建上述讲解已经构建了一个仅适用于仿真的镜像,下面通过在YoctoProject开发环境中添加硬件层来自定义特定硬件的构建:步骤1.查找图层:Yocto项目源存储库有许多硬件层。此示例添加了meta-altera硬件层。步骤2.克隆图层:使用Git在计算机上制作图层的本地副本。$cd~/poky$gitclone/kraj/meta-altera.git步骤3.将配置更改为特定硬件平台的构建
local.conf文件中的MACHINE变量指定构建的硬件平台,将MACHINE变量设置为"cyclone5",使用的配置是:/kraj/meta-altera/blob/master/conf/machine/cyclone5.conf.步骤4.将图层添加到图层配置文件:
在使用图层之前,必须将其添加到bblayers.conf文件中,该文件位于构建目录的conf目录中。使用bitbake-layersadd-layer命令将图层添加到配置文件:$cd~/poky/build$bitbake-layersadd-layer../meta-altera在bblayers.conf文件中查看配置结果:POKY_BBLAYERS_CONF_VERSION="2"BBPATH="${TOPDIR}"BBFILES?=""BBLAYERS?="\/home/h310588/yocto_project/poky/meta\/home/h310588/yocto_project/poky/meta-poky\/home/h310588/yocto_project/poky/meta-yocto-bsp\/home/h310588/yocto_project/poky/meta-altera\"5.创建自己的通用图层使用bitbake-layerscreate-layer命令创建自己的常规图层$cd~/poky$bitbake-layerscreate-layermeta-mylayerNOTE:Startingbitbakeserver...Addyournewlayerwith'bitbake-layersadd-layermeta-mylayer'上述命令自动创建了如下图层目录结构:$treemeta-mylayermeta-mylayer├──conf│└──layer.conf├──COPYING.MIT├──README└──recipes-example└──example└──example_0.1.bb3directories,4files
嵌入式人工智能TensorFlowLitePartFive9.5TensorFlowLite(TFLite)是一个轻量、快速、跨平台的专门针对移动和IoT应用场景的机器学习框架,是开源机器学习平台TensorFlow的重要组成部分。支持安卓、iOS、嵌入式Linux以及MCU等多种平台。TFLite的主要组成部分(1)TFLite模型转换器(converter)。TFLite自带一个转换器,它可以把TensorFlow计算图转换成TFLite专用的模型文件格式,比如SavedModel或GraphDer格式的TensorFlow模型,在此过程中会进行算子融合和模型优化,以压缩模型,提高性能。(2)TFLite解释执行器(interpreter)。进行模型推理的解释执行器,它可以在多种硬件平台上运行优化后的TFLite模型,同时提供了多语言的API,方便使用。(3)算子库(opkernels)。TFLite算子库目前有130个,它与TensorFlow的核心算子库略有不同,并做了移动设备相关的优化。(4)硬件加速代理(hardwareacceleratordelegate)。谷歌将TFLite硬件加速接口称delegate(代理),它可以把模型的部分或全部委托给另一个硬件后台执行,比如GPU和NPU。首先在主机电脑上安装了AndroidStudio通过git下载Tensorflow的完整代码下载地址
/tensorflow/下载MobileNet模型
//models/tflite/mobilenet_v1_224_android_quant_2017_11_08.zip。启动AndroidStudio,点击File菜单下的Open项,在打开的对话框中点击解压得到的Tensorflow文件夹导入官方的demo程序将MobileNet模型解压,得到两个文件,labels.txt和mobilenet_quant_v1_224.tflite,并放进AndroidStudio的app\src\main\assets文件夹。9.5.1TensorFlowLite中使用MobileNet运行,将该示例程序编译并安装到手机上步骤1.在Ubuntu上准备ARM的交叉编译环境,可以通过apt-getinstall在ubuntu上安装交叉编译环境。sudoapt-getinstallg++-arm-linux-gnueabihfsudoapt-getinstall-ygcc-arm-linux-gnueabihf步骤2.下载Tensorflow源码。gitclone/tensorflow/tensorflow9.5.2编译过程步骤3.下载Tensorflow相关依赖包。进入Tensorflow工程的根目录,然后执行下面的脚本./tensorflow/contrib/lite/download_dependencies.sh步骤4.编译TensorflowLite。注意:./tensorflow/contrib/lite/build_rpi_lib.sh中的目标编译平台是ARMV7。#LicensedundertheApacheLicense,Version2.0(the"License");#youmaynotusethisfileexceptincompliancewiththeLicense.#YoumayobtainacopyoftheLicenseat##/licenses/LICENSE-2.0##Unlessrequiredbyapplicablelaworagreedtoinwriting,software#distributedundertheLicenseisdistributedonan"ASIS"BASIS,#WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.#SeetheLicenseforthespecificlanguagegoverningpermissionsand#limitationsundertheLicense.#==============================================================================set-eSCRIPT_DIR="$(cd"$(dirname"${BASH_SOURCE[0]}")"&&pwd)"cd"$SCRIPT_DIR/../../.."#changeCC_PREFIXifuneedCC_PREFIX=arm-linux-gnueabihf-make-j3-ftensorflow/contrib/lite/MakefileTARGET=RPITARGET_ARCH=armv7在根目录下运行上述脚本:./tensorflow/contrib/lite/build_rpi_lib.sh编译结束,会在tensorflow/contrib/lite/gen/lib/rpi_armv7目录下产生libtensorflow-lite.a静态库。步骤5.编译label_imageDemo。修改Makefile把label_image的源码配置到Makefile,修改方式可以参考Makefile里对MINIMALDemo的配置。执行修改后的代码:./tensorflow/contrib/lite/build_rpi_lib.sh在./tensorflow/contrib/lite/gen/bin/rpi_armv8目录下会产生编译好的label_image二进制文件步骤6.拷贝程序到开发案板上准备测试图片tensorflow/contrib/lite/examples/label_image/testdata/grace_hopper.bmp下载测试的tflite模型准备ImageNet的标签文件将文件下载到开发板上Test1.bmp;label_image;labels.txt;mobilenet_v1_1.0_224_quant.tflite/mobilenet_v1_1.0_224.tflite在开发板上运行程序并测试TensorflowLite的性能./label_image-v1-m./mobilenet_v1_1.0_224.tflite-i./test1.bmp-l./labels.txt9.5.3.在ARM开发板上运行TensorflowLiteaveragetime:855.91ms0.860174:653militaryuniform0.0481021:907Windsortie0.00786706:466bulletproofvest0.00644932:514cornet0.00608028:543drumstick再测试量化后的MobileNet效果:./label_image-v4-m./mobilenet_v1_1.0_224_quant.tflite-i./gtest1bmp-l./labels.txtaveragetime:185.988ms0.427451:653militaryuniform0.305882:907Windsortie0.0431373:668mortarboard0.0313726:458bowtie0.0235294:543drumstick0.427451:653militaryuniform0.305882:907Windsortie0.0431373:668mortarboard0.0313726:458bowtie0.0235294:543drumstick
基于“ARM-Linux”的嵌入式WEB服务器设计PartSix9.6Web服务器本质是一个软件,通常在PC机或者工作站上运行。传统Web服务器
传统Web服务器主要用于处理大量客户端的并发访问。嵌入式Web服务器
嵌入式Web服务器是指将Web服务器引入到现场测试和控制设备中,在相应的硬件平台和软件系统的支持下,使传统的测试和控制设备转变为以底层通信协议,Web技术为核心的基于互联网的网络测试和控制设备。选择“ARM-Linux”的模式搭建硬软件平台,为嵌入式Web服务器的实现构建适合的系统环境有何优点?系统平台的搭建主要进行哪两方面的工作?一是基于ARM的嵌入式硬件平台的构建。为何选择ARMCortex-A8芯片S5PV210为核心,构建硬件平台?该平台应具有丰富的外设接口,包括RS232串口、DEBUG口、红外接口、数码管、触摸屏、LCD、按键、JTAG调试口、USBhost/device接口、AC97音频接口、网络接口、无线传感器网络接口等9.6.1系统环境搭建二是嵌入式软件平台的构建。移植开发BootLoader作为系统引导程
选择superboot作为本系统的BootLoader移植Linux内核到硬件平台
采用Linux内核版本为Linux-3.0.8开发移植嵌入式平台上各外设驱动1.嵌入式硬件平台介绍
本设计采用了Samsung公司基于ARMCortex-A8处理器核的S5PV210处理器作为核心处理器,在此基础上采用了“核心板+扩展板”的模式进行硬件平台构建。ARMCortex-A8核心板模块框图2.移植开发BootLoader-superboot的烧写
在Windows7环境下烧写Superboot到SD卡的步骤如下:步骤1:通过管理员身份使用SD-Flasher.exe烧写软件。启动SD-Flasher.exe->“SelectyourMachine…”对话框->选择“Mini210/Tiny210”步骤2:点…按钮找到所要烧写的superboot(注意不要放在中文目录下)步骤3:把FAT32格式的SD卡插入笔记本的卡座,也可以使用USB读卡器连接普通的PC,请务必先备份卡中的数据,点“Scan”,找到的SD卡就会被列出步骤4:再点“ReLayout”,会跳出一个提示框,提示SD卡中的所有数据将会丢失,点“Yes”,开始自动分割,分割完毕,回到SD-Flasher主界面步骤5:点“Fuse”,superboot就会被安全地烧写到SD卡的无格式区中3.建立Linux开发环境
Linux下开发环境的建立主要就是建立交叉编译环境,也就是在ubuntu系统或者Fedora系统里面建立一个能编译arm-Linux内核及驱动、应用程序等开发环境。
本设计使用的是arm-Linux-gcc-4.5.1,它在编译内核时会自动采用armv7指令集,支持硬浮点运算步骤1:将arm-Linux-gcc-4.5.1-v6-vfp-20101303.tgz复制到Fedora14某个目录下如tmp/,然后进入到该目录,执行解压命令:
#cd/tmp
#tarxvzfarm-Linux-gcc-4.5.1-v6-vfp-20101303.tgz–C/
将把arm-Linux-gcc安装到/opt/A8/toolschain/4.5.1目录步骤2:把编译器路径加入系统环境变量,运行命令
#gedit/root/.bashrc编辑/root/.bashrc文件,保存退出步骤3:配置PC机Linux的FTP服务,使用“redhat-config-services”命令,打开系统服务配置窗口,然后在左侧找到“vsftpd”选项,并选中它,然后保存设置。步骤4:配置PC机Linux的Telnet服务,和配置NFS服务相同,使用“redhat-config-services”命令,打开系统服务配置窗口,然后在左侧找到“telnet”选项,并选中它,然后保存设置
Web服务器监听用户端的服务请求,根据用户请求的类型提供相应的服务;用户端使用Web浏览器和Web服务器通信,Web服务器在接收到用户端的请求后,处理用户请求并返回需要的数据。9.6.2Web服务器原理1.HTTP协议
Web服务器与浏览器通信的协议,规定了发送和处理请求的标准方式,规定了浏览器和服务器之间传输的消息格式及各种控制信息,从而定义了所有Web通信的基本框架。HTTP事务流程2.CGI原理
CGI(CommonGatewayInterface,通用网关接口)规定了Web服务器调用其他可执行程序(CGI程序)的接口协议标准,CGI程序一般完成Web网页中表单(Form)数据的处理、数据库查询和实现与传统应用系统的集成等工作。Web服务器通过调用CGI程序实现和Web浏览器的交互。CGI原理图1.嵌入式WEB服务器的工作流程9.6.3嵌入式WEB服务器设计2.嵌入式WEB服务器选择ARM-Linux下主要有三个Web服务器:httpd、thttpd和boa。Httpd是最简单的一个Web服务器,它的功能最弱,不支持认证,不支持CGI,Thttpd和boa都支持认证,都支持CGI等,boa的功能更全,应用范围更广。本例通过移植boaWeb服务器来实现嵌入式Web服务器功能。CGI程序通常分为以下两部分:根据POST方法或GET方法从提交的表单中接收数据。用printf()函数来产生HTML源代码,并将经过解码后的数据正确地返回给浏览器。3.CGI程序设计CGI程序由客户端软件发送的基于HTTP协议的请求和命令触发,将客户端的请求和命令传给服务器端相应的应用程序;在服务器端相关的程序完成相应操作后,CGI程序通过标准的输出流以打印输出的形式将结果返回给客户端。CGI程序主要分为以下几部分:(1)接收客户端提交的数据。(2)URL编码的解码。(3)根据上一部分解析出来的变量/值对,判断客户端请求的含义,利用Linux下进程间通信机制传送消息给相应的应用程序主进程,以完成客户端请求要完成的任务。4.Web服务器的配置Boa的开发和测试目前主要是基GNU/Linux/1386。Boa的源程序是从boa.c中的main()主函数开始执行。在该源程序中,先是对该Web服务器进行配置:为了在用户访问Web时服务器能确定根目录的位置,首先需要指定服务器的根目录路径服务器,fixup_server_root()函
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 无锡市滨湖区2026年初三第一次联考试卷(化学试题文)试题含解析
- 2026年山东省宁阳县市级名校重庆一中初三4月月考化学试题含解析
- 湖北省武汉市青山区5月2026年初三下学期期初联考化学试题试卷含解析
- 江苏省南通通州区重点中学2025-2026学年初三月考(七)生物试题含解析
- 2026届贵州省桐梓县联考初三学情摸底化学试题含解析
- 2026年长三角养老托育公共服务资源共享与标准互认指南
- 2025-2026学年浙江省杭州市建兰中学第二学期期末考试初三生物试题含解析
- 2026年医学影像前处理与流程优化软件分类界定
- 2026年工业互联网安全分类分级管理与数据安全合规指南
- 2025年临床执业《外科学》题集
- 部编版五年级道德与法治下册各单元测试卷及期末测试卷共7套(含答案)
- 2026浙江绍兴理工学院招聘32人笔试备考题库及答案解析
- 宁德时代入职测评题
- 《银行会计(第四版)》全套教学课件
- (自2026年1月1日起施行)《增值税法实施条例》的重要变化解读
- 个体化疫苗研发中的成本效益:精准分析
- 2025福建泉州丰泽城市建设集团有限公司招聘第二批招商专员复试及环节人员笔试历年难易错考点试卷带答案解析
- DB34∕T 5013-2025 工程建设项目招标代理规程
- 2026年江西司法警官职业学院单招职业技能考试题库及答案1套
- 去极端化宣传课件
- ERAS理念下术后早期活动的护理方案
评论
0/150
提交评论