Linux人工智能开发实例 课件全套 第1-7章 嵌入式Linux系统概述-AI人脸智能识别Linux开发案例_第1页
Linux人工智能开发实例 课件全套 第1-7章 嵌入式Linux系统概述-AI人脸智能识别Linux开发案例_第2页
Linux人工智能开发实例 课件全套 第1-7章 嵌入式Linux系统概述-AI人脸智能识别Linux开发案例_第3页
Linux人工智能开发实例 课件全套 第1-7章 嵌入式Linux系统概述-AI人脸智能识别Linux开发案例_第4页
Linux人工智能开发实例 课件全套 第1-7章 嵌入式Linux系统概述-AI人脸智能识别Linux开发案例_第5页
已阅读5页,还剩324页未读 继续免费阅读

下载本文档

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

文档简介

第1章嵌入式Linux系统概述第1章嵌入式Linux系统概述

1.1嵌入式系统概述嵌入式系统概述随着计算机技术的飞速发展和嵌入式微处理器的出现,计算机应用出现了历史性的变化,并逐渐形成了计算机系统的两大分支:通用计算机系统和嵌入式计算机系统。嵌入式系统早期曾被称为嵌入式计算机系统或隐藏式计算机,随着半导体技术及微电子技术的快速发展,嵌入式系统得以风靡式发展,性能不断提高,以致出现一种观点,即嵌入式系统通常是基于32位微处理器设计的,往往带操作系统,本质上是瞄准高端领域和应用的。然而随着嵌入式系统应用的普及,这种高端应用系统和之前广泛存在的单片机系统间的本质联系,使嵌入式系统与单片机毫无疑问地联系在了一起。1.1.1嵌入式系统概述嵌入式系统概述嵌入式系统是先进的计算机技术、半导体技术和电子技术与各个行业的具体应用相结合的产物,这决定了它是技术密集、资金密集、知识高度分散、不断创新的集成系统。同时,嵌入式系统又是针对特定的应用需求而设计的专用计算机系统,这也决定了它必然有自己的特点。不同嵌入式系统的具有一定差异,一般来说,嵌入式系统有以下特点:(1)软/硬件资源有限。过去只在个人计算机PC中安装的软件现在也出现在复杂的嵌入式系统中。(2)集成度高、可靠性高、功耗低。(3)有较长的生命周期。嵌入式系统通常与所嵌入的宿主设备具有相同的使用寿命。(4)软件程序存储(固化)在存储芯片上,开发者通常无法改变。(5)嵌入式系统是计算机技术、半导体技术、电子技术和各个行业的应用相结合的产物。(6)一般来说,嵌入式系统并非总是独立的设备,而是作为某个更大型计算机系统的辅助系统。(7)嵌入式系统通常都与真实物理环境相连,并且是激励系统。激励系统处在某一状态,并且等待着输入或激发信号,从而完成计算并输出更新的状态。1.1.1嵌入式系统概述

嵌入式系统的特点嵌入式系统概述嵌入式系统一般由硬件系统和软件系统两大部分组成。其中,硬件系统包括嵌入式微处理器、外设和必要的外围电路;软件系统包括嵌入式操作系统和应用软件。常见嵌入式系统的组成如图所示。1.1.1嵌入式系统概述

嵌入式系统的组成嵌入式系统概述硬件系统(1)嵌入式微处理器。嵌入式微处理器是嵌入式系统硬件系统的核心,早期嵌入式系统的嵌入式微处理器由(甚至包含几个芯片的)微处理器来担任,而如今的嵌入式微处理器一般采用IC(集成电路)芯片形式,可以是ASIC(专用集成电路)或者SoC中的一个核。核是VLSI(超大规模集成电路)上功能电路的一部分。嵌入式微处理器芯片有如下几种:微处理器、微控制器、数字信号微处理器(DSP)、片上系统和多微处理器和多核微处理器。(2)外设。外设包括存储器、I/O接口等辅助设备。尽管MCU已经包含了大量外设,但对于需要更多I/O端口和更大存储能力的大型系统来说,还需要连接额外的I/O端口和存储器,用于扩展其他功能和提高性能。1.1.1嵌入式系统概述

嵌入式系统的组成嵌入式系统概述软件系统嵌入式软件系统可以分成有操作系统和无操作系统两大类,嵌入式的高级应用,多任务成为基本需求,因此操作系统也是嵌入式系统中的必要组成部分,用于协调多任务。此外,嵌入式软件中用到的高级语言有:C语言、C++和Java等编程语言。嵌入式软件系统由应用程序、API、嵌入式操作系统等软件组成,解决一些在大型计算机软件中不存在的问题:因经常同时完成若干任务,必须能及时响应外部事件,能在无人干预的条件下处理所有异常和突发情况。1.1.1嵌入式系统概述

嵌入式系统的组成第1章嵌入式Linux系统概述

1.2嵌入式Linux技术嵌入式系统概述Linux是一种类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统,支持32位和64位硬件,Linux继承了Unix以网络为核心的设计思想,是一种性能稳定的多用户网络操作系统。特点如下:1.2.1Linux简介(1)Linux由众多微内核组成,其源代码完全开源;(2)Linux继承了Unix的特性,具有非常强大的网络功能,其支持所有的因特网协议,包括TCP/IPv4、TCP/IPv6和链路层拓扑程序等,且可以利用Unix的网络特性开发出新的协议栈;(3)Linux系统工具链完整,简单操作就可以配置出合适的开发环境,可以简化开发过程,减少开发中仿真工具的障碍,使系统具有较强的移植性;嵌入式系统概述在Linux内核的发展过程中,各种Linux发行版本推动了Linux的应用,从而让更多的人开始关注Linux。Linux的各个发行版本使用的是同一个Linux内核,因此在内核层不存在什么兼容性问题,每个版本有不一样的感觉,只在发行版本的最外层才有所体现。几款常用的Linux发行版本介绍如下:1.2.2Linux发行版(1)RedHatLinuxRedHat公司的产品主要包括RHEL(RedHatEnterpriseLinux)和CentOS(RHEL的社区克隆版本)、FedoraCore(由RedHat桌面版发展而来)。(2)UbuntuLinuxUbuntu基于DebianLinux发展而来,界面友好,容易上手,对硬件的支持非常全面,适合做桌面系统。(3)SuSELinuxSuSELinux以SlackwareLinux为基础,1994年发行了第一版,2004年被Novell公司收购后,成立了OpenSUSE社区,推出了社区版本OpenSUSE。SuSELinux可以与Windows的交互,拥有界面友好的安装过程、图形管理工具。(4)GentooLinuxGentoo最初由DanielRobbins创建,首个稳定版本发布于2002年。嵌入式系统概述利用Linux其自身的许多特点,把它应用到嵌入式系统里,这是Linux做嵌入式的优势。(1)Linux开放源代码,众多Linux爱好者又是Linux开发者的强大技术支持;(2)Linux的内核小、效率高,内核的更新速度很快,linux是可以定制的,其系统内核最小只有约134KB。(3)Linux免费开源,在价格上极具竞争力。Linux还有着嵌入式操作系统所需要的很多特色,Linux适应于多种CPU和多种硬件平台,是一个跨平台的系统,且性能稳定,裁剪性很好,开发和使用都很容易。Linux对最常用的TCP/IP协议有最完备的支持。1.2.3嵌入式Linux技术嵌入式系统概述自从20世纪70年代微处理器诞生后,将计算机技术、半导体技术和微电子技术等融合在一起的专用计算机系统,即嵌入式系统,已广泛地应用于家用电器、航空航天、工业、医疗、汽车、通信、信息技术等领域。各种各样的嵌入式系统和产品在应用数量上已远远超过通用计算机,从日常生活、生产到社会的各个角落,可以说嵌入式系统无处不在。与人们生活紧密相关的几个应用领域列举如下。1.2.4嵌入式技术的应用(1)消费类电子产品应用。嵌入式系统在消费类电子产品应用领域的发展最为迅速,而且在这个领域中的嵌入式微处理器的需求量也是最大的。由嵌入式系统构成的消费类电子产品已经成为生活中必不可少的一部分,如智能冰箱、流媒体电视等信息家电产品,以及智能手机、PDA、数码相机、MP3、MP4等。(2)智能仪器仪表类应用。这类产品可能离日常生活有点距离,但是对于开发人员来说,却是实验室里的必备工具,如网络分析仪、数字示波器、热成像仪等。通常这些嵌入式设备中都有一个应用微处理器和一个运算微处理器,可以完成数据采集、分析、存储、打印、显示等功能。(3)通信信息类产品应用。这些产品多数应用于通信机柜设备中,如路由器、交换机、家庭媒体网关等,在民用市场使用较多的莫过于路由器和交换机了。基于网络应用的嵌入式系统也非常多,目前市场发展较快的是远程监控系统等在监控领域中应用的系统。嵌入式系统概述1.2.4嵌入式技术的应用(4)过程控制类应用。过程控制类应用主要是指在工业控制领域中的应用,包括对生产过程中各种动作流程的控制,如流水线检测、金属加工控制、汽车电子等。汽车工业在中国已取得了飞速的发展,汽车电子也在这个大发展的背景下迅速成长。现在,一辆汽车中往往包含有上百个嵌入式系统,它们通过总线相连,实现对汽车各部分的智能控制;车载多媒体系统、车载GPS导航系统等,也都是典型的嵌入式系统应用。(5)航空航天类应用。不仅在低端的民用产品中,在像航空航天这样的高端应用的中同样需要大量的嵌入式系统,如火星探测器、火箭发射主控系统、卫星信号测控系统、飞机的控制系统、探月机器人等。我国的探月工程中“嫦娥三号”的探月工程车就是最好的证明。(6)生物微电子类应用。在指纹识别、生物传感器数据采集等应用中也广泛采用了嵌入式系统。环境监测已经成为人类必须面对的问题,随着技术的发展,将来的空气中、河流中可以用大量的微生物传感器实时地监测环境状况,而且还可以把这些数据实时地传送到环境监测中心,以监测整个生活环境,避免发生更深层次的环境污染。这也许就是将来围绕在人们生存环境周围的一个无线环境监测传感器网络。嵌入式系统概述1.2.4嵌入式技术的应用(7)嵌入式人工智能技术。深度学习功能已经在许多嵌入式视觉应用中得到应用。所有这些应用程序的共同点是它们通常会生成大量数据,并且经常涉及非工业场景,例如自动驾驶。相关车辆已经配备了许多传感器和摄像头,可以从当前的交通状况中收集数字数据。集成视觉软件借助深度学习算法实时分析数据流。基于深度学习的嵌入式视觉技术也用于智能城市环境中。在城市某些基础设施过程,如街道交通,照明和电力供应,以数字网络化,以便为居民提供特殊服务。最后用于智能家居应用,例如,数字语音助手和机器人真空吸尘器。第2章音频分析系统Linux开发案例音频分析系统Linux开发案例本章分析Linux技术在音频分析系统中的应用,共分2个模块:1.系统总体设计与Linux驱动开发:先进行系统总体设计分析,分析点阵屏和OLED的Linux驱动开发,并实现显示模块驱动开发与测试。2.

音频分析系统开发:分析音频频谱分析和功能开发,音频处理功能开发和上位机控制应用开发,并实现音频分析显示。第2章音频分析系统Linux开发案例

2.1总体设计与Linux驱动开发音频分析系统Linux开发案例声音频谱分析是考虑人耳对不同频率成分的声音的感受的不同,进而通过傅里叶变换等获得其准确频谱特性的技术。声压频谱分析是后续声学分析的基础,同时在声学测量,噪声污染,健康医疗,降噪减噪,故障诊断,国防建设等中都具有重要的应用。本项目从理论分析到硬件及算法设计,分别介绍了基于嵌入式系统的音频分析系统的实现过程。提出了一套精度较高,运算量较小,实时性较好,可操作性较强的声学频谱分析方案。本系统对基于嵌入式系统的声压频率计权、频谱分析进行了简单的分析,首先介绍了基于卷积的频率计权实现及基于傅里叶变换、快速傅里叶变换的声音频谱分析方法。2.1.1系统总体设计分析

系统需求分析功能功能说明音频采集功能通过边缘计算网关上的麦可风实时采集音频数据音频频谱分析功能对采集音频数据进行频谱分析频谱实时动态显示功能通过扩展板的点阵屏与OLED屏动态显示频率变化Android应用控制功能通过Android应用程序对系统功能进行切换与硬件测试音频分析系统Linux开发案例音频分析显示系统,其硬件主要由边缘计算网关和Arm扩展模块构成,通过边缘计算网关上的麦可风实时采集音频数据,采集的数据分析处理后由Arm扩展模块显示频谱变化,Android手机可以对设备进行相关的功能切换与控制,硬件结构框图如图所示。2.1.1系统总体设计分析

系统总体设计音频分析系统Linux开发案例音频分析显示系统,软件结构框图如图所示。2.1.1系统总体设计分析

系统总体设计音频分析系统Linux开发案例边缘计算网关采用工业级铝合金一体屏设计,AI嵌入式边缘计算处理器RK3399,4G+16G内存配置,10寸高清电容屏,运行ubuntu、android多操作系统系统,如图所示。2.1.2开发平台音频分析系统Linux开发案例边缘计算网关提供丰富的外设接口,易于功能扩展,方便开发调试,如图所示。2.1.2开发平台智能边缘计算网关系统启动进入Ubuntu操作系统界面,如图所示。音频分析系统Linux开发案例本项目开发时需要连接ARM扩展模块,首先从ARM扩展模块上拆下STM32核心板,然后将ARM扩展模块与网关的EXT接口连接。连接完成的示意如图所示。2.1.2开发平台音频分析系统Linux开发案例扩展板上的点阵屏需要HT16K33驱动芯片进行控制驱动。HT16K33是一款存储器映射和多功能LED控制驱动芯片。该芯片支持最大128点的显示模式(16SEGs×8COMs)以及最大13×3的按键矩阵扫描电路。HT16K33的软件配置特性使其适用于多种LED应用,包括LED模块和显示子系统。HT16K33通过双向I2C接口可与大多数微控制器进行通信。2.1.3点阵屏Linux驱动开发

点阵屏硬件原理音频分析系统Linux开发案例显示存储器–RAM结构●16×8位静态RAM用于存储LED显示数据。对RAM中的某一个位写“1”则相对应的LEDROW点亮,写“0”则相对应的LEDROW熄灭。●RAM地址与行输出一一对应,一个RAM字中的每个位与纵列输出一一对应。RAM与LED的映射关系如表2.2所示。2.1.3点阵屏Linux驱动开发

点阵屏硬件原理COMROW0~ROW7ROW8~ROW15COM000H01HCOM102H03HCOM204H05HCOM306H07HCOM408H09HCOM50AH0BHCOM60CH0DHCOM70EH0FHi2c数据字节D7D6D5D4D3D2D1D0ROW7654321015141312111098音频分析系统Linux开发案例linux内核和芯片提供商为I2C设备的驱动程序提供了I2C驱动的框架,以及框架底层与硬件相关的代码的实现(完整流程图请查看文档)。剩下的就是针对挂载在I2C两线上的I2C设备了device,而编写的即具体设备驱动了,这里的设备就是硬件接口外挂载的设备,而非硬件接口本身(soc硬件接口本身的驱动可以理解为总线驱动)2.1.3点阵屏Linux驱动开发

点阵屏Linux驱动程序音频分析系统Linux开发案例从i2c驱动架构图中可以看出,linux内核对i2c架构抽象了一个叫核心层core的中间件,它分离了设备驱动devicedriver和硬件控制的实现细节,core层不但为上面的设备驱动提供封装后的内核注册函数,而且还为小面的硬件事件提供注册接口,core层起到了承上启下的作用。开发I2C驱动时,有4个步骤,前2个步骤属于I2C总线驱动,后面2个步骤属于I2C设备驱动。过程如下:2.1.3点阵屏Linux驱动开发

点阵屏Linux驱动程序(1)提供I2C适配器的硬件驱动,探测,初始化I2C适配器,驱动CPU控制的I2C适配器从硬件上产生。(2)提供I2C控制的algorithm,用具体适配器的xxx_xfer()函数填充i2c_algorithm的master_xfer指针,并把i2c_algorithm指针赋给i2c_adapter的algo指针。(3)实现I2C设备驱动中的i2c_driver接口,用具体yyy的yyy_probe(),yyy_remove(),yyy_suspend(),yyy_resume()函数指针和i2c_device_id设备ID表赋给i2c_driver的probe,remove,suspend,resume和id_table指针。(4)实现I2C设备所对应类型的具体驱动,i2c_driver只是实现设备与总线的挂接。音频分析系统Linux开发案例i2c设备注册主要定义一些结构体和使用一些API函数。1)在Linux驱动中I2C系统中主要包含以下几个成员:2.1.3点阵屏Linux驱动开发

点阵屏Linux驱动程序2)板级信息里应该包含I2C的地址和设备名:示例:#defineDEVICE_NAME "ht16k33"#ifDEVICE_RS#defineDEV_I2C_BUS2#defineDEV_I2C_ADDRESS(0xE0>>1)structi2c_board_infoinfo;memset(&info,0,sizeof(structi2c_board_info));info.addr=DEV_I2C_ADDRESS;strcpy(info.type,DEVICE_NAME);音频分析系统Linux开发案例i2c设备注册主要定义一些结构体和使用一些API函数。3)i2c_get_adapter函数说明:获取adapter总线上的相应的I2C设备,参数是设备号,举例如下:2.1.3点阵屏Linux驱动开发

点阵屏Linux驱动程序#defineDEV_I2C_BUS2adapter=i2c_get_adapter(DEV_I2C_BUS);if(adapter==NULL){return-ENODEV;}i2c_get_adapt、r和i2c_new_device配合使用:adapter=i2c_get_adapter(DEV_I2C_BUS);if(adapter==NULL){return-ENODEV;}client=i2c_new_device(adapter,&info);i2c_put_adapter(adapter);if(client==NULL){return-ENODEV;}音频分析系统Linux开发案例i2c读写接口1)设备读写的实现设备读写分为两类,一类是写命令,一类是写数据,都是通过i2c_master_send函数来实现。2)i2c_master_send函数的使用2.1.3点阵屏Linux驱动开发

点阵屏Linux驱动程序3)写命令函数:其实也是调用i2c_master_send函数,比如下面的这个:i2c_master_send(new_client,write_data,2);//向new_client发送write_data内数据先发命令,后数据,2表示发送的大小。staticintht16k33_write_command(charc){ returni2c_master_send(i2c_dev,&c,1);}

音频分析系统Linux开发案例4)写数据函数:其实也是调用i2c_master_send函数,比如下面的这个:2.1.3点阵屏Linux驱动开发

点阵屏Linux驱动程序staticintht16k33_write_cmd_data(charc,chard){ charv[]={c,d}; returni2c_master_send(i2c_dev,v,2);}staticintht16k33_flush(void){ intr; charbuf[17]; buf[0]=0; memcpy(buf+1,led_buf,16); r=i2c_master_send(i2c_dev,buf,17); printk(KERN_ERR"wr%d\n",r); returnr;}

(点阵驱动代码详细请查看文档)音频分析系统Linux开发案例点阵屏驱动主要实现对硬件设备的基本控制,具体的功能要由上层应用调用驱动提供的接口对设备进行控制。点阵屏应用功能函数说明如表所示。2.1.3点阵屏Linux驱动开发

点阵屏Linux应用程序函数名称参数说明函数功能voidled8x8Init(void)无点阵屏初始化staticvoiddumRam(void)无点阵屏显示Ram数组内容voidled8x8Brightness(intb)b:亮度值点阵屏亮度控制voidled8x8Point(intx,inty,intst)x:行坐标y:列坐标点阵屏设置指定坐标数据voidled8x8Draw(char*buf)buf:显示缓冲区点阵屏Ram数组从缓冲区取值voidled8x8Clear(void)无点阵屏清屏voidled8x8Flush(void)无点阵屏刷新显示内容(led8x8.c程序源码详细请查看文档)音频分析系统Linux开发案例点阵屏应用功能,流程分析:1)led8x8Init()初始化点阵屏硬件;2)led8x8Face(i)设置要显示的第i类笑脸坐标数据3)led8x8Flush()点阵屏刷新显示4)sleep(2)休眠2秒钟5)i值在faces数组有效范围内加16)返回到2)步骤循环执行2.1.3点阵屏Linux驱动开发

点阵屏Linux应用程序(Led8x8Test.c源码详细请查看文档)音频分析系统Linux开发案例1、基本结构

OLED器件由基板、阴极、阳极、空穴注入层(HIL)、电子注入层(EIL)、空穴传输层(HTL)、电子传输层(ETL)、电子阻挡层(EBL)、空穴阻挡层(EBL)、发光层(EML)等部分构成。基板是整个器件的基础,所有功能层都需要蒸镀到器件的基板上;通常采用玻璃作为器件的基板。阳极与器件外加驱动电压的正极相连,阳极中的空穴在外加驱动电压的驱动下向器件中的发光层移动,阳极需要在器件工作时具有一定的透光性,使得器件内部发出的光能够被外界观察到,阳极最常使用的材料是氧化铟锡ITO。空穴注入层可以使来自阳极的空穴顺利地注入空穴传输层;空穴传输层负责将空穴传输到发光层;电子阻挡层会把来自阴极的电子阻挡在器件的发光层界面处,从而增大器件发光层界面处电子的浓度。2.1.4OLEDLinux驱动开发OLED的基本结构和发光原理音频分析系统Linux开发案例1、基本结构OLED器件的结构可分为单层结构、双层结构、三层结构和多层结构。单层结构只包含基板、阳极、阴极和发光层的结构,由于OLED器件中的材料对电子和空穴有不同的传输能力,该结构会使得电子和空穴在发光层界面处的浓度差别很大,导致OLED器件的发光效率较低。双层结构是指发光层除了具有电子和空穴先通过再结合形成激子然后通过激子退激发光的作用,还具有传输电子或传输空穴的作用。

三层结构是指器件结构中一般包含有阴极、电子传输层、发光层、空穴传输层、阳极和基板的OLED器件;三层结构的OLED器件具有更高的电子和空穴传输能力,发光效率也更高。多层结构是指OLED器件除具了有三层结构所具有的功能层,还具有电子注入层、空穴注入层、电子阻挡层和空穴阻挡层;由于更多功能层的加入,OLED器件的发光效率更高,但由于器件的厚度增加,需要更高的驱动电压才能正常工作。2.1.4OLEDLinux驱动开发OLED的基本结构和发光原理音频分析系统Linux开发案例2.发光原理OLED是一种在外加驱动电压下可主动发光的器件,无须背光源。OLED基本驱动原理:OLED器件中的电子和空穴在外加驱动电压的驱动下,从器件的两极向中间的发光层移动,到达发光层后,在库仑力的作用下,电子和空穴进行再结合形成激子,激子的产生会活化发光层的有机材料,进而使得有机分子最外层的电子突破最高占有分子轨道(HOMO)能级和最低未占有分子轨道(LUMO)能级之间的能级势垒,从稳定的基态跃迁到极不稳定的激发态,处于激发态的电子的状态极不稳定,会通过内转换回到LUMO能级。2.1.4OLEDLinux驱动开发OLED的基本结构和发光原理音频分析系统Linux开发案例

OLED器件的驱动方式分为主动式驱动(有源驱动)和被动式驱动(无源驱动)。1.无源驱动无源驱动分为静态驱动和动态驱动。(1)静态驱动:在静态驱动的OLED器件上,一般采用共阴极连接方式,有机电致发光像素的阴极是连在一起引出,阳极是分立引出。若要驱动器件发光,只要让恒流源的电压与阴极的电压之差大于驱动电压,正向导通后将发光;若要器件不发光,将阳极接在一个负电压上,反向截止后不能发光。如果图像变化比较多时,会出现交叉效应,为了避免这种现象,需要采用交流的形式。静态驱动一般用于段式显示屏的驱动。(2)动态驱动:在动态驱动时,器件的两个电极做成了矩阵结构,水平一组显示像素的相同性质的电极共用,纵向一组显示像素的相同性质的电极共用。如果器件可分为N行和M列,行和列分别对应发光像素的阴极和阳极。在实际驱动时,要逐行点亮或者要逐列点亮像素,一般采用逐行扫描的方式。2.1.4OLEDLinux驱动开发OLED器件的驱动方式音频分析系统Linux开发案例2.有源驱动有源驱动的每个像素都配备了具有开关功能的低温多晶硅薄膜晶体管(TFT),而且每个像素都配备了一个电荷存储电容,外围驱动电路和显示阵列集成在同一玻璃基板上。由于LCD采用电压驱动,OLED却依赖电流驱动,因此与LCD相同的TFT结构,无法用于OLED,需要能让足够电流通过导通阻抗较小的小型驱动TFT。有源驱动属于静态驱动,可进行100%的负载驱动,且不受扫描电极数的限制,可以独立地对每个像素进行选择性调节。有源驱动无占空比问题,易于实现高亮度和高分辨率,由于有源驱动可以对红色像素和蓝色像素独立地进行灰度调节,更有利于OLED彩色化实现。2.1.4OLEDLinux驱动开发OLED器件的驱动方式音频分析系统Linux开发案例

本项目采用了SSD1306OLED,是一个单片OLED/PLED驱动芯片,可以驱动有机/聚合发光二极管点阵图形显示系统,由128列和64行组成,该芯片专为共阴极OLED面板设计。SSD1306中嵌入了对比度控制器、显示RAM和晶振,从而减少了外部器件和功耗,有256级亮度控制。

数据/命令的发送有三种接口可选择:6800/8000、I2C或SPI,本节采用I2C接口,驱动指令如表所示。2.1.4OLEDLinux驱动开发OLED硬件音频分析系统Linux开发案例

2.1.4OLEDLinux驱动开发OLED硬件音频分析系统Linux开发案例

2.1.4OLEDLinux驱动开发OLED硬件音频分析系统Linux开发案例

2.1.4OLEDLinux驱动开发OLED硬件OLED显示技术具有自发光的特性,采用非常薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且OLED显示屏幕可视角度大,并且能够节省电能,从2003年开始这种显示设备在MP3播放器上得到了应用。0.96寸OLED显示屏接口定义如表所示。引

脚符

号引

脚符

号引

脚符

号1GND2C2P3C2N4C1P5C1N6VDDB7NC8VSS9VDD10BS011BS112BS213CS#14RES#15D/C#16R/W#17E/RD#18D019D120D221D322D423D524D625D726IREF27VCOMH28VCC29VLSS30GND音频分析系统Linux开发案例

2.1.4OLEDLinux驱动开发OLED硬件OLED驱动方式:模块的通信接口是通过BS0,BS1,BS2三个管脚来配置的。项目中使用i2c接口进行开发,如表所示。通信方式BS0BS1BS2i2c0103线SPI1004线SPI0008-bit68XX并口0018-bit80XX并口011音频分析系统Linux开发案例

2.1.4OLEDLinux驱动开发OLED硬件OLED原理图SCL,SDA对应的是I2C总线2,OLED起始地址0x39。主要是通过SDA,SCL引脚进行通信i2c通信,通过写命令,写数据对显示器进行控制,如图所示。音频分析系统Linux开发案例

2.1.4OLEDLinux驱动开发OLEDLinux驱动程序开发I2C驱动时,有4个步骤,前2个步骤属于I2C总线驱动,后面2个步骤属于I2C设备驱动。过程如下(具体步骤与LCD类似,请查看源文档):(1)提供I2C适配器的硬件驱动,探测,初始化I2C适配器,驱动CPU控制的I2C适配器从硬件上产生。(2)提供I2C控制的algorithm,

用具体适配器的xxx_xfer()函数填充i2c_algorithm的master_xfer指针,并把i2c_algorithm指针赋给i2c_adapter的algo指针。(3)实现I2C设备驱动中的i2c_driver接口,用具体yyy的yyy_probe(),yyy_remove(),yyy_suspend(),yyy_resume()函数指针和i2c_device_id设备ID表赋给i2c_driver的probe,remove,suspend,resume和id_table指针。(4)实现I2C设备所对应类型的具体驱动,i2c_driver只是实现设备与总线的挂接。(OLED驱动源码详细请查看文档)音频分析系统Linux开发案例

2.1.4OLEDLinux驱动开发OLEDLinux应用程序OLED屏驱动主要实现对硬件设备的基本控制,具体的功能要由上层应用调用驱动提供的接口对设备进行控制。OLED屏应用功能函数说明如表所示。(oled源码源码详细请查看文档)函数名称参数说明函数功能voidoledInit(void)无OLED屏初始化staticvoiddumRam(void)无OLED屏显示Ram数组内容voidoledPoint(intx,inty,intst)x:行坐标y:列坐标OLED屏设置指定坐标数据voidoledDraw(char*buf)buf:显示缓冲区OLED屏Ram数组从缓冲区取值voidoledClear(void)无OLED屏清屏voidoledFlush(void)无OLED屏刷新显示内容音频分析系统Linux开发案例

2.1.4OLEDLinux驱动开发OLEDLinux应用程序oled应用功能,流程分析:1)oledInit()初始化点阵屏硬件;2)fontShow16(16,8,"Welcome!",oledPoint)设置要显示的坐标与字符数据3)oledFlush()刷新显示(oled源码源码详细请查看文档)#include<unistd.h>#include<math.h>#include<stdlib.h>#include"oled.h"#include"utils.h"#include"font.h"intmain(intargc,char*argv[]){ oledInit(); fontShow16(16,8,"Welcome!",oledPoint); oledFlush(); return0;}音频分析系统Linux开发案例

2.1.5开发实践:显示模块驱动开发与测试1、ARM扩展模块硬件连接从ARM扩展模块上拆下STM32核心板,然后将ARM扩展模块与网关连接,如图2.4所示,框线内为网关的ARM扩展模块接口(EXT)。使用交叉网线连接边缘计算网关(LAN口)和PC,使网关、PC、虚拟机处于统一网段。音频分析系统Linux开发案例

2.1.5开发实践:显示模块驱动开发与测试2、点阵屏驱动开发1)硬件原理图音频分析系统Linux开发案例

2.1.5开发实践:显示模块驱动开发与测试2、点阵屏驱动开发2)硬件说明:点阵屏通过HTML6K33芯片进行驱动,使用i2c接口。3)首先建立交叉编译开发环境,内核必须是被编译过的,如果已经建立好了,就不需要再建立了。然后将“FFTDriver”目录下的ht16k33Driver文件夹拷贝到Linux开发主机中当前用户文件夹。4)打开终端,进行驱动源码目录,输入make命令,进行编译(Makefile文件中kernel源码目录要确认无误,否则会编译报错)。编译完成后会生成ht16k33.ko文件。5)通过Moba软件将成生的驱动程序ht16k33.ko文件复制到边缘计算网关。通过sudoinsmodht16k33.ko加载驱动。test@rk3399:~$lsht16k33.koht16k33.kotest@rk3399:~$sudoinsmodht16k33.ko6)如果驱动加载成功,可以在/sys目录查看驱动信息。test@rk3399:~$ls/sys/bus/i2c/devices/i2c-2/2-0070/brightnessbufferdrivermodaliasnamepowersubsystemueventtest@rk3399:~$cat/sys/bus/i2c/devices/i2c-2/2-0070/modaliasi2c:ht16k33音频分析系统Linux开发案例

2.1.5开发实践:显示模块驱动开发与测试3、点阵屏应用开发与测试1)通过Moba软件将“FFTDriver”目录下的ht16k33App文件夹复制到边缘计算网关。2)在应用程序源码目录进行编译,编译成功生成测试程序。test@rk3399:~/work/led8x8$lsled8x8.cled8x8.hled8x8Test.cutils.cutils.htest@rk3399:~/work/led8x8$gccled8x8.cutils.cled8x8Test.c-oled8x8Testtest@rk3399:~/work/led8x8$sudo./led8x8Test音频分析系统Linux开发案例

2.1.5开发实践:显示模块驱动开发与测试3、点阵屏应用开发与测试1)通过Moba软件将“FFTDriver”目录下的ht16k33App文件夹复制到边缘计算网关。2)在应用程序源码目录进行编译,编译成功生成测试程序。(运行效果如下图)test@rk3399:~/work/led8x8$lsled8x8.cled8x8.hled8x8Test.cutils.cutils.htest@rk3399:~/work/led8x8$gccled8x8.cutils.cled8x8Test.c-oled8x8Testtest@rk3399:~/work/led8x8$sudo./led8x8Test音频分析系统Linux开发案例

2.1.5开发实践:显示模块驱动开发与测试5、OLED应用开发与测试1)通过Moba软件将“FFTDriver”目录下的ssd1316App文件夹复制到边缘计算网关。2)在应用程序源码目录通过gccfont.cutils.coled.coledTest.c-ooledTest命令进行编译,编译成功会生成led8x8Test测试程序。输入命令sudo./oledTest运行测试。(运行效果如下图)test@rk3399:~/work/oled-test$lsfont.cfont.holed.coled.holedTest.cutils.cutils.htest@rk3399:~/work/oled-test$gccfont.cutils.coled.coledTest.c-ooledTesttest@rk3399:~/work/oled-test$sudo./oledTest音频分析系统Linux开发案例

2.1.6小结本节学习了音频分析显示系统的总体硬件架构与软件架构。学习了项目使用的智能边缘计算网关,扩展硬件模块。学习了项目中点阵屏与OLED屏的硬件原理、驱动程序开发、应用程序开发与测试。音频分析系统Linux开发案例

2.1.7思考与拓展1、点阵屏如何使用HT16K33芯片进行驱动?2、尝试使用OLED屏实现右进左出滚动显示字符串功能?第2章音频分析系统Linux开发案例

2.2 音频分析系统开发音频分析系统Linux开发案例时域描述数学函数或物理信号对时间的关系,例如一个信号的时域波形可以表达信号随着时间的变化,是真实世界,是惟一实际存在的域。频域是描述信号在频率方面特性时用到的一种坐标系。波从时域到频域的转换可以通过傅里叶变换实现。傅里叶级数的本质是将一个周期的信号分解成无限多分开的(离散的)正弦波,这种变换是通过一组特殊的正交基来实现。一段波形图可以分解成不同频率的波形图,也就是由时域到频域的转换,转换原理如图所示。2.2.1频谱分析显示功能开发

音频频谱分析原理音频分析系统Linux开发案例音频分析显示系统的主程序的功能是通过多线程实现,这样每个线程可以独立的处理自己功能,如图所示。2.2.1频谱分析显示功能开发

软件功能设计(程序源码详细请查看文档)音频分析系统Linux开发案例ALSA是AdvancedLinuxSoundArchitecture,高级Linux声音架构的简称,它在Linux操作系统上提供了音频和MIDI(MusicalInstrumentDigitalInterface,音乐设备数字化接口)的支持。ALSA的主要特性包括:高效地支持从消费类入门级声卡到专业级音频设备所有类型的音频接口,完全模块化的设计,支持对称多处理(SMP)和线程安全,对OSS的向后兼容,以及提供了用户空间的alsa-lib库来简化应用程序的开发。ALSA是kernel中的一个声音驱动程序,它包括ALSA核心和其他声卡的驱动。alsa-utils是ALSA的一个工具包,里面包含有声卡测试和音频编辑的工具。arecord,aplay是命令行的ALSA声卡驱动的录音和播放工具。arecord是命令行ALSA声卡驱动的录音程序,支持多种文件格式和多个声卡。aplay是命令行播放工具,支持多种文件格式。2.2.2音频处理功能开发Linux声卡驱动与调试方法arecord[flags][filename]aplay[flags][filename[filename]]...音频分析系统Linux开发案例通过运行arecord命令录音时,录音数据可以输出到文件,本项目主要功能是对录制的音频数据进行分析,如果数据保存文件再从文件读取效率很低,这样采用直接通过本机回环网络通信的机制高效读取数据,通过udpfw程序进行网络输出udpfw.c程序录音线程程序源码:2.2.2音频处理功能开发

音频数据处理功能分析//arecord命令录音,通过udpfw程序进行网络输出void*threadRecoder(void*arg){ intpid; charcmd[64]; snprintf(cmd,64,"arecord-r%d-fU8-traw|./udpfw&",SAMPLE); system(cmd);}(完整源码详细请查看文档)

音频数据转发程序分析音频分析系统Linux开发案例根据系统要实现的功能,通信协议设计如表所示。2.2.3上位机控制应用开发

通信协议设计0x5A命令cmd参数param0xA51个字节1个字节0-n个字节1个字节收发方向命令参数说明上位机

设备1无设备发现命令2kv按键模拟指令,kv取值1,23x切换到相应的功能,x取值0,1,24yled8x8涂鸦功能y对应led8x8缓存设备

上位机0x81v1,v2设备发现命令响应,v1设备硬件版本版本,v2设备软件版本音频分析系统Linux开发案例网络通信处理线程主要实现的功能是同Android应用程序进行通信,收发处理通信命令,程序源码如下:2.2.3上位机控制应用开发

网关网络程序开发staticvoid*threadUdp(void*arg){ int*parg=arg; structsockaddr_inserver_addr; structsockaddr_inclient_addr; intclient_len; charrcv_buff[1024]; charsend_buff[1024]; intrcv_num; intsock_fd;

if((sock_fd=socket(AF_INET,SOCK_DGRAM,0))<0){perror("socketcreateerror\n");exit(1);}memset(&server_addr,0,sizeof(structsockaddr_in));

server_addr.sin_family=AF_INET;server_addr.sin_port=htons(27351);server_addr.sin_addr.s_addr=htonl(INADDR_ANY);client_len=sizeof(structsockaddr_in);if(bind(sock_fd,(structsockaddr*)&server_addr,sizeof(structsockaddr_in))<0){perror("binderror.\n");exit(1);}

(完整源码详细请查看文档)音频分析系统Linux开发案例Android应用程序主要是提供一个操作界面,通过Android的网络功能查找局域网中运行音频分析系统应用的智能网关设备,搜索到设备后显示IP地址,用户点击IP址址进入音频分析设备控制界面。AndroidStudio开发环境中看到的本项目的工程目录如图所示。2.2.3上位机控制应用开发Android应用开发(完整源码详细请查看文档)音频分析系统Linux开发案例音频分析设备控制界面主要有两大功能,一个是频谱分析显示,一个是设备测试功能。点击界面上的“功能”按钮可以在频谱与测试功能间切换。1)在频谱功能下,点击“样式”可以切换线条、雪花、块状不同的显示样式。2)进入测试功能时,OLED屏幕会显示当前软件版本号,单击软件界面上的8x8模拟点阵屏中的某个小点,扩展板点阵屏可以同步操作。2.2.3上位机控制应用开发Android应用开发(完整源码详细请查看文档)包名(类名)说明com.zonesion.udp.demo应用包DeviceActivity.java主界面类MainActivity.java创建Socket,向服务端发送请求音频分析系统Linux开发案例1、ARM扩展模块硬件连接2.2.4开发实践:音频分析显示2、声卡驱动与测试网关驱动程序开发与测试需要ARM扩展模块,参考“1.1.5开发实践:显示模块驱动开发与测试”。通过Moba应用程序的SSH功能登录边缘计算网关,输入录音命令:arecord-r22000-fU8-trawtest.raw-r22000设置采样率,-fU8设置格式,-traw文件类型,test.raw录音文件名称。打开边缘计算网关的声音设置,如果录音程序启动成功,在录音选项可以看到录音设备,对着边缘网关大声说话,可以看到采集的音量大小变化,如图所示。音频分析系统Linux开发案例3、音频分析应用程序测试2.2.4开发实践:音频分析显示1)通过Moba软件将“FFTDriver”目录下的fft-test文件夹复制到边缘计算网关。fft-test文件夹中是音频分析应用程序的全部源码与编译规则文件,如图2.24所示。音频分析系统Linux开发案例3、音频分析应用程序测试2.2.4开发实践:音频分析显示2)在应用程序源码目录通过make命令进行编译,make命令会使用当前目录下的Makefile文件中编译规则对程序进行编译。test@rk3399:~/work/fft-test$makegcc-c-outils.outils.cgcc-c-ofont.ofont.cgcc-c-offt.offt.cgcc-c-oled8x8.oled8x8.cgcc-c-ooled.ooled.cgcc-c-oaudioTest.oaudioTest.cgccutils.ofont.offt.oled8x8.ooled.oaudioTest.o-lm-lpthread-offtAppgcc-c-oudpfw.oudpfw.cgcc-oudpfwudpfw.o音频分析系统Linux开发案例3、音频分析应用程序测试2.2.4开发实践:音频分析显示3)因为程序中要调用录音功能,在SSH远程登录中运行会有权限问题,需要直接在网关上运行或通过Moba软件的VNC远程桌面中去运行。在远程桌面的终端中输入命令sudo./fftApp运行测试,如图所示。音频分析系统Linux开发案例3、音频分析应用程序测试2.2.4开发实践:音频分析显示4)Android应用测试。在Android终端(手机与平板)上安装“FFTDriver”目录下的demo.apk应用程序。边缘计算网关与Android终端接入同一个局域网中,打开Android终端中应用程序,会搜索当前网络中的网关设备,显示其IP地址与软硬件版本号,点击IP址进入网关设备控制界面,如图所示。音频分析系统Linux开发案例3、音频分析应用程序测试2.2.4开发实践:音频分析显示4)Android应用测试。点击“功能”按钮可以在频谱与测试功能间切换,进入“测试”功能时,OLED屏幕会显示当前软件版本号,单击软件界面上的8x8模拟点阵屏中的某个小点,扩展板点阵屏可以同步操作,如图所示。音频分析系统Linux开发案例

2.2.5小结本节学习了项目中的核心功能音频频谱分析的原理,对智能网关运行的主程序多线程的功能模块分别进行介绍与代码分析。学习了对智能网关与Android设备间的通信协议设计进行分析讲解。分析了网关上网络通信处理线程,介绍了Android应用的程序功能与结果,通过开发实践完成整个项目的运行与测试。音频分析系统Linux开发案例

2.2.6思考与拓展1、项目中通过arecord命令进行音频录制后,为什么要把音频数据通过网络转发?2、Android应用程序是通过什么机制查找智能网关设备?第3章城市环境采集Linux开发案例城市环境采集Linux开发案例本章分析Linux技术在城市环境采集中的应用,共分2个模块:1.系统总体设计与Linux驱动开发:先进行系统总体设计分析,嵌入式Web服务器应用、Boa服务器移植、CGI开发技术,实现嵌入式Web服务器应用开发。2.城市扬尘监测系统开发:软件界面框架分析、TVOCLinux驱动开发、LEDLinux驱动开发、PWMLinux驱动开发、扬尘检测功能设计,实现扬尘检测系统。第3章城市环境采集Linux开发案例

3.1系统总体设计与Linux驱动开发城市环境采集Linux开发案例嵌入式Web服务器,是基于嵌入式系统而实现的Web服务器。很好理解,拆分成两个部分,Web服务器+嵌入式。Web服务器,即通常所说的网页服务器。用IE等浏览器访问时,网页内容储存的地方就叫做Web服务器。大型的网站等,对服务器的硬件要求比较高,可以支持成千上万个客户端同时访问,而且速度要快。嵌入式Web服务器,是Web服务器当中的一种。在嵌入式系统上实现的一个Web服务器,可以通过浏览器等去访问,对硬件要求稍微低一点。举个简单的例子,用的路由器,就是一个典型的嵌入式Web服务器,通过等可以直接访问。本项目是嵌入式Linux中使用Web服务器的应用示例,利用嵌入式Linux和网络技术结合,实现采集远程的设备数据,通过互联网达到远程监控设备的目的,功能需求分析如表所示。3.1.1系统总体设计分析

系统需求分析功能功能说明TVOC气体传感器采集功能通过Arm扩展模块的TVOC传感器采集气体数据扬尘等级实时动态显示功能通过扩展板的点阵屏、OLED屏以及LED等动态显示等级变化web应用控制功能通过web应用程序对系统采集的气体数据通过仪表盘、曲线图以及地图进行显示城市环境采集Linux开发案例城市环境采集系统,其硬件主要边缘计算网关、Arm扩展模块构成。硬件结构框图如下:网关连接Arm扩展模块的TVOC传感器实时采集气体数据,PC端的WEB管理界面可实时查看传感数据以及历史数据,硬件结构框图如图所示。3.1.1系统总体设计分析

系统总体设计城市环境采集Linux开发案例城市环境采集系统,其软件模块主要由硬件驱动程序、Boa服务软件、PC端Web管理软件构成,软件总体结构框图如图所示。3.1.1系统总体设计分析

系统总体设计城市环境采集Linux开发案例LighttpdLibHttpd是一个开源轻量级嵌入式Webserver,提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的webserver环境。lighttpd适合静态资源类的服务,比如图片、资源文件,同时也适合简单的CGI(CommonGatewayInterface)公共网关接口应用的场合。ShttpdShttpd,持CGI,SSL,cookie,MD5认证,由于shttpd可以轻松嵌入其他程序里,因此shttpd是较为理想的webserver开发素材,开发人员可以基于shttpd开发出自己的webserver。ThttpdThttpd是一种开源Web服务器,简单、小巧、易移植、快速和安全的HTTP服务器。对于并发请求不使用fork()来派生子进程处理,而是采用多路复用技术来实现。BoaBoa服务器是一个小巧高效的Web服务器,支持CGI的、适合于嵌入式系统的单任务的http服务器,源代码开放、性能高。作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行。3.1.2嵌入式Web服务器应用

常见嵌入式Web服务器城市环境采集Linux开发案例Mini_httpdMini_httpd是一个小型的HTTP服务器,开源,适合于中小访问量的站点。AppwebAppweb是一个快速、低内存使用量、标准库、方便的服务器,最大特点就是功能多和高度的安全保障。GoAheadGoAhead是跨平台的服务器软件,可以稳定地运行在Windows,Linux和MacOSX操作系统之上。3.1.2嵌入式Web服务器应用

常见嵌入式Web服务器城市环境采集Linux开发案例Boa是一种单任务的Web服务器,当有连接请求到来时,它并不为每个连接单独创建进程,也不通过复制自身进程来处理多连接,而是通过建立HTTP请求列表来处理多路HTTP连接请求,同时它只为CGI程序创建新进程,因此,Boa具有很高的HTTP请求处理速度和效率。嵌入式Web服务器Boa和普通Web服务器一样,能够完成接收客户端请求、分析请求、响应请求、向客户端返回请求结果等任务,它的工作过程主要包括:3.1.2嵌入式Web服务器应用Boa服务器(1)完成Web服务器的初始化工作,如创建环境变量、创建TCP套接字、绑定端口、开始侦听、进入循环结构,以及等待接收客户浏览器的连接请求;(2)当有客户端连接请求时,Web服务器负责接收客户端请求,并保存相关请求信息;(3)在接收到客户端的连接请求之后,分析客户端请求,解析出请求的方法、URL目标、可选的查询信息及表单信息,同时根据请求做出相应的处理;(4)Web服务器完成相应处理后,向客户端浏览器发送响应信息,关闭与客户机的TCP连接。城市环境采集Linux开发案例(1)移植Boa服务器过程

解压文件,并进入./boa/src目录

执行./configure配置编译环境

make编译源代码,修改错误

创建boa安装目录/boa

修改defines.h文件中的SERVER_ROOT,使其指向改动后的配置文件路径

复制必要的文件到安装目录

修改boa配置文件

实现HTML页面文件(2)移植到嵌入式开发板

在源代码编译的时候,指定交叉编译工具链

编译目标文件并复制到安装目录

将整个/boa目录复制到nfs共享根目录下面3.1.3Boa服务器移植Boa服务器移植(方法与流程、配置)城市环境采集Linux开发案例HTML源文件3.1.3Boa服务器移植Boa服务器测试<html><head><title>CGITEST</title></head><body><h1>TestPage<h1><h2>CGIC<h2></body></html>2)HTML对应的CGI源文件intmain(intargc,char**argv){printf("Content-type:text/html\n\n");printf("<html>\n<head><title>CGITEST</title></head>\n<body>\n");printf("<h1>TestPage<h1>\n");printf("<h2>CGIC<h2>\n");printf("</body>\n</html>\n");return0;}可以打开浏览器在地址栏中输入ip/cgi-bin/hello.cgi出现如图所示,说明cgi功能可以使用。城市环境采集Linux开发案例3.1.3Boa服务器移植Boa服务器测试3)实现嵌入式web远程控制功能点击hello~之后服务器跳转,页面显示的内容如图所示。(详细源码详细请查看文档)城市环境采集Linux开发案例服务器端与客户端进行交互的常见方式多,CGI是其中之一。CGI是外部扩展应用程序与Web服务器交互的一个标准接口。根据CGI标准,编写外部扩展应用程序,可以对客户端浏览器输入的数据进行处理,完成客户端与服务器的交互操作。CGI规范定义了Web服务器如何向扩展应用程序发送消息,在收到扩展应用程序的信息后又如何进行处理等内容。对于许多静态的HTML网页无法实现的功能,通过CGI可以实现表单的处理、对数据库的访问、搜索引擎、基于Web的数据库访问等等。3.1.4CGI开发技术CGI简介城市环境采集Linux开发案例1)CGI接口CGI程序可以用任何程序设计语言编写,如Shell脚本语言、C语言等。CGI接口标准包括标准输入、环境变量、标准输出三部分。1.标准输入CGI程序像其他可执行程序一样,可通过标准输入从Web服务器得到输入信息,如Form中的数据,这是向CGI程序传递数据的POST方法。在操作系统命令行状态可执行CGI程序,对CGI程序进行调试。2.环境变量Web服务器和CGI接口另外设置了一些环境变量,用来向CGI程序传递一些重要的参数。CGI的GET方法还通过环境变量QUERY-STRING向CGI程序传递Form中的数据。3.标准输出CGI程序通过标准输出将输出信息传送给Web服务器,传送给Web服务器的信息可以用各种格式,以在命令行状态调试CGI程序。3.1.4CGI开发技术CGI工作原理城市环境采集Linux开发案例2)CGI程序实例3.1.4CGI开发技术CGI工作原理intmain(){intn,len=0;printf("Welcomebackhome/plain\n\n");if(getenv("Welcomebackhome"))n=atoi(getenv("CONTENT-LENGTH"));printf(“Welcomebackhome=%d\n”,n);for(n=0;n<len;n++)printf("CONTENT=%c",getchar());return0;}CGI程序的工作过程总结如下

1.求出环境变量长度;

2.循环使用getchar()或者其他文件读函数得到所有的输入;

3.将输出信息的格式告诉Web服务器;

4.通过使用printf()或其他的文件写函数,将输出传送给Web服务器。

CGI程序从Web服务器得到输入信息,进行处理,然后将输出结果再送回给Web服务器。城市环境采集Linux开发案例用户通过网页客户端(浏览器)实现对服务器端(嵌入式系统)的查询访问和下发数据命令,如图所示。3.1.5开发实践:嵌入式Web服务器应用Boa开发框架与移植GW3399开发板CGIBOA服务器Web网页客户端数据显示图像显示套接字虚拟文件SOCKET-likeGET方法POST方法每个网页上的不同模块对应不同的CGI基于客户机/服务器计算模型协议HTTP超文本传输协议传输单元:Web网页城市环境采集Linux开发案例

Boa服务器的源代码修改与编译步骤如下:1)将boa文件通过共享文件夹拷贝到PC虚拟机的/home/目录;2)然后在/home/boa目录下面输入命令进行解压;3)输入命令配置boa生成Makefile;4)建立交叉编译开发环境,设置环境变量5)返回开发目录/home/boa/boa-0.94.13,修改CC和GCC对应的选项6)修改文件boa/boa-0.94.13/src中compat.h、boa.c和log.c;7)修改完源代码文件后输入命令开始编译源代码8)通过编译信息修改错误;3.1.5开发实践:嵌入式Web服务器应用Boa开发框架与移植城

温馨提示

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

评论

0/150

提交评论