概述
1嵌入式系统概述
1.1嵌入式系统
- 嵌入式系统的定义:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗要求的专用计算机系统。
- 应用领域:工业控制、交通管理、信息家电、智能家庭管理、机器人
- 嵌入式系统的组成
- 嵌入式处理机
- 嵌入式外围设备
- 嵌入式操作系统
- 嵌入式软件
- 嵌入式系统的特点
- 嵌入性
- 专用性
- 实时性
- 可靠性
- 可裁剪性
- 功耗低
1.2嵌入式操作系统
- 操作系统的基本功能:
- 处理器的控制与管理
- 存储器额分配与管理
- 外部设备的控制与管理
- 文件的控制与管理
- 作业的控制与管理
满足多任务处理、稳定运行、安全可靠、占用系统资源少、特有的实时事件处理、便于维护和管理、简洁良好的用户界面。
从使用者角度:方便用户使用
从程序开发者角度:编程语言
从操作系统设计者角度:让各种软件资源和硬件资源高效而协调的运转起来;尽可能方便用户使用计算机。
- 嵌入式操作系统的发展:
- 无操作系统的嵌入算法阶段
- 以嵌入式CPU为基础、简单操作系统为核心的嵌入式系统
- 通用嵌入式实时操作系统阶段,以嵌入式操作系统为核心的嵌入式系统
- 以基于Internet为标志的嵌入式系统。
- 嵌入式操作系统的特点:
- 可定制性:可以添加或裁剪操作系统内核
- 可移植性:运行在不同处理器上
- 实时性:可以提供实时性支持
- 资源限制:嵌入式操作系统内核占用空间要小
- 应用编程接口:提供API
- 嵌入式操作系统体系结构:
- 宏内核结构,优点:模块之间直接调用函数,效率高;缺点:维护困难,移植性和扩展性差。
- 分层结构,优点:复杂功能简化,分而治之,便于设计,移植替换性好,开发和维护简单;缺点:系统效率低,底层修改会产生连锁反应。
- 微内核结构,优点:内核小,扩展性好,安全性高,便于移植和维护;缺点:通信负载,系统效率低,地址空间独立,增加额外开销。
1.3嵌入式linux基础
- Linux功能特点:
- 开放性
- 多用户、多任务
- 设备独立性
- 强大的网络功能
- 安全性
- 可移植性
- Linux作为嵌入式操作系统的优势:
- 低成本开发系统
- 可应用于多种硬件平台
- 可定制的内核
- 性能优异
- 良好的网络支持
- Linux文件系统、分区和挂载
在Linux中把每一个分区和某一个目录对应,以后在对这个目录的操作就是对这个分区的操作,这样就实现了硬件管理手段和软件目录管理手段的统一。这个把分区和目录对应的过程叫做挂载(Mount),而这个挂载在文件树中的位置就是挂载点。这种对应关系可以由用户随时中断和改变。
分区:主分区、扩展分区、逻辑分区 硬盘分区是针对一个硬盘进行操作的,它可以分为:主分区、扩展分区、逻辑分区。要在硬盘上安装操作系统,则该硬盘必须要有一个主分区,PC机每个硬盘最多只能分成4个主分区,主分区不利于应用程序使用,在主分区的基础上引入扩展分区(Extended partion),因此可在硬盘4个主分区中的一个用作扩展分区,在扩展分区中可以建立多个逻辑分区(Logical partion),
- 文件属性
第一个字符显示文件的类型
“_”表示普通文件。
“d”表示目录文件。
“l”表示链接文件。
“c”表示字符设备。
“b”表示块设备。
“p”表示命名管道比如FIFO文件(First In First Out,先进先出)。
“f”表示堆栈文件比如LIFO文件(Last In First Out,后进先出)。
2嵌入式Linux编程基础
2.1Linux下的C语言编程
- C语言概述
- C是中级语言
- C是结构化语言
- C语言功能齐全
- C语言可移植性好
- Linux下C语言编程环境
- 编辑器
- 编译链接器
- 调试器
- 项目管理
- C语言开发流程
- 编写源代码
- 编译源程序(GCC -o)
- 运行程序(./hello)
- 调试程序(使用GDB工具)
- 交叉编译(基于ARM架构的GCC编译器将源程序编译成嵌入式产品中的可执行程序)
- 编写Makefile(自动编译管理器)
2.3GCC编译器
- GCC编译流程
- 预处理,在该阶段,编译器将上述代码中的stdio.h编译进来,并且用户可以使用Gcc的选项“-E”进行查看,该选项的作用是让Gcc在预处理结束后停止编译过程。
- 编译,编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
- 汇编,使用选项“-c”,将汇编代码已转化为“.o”的二进制目标代码
- 链接,在成功编译之后,就进入了链接阶段。完成了链接之后,Gcc就可以生成可执行文件
- 库依赖
Linux下大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下,但并不是所有的情况都是这样。
2.4GDB调试器
- gdb是GNU开发组织发布的一个强大的UNIX/Linux下的程序调试工具。一般来说,gdb主要帮助用户完成下面4个方面的功能:
- 启动程序,可以按照用户自定义的要求随心所欲的运行程序。
- 可让被调试的程序在用户所指定的调试的断点处停住 (断点可以是条件表达式)。
- 当程序停住时,可以检查此时程序中所发生的事。
- 动态地改变程序的执行环境。
Make工程管理器
- make工程管理概述
- 所谓工程管理器,是指管理较多的文件。在大型项目开发中,通常有几十到上百个源文件,如果每次均手工键入gcc 命令进行编译的话,非常不方便。因此,人们通常利用make工具来自动完成编译工作。
- 实际上,make 工具通过一个称为makefile 的文件来完成并自动维护编译工作。makefile 需要按照某种语法进行编写,其主要内容是定义了源文件之间的依赖关系,说明了如何编译各个源文件并连接生成可执行文件。
- makefile文件
- 什么是makefile文件?make命令执行时,需要一个 makefile文件,以告诉make命令需要怎样去编译和连接程序。
- 当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新编译所有依赖该文件的源文件。makefile 文件是许多编译器,包括Windows NT 下的编译器维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改makefile 文件而已。默认情况下,GNU make 工具当前工作目录中按如下顺序搜索makefile:
- GNUmakefile
- makefile
- Makefile
- makefile文件的操作规则是:
- 如果这个工程没有编译过,所有C文件都要编译并被连接。
- 如果这个工程的某几个C文件被修改,只需编译被修改的C文件,并连接目标程序。
- 如果这个工程的头文件被改变了,需要编译引用了这几个头文件的C文件,并连接目标程序。
- Makefile内容
- makefile文件的操作规则是:
- 如果这个工程没有编译过,所有C文件都要编译并被连接。
- 如果这个工程的某几个C文件被修改,只需编译被修改的C文件,并连接目标程序。
- 如果这个工程的头文件被改变了,需要编译引用了这几个头文件的C文件,并连接目标程序。
2.7文件I/O编程
- 系统调用和API
Linux对于输入输出(I/O)操作,通常为五个方面:打开、读取、写入、定位、关闭,对应的有五个系统调用,分别是:open、read、write、lseek和close这5个函数,也称为不带缓冲区的I/O操作,程序员可以直接操作硬件,这样为开发驱动等底层的系统应用提供了方便。
2.8进程控制编程
- 进程和程序
进程是一个程序的一次执行过程,程序是静态的,他是一些保存在磁盘上的指令的有序集合,没有任何执行的概念,
- 进程的状态和转换
(1)执行状态:该进程正在执行,即进程正在占用CPU。
(2)就绪状态:进程已经具备执行的一切条件,正在等待分配CPU的处理时间片。
(3)等待状态:进程不能使用CPU,若等待事件发生则可将其唤
在Linux中最主要的进程标识有进程号(PID,Process Idenity Number)和它的父进程号(PPID,parent process ID)。其中PID惟一地标识一个进程。PID和PPID都是非零的正整数。在Linux中获得当前进程的PID和PPID的系统调用函数为getpid和getppid,通常程序获得当前进程的PID和PPID可以将其写入日志文件以做备份。
进程间的通信和同步
- 进程具有自己独立的地址空间,进程之间交换数据必须通过内核
- 进程间的通信方式主要包括以下几种:
- 管道及有名管道(pipe):半双工;只能用于父子进程或者兄弟进程之间(有名管道解决);单独构成一种独立的文件系统;读出和写出类似队列机制。
- 信号(Signal)
- 报文队列(Message)
- 共享内存,速度最快,结合信号量使用;同一块物理内存被映射到进程A、B各自的进程地址空间,需要结合互斥锁和信号量来保证数据安全。
- 信号量
- 套接字
3基于Linux的嵌入式软件开发
3.1嵌入式软件结构
- 嵌入式软件体系结构
设备驱动层:使用任何外部设备都要有相应驱动程序的支持,他为上层软件提供了设备的的操作接口。
操作系统层:操作系统一般以内核映像的形式下载到目标系统中。整个嵌入式系统与通用操作系统类似,功能比不带有操作系统的嵌入式系统强大很多。
中间件层:中间件处于操作系统软件和用户的应用软件之间。作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活和高效的开发和集成复杂的应用软件。
应用程序:用户应用程序主要通过调用系统的API函数对系统进行操作,完成用户应用功能开发。
- 基于Linux的嵌入式软件
基于嵌入式Linux的软件结构如图所示,在硬件之上的是引导程序BootLoader,然后是Linux内核,最上层是应用程序。
3.2嵌入式软件开发流程
- 嵌入式Linux设计概述
嵌入式系统的软件开发采用一种交叉编译调试的方式。交叉编译调试环境建立在宿主机(即一台PC机)上,对应的开发平台叫做目标板。运行 Linux 的 PC(宿主机)开发时使用宿主机上的交叉编译、汇编及连接工具形成可执行的二进制代码,(这种可执行代码并不能在宿主机上执行,而只能在目标板上执行。)然后把可执行文件下载到目标机上运行。
- 基于Linux的嵌入式软件开发流程
- 建立开发环境
- 配置开发主机
- 建立引导装载程序BOOTLOADER
- 移植Linux操作系统
- 建立根文件系统
- 建立应用程序的文件系统
- 开发应用程序
- 烧写内核、根文件系统、应用程序
- 发布产品
3.3嵌入式Linux开发环境
- ARM处理器硬件开发平台
UP-CUP 6410平台可运行 Linux 2.4.x 和 Linux 2.6.x 内核,支持 QT/E、miniGUI等嵌入式图形界面。集成了 USB、SD、LCD、Camera 等常用设备接口,适用于各种手持设备、消费电子和工业控制设备等产品的开发。
- 嵌入式交叉编译环境
嵌入式 LINUX 开发环境有几个方案:
-
- 1.基于 PC 机 WINDOWS 操作系统下的 CYGWIN;
- 2.在 WINDOWS 下安装虚拟机后,再在虚拟机中安装 LINXUX 操作系统;
- 3.直接安装 LINUX 操作系统。
- NFS服务
NFS是Network File System的简称,也就是网络文件系统。NFS是一种可以使不同的计算机之间通过网络进行网络共享的网络协议。一台NFS服务器只要将文件系统共享出来,NFS客户端就可以将它挂载到本地系统中。
3.4嵌入式系统引导代码
- Bootloader
Boot Loader就是在操作系统内核运行之前运行的一段小程序,用来初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态。
常用的Bootloader:ARMBoot、PPCBoot、U-Boot、RedBoot、Blob、Vivi
3.5Linux内核结构及移植
- Linux内核结构
Linux 内核可以进一步划分成 3 层。最上面是系统调用接口,它实现了一些基本的功能,例如 read 和 write。系统调用接口之下是内核代码,可以更精确地定义为独立于体系结构的内核代码。这些代码是 Linux 所支持的所有处理器体系结构所通用的。在这些代码之下是依赖于体系结构的代码,构成了通常称为 BSP(Board Support Package)的部分。这些代码用作给定体系结构的处理器和特定于平台的代码。
- Linux内核的主要子系统
- 进程调度
- 进程间通信
- 内存管理
- 虚拟文件系统
- 网络堆栈
- 设备驱动程序
- 依赖体系结构的代码
- Linux的源代码结构
- (1)linux:是源代码的主目录,在该主目录中包括所有的子目录,还含有唯一的一个Makefile文件。该文件是编译辅助工具软件make的参数配置文件。make工具软件的主要用途是通过识别哪些文件已被修改过,从而自动地决定在一个含有多个源程序文件的程序系统中哪些文件需要被重新编译。因此,make工具软件是程序项目的管理软件。
- linux目录下的这个Makefile文件还嵌套地调用了所有子目录中包含的Makefile文件。这样,当linux目录(包括子目录)下的任何文件被修改过时,make都会对其进行重新编译。因此为了编译整个内核所有的源代码文件,只要在linux目录下运行一次make软件即可。
- (2)arch目录:包含和硬件体系结构相关的代码,每种平台占一个相应的目录。该目录包含了此内核源码所支持的硬件体系结构相关的内核源码。在这个目录下,针对不同体系结构所移植的版本都有三个子目录:kernel、lib和mm。
- kernel子目录包含依赖于体系结构实现的一般内核功能,如信号处理、时钟处理等;
- lib子目录包含库函数的本地实现,如果从依赖于体系结构的源码编译,则运行更快;
- mm子目录包含存储管理实现的代码。
- (3)block目录:存放部分块设备驱动程序。
- (4)crypto目录:存放常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。
- (5)Documentation目录:存放关于内核各部分的通用解释和注释。
- (6)drivers目录:存放设备驱动程序,每个不同的驱动占用一个子目录,如声卡的驱动对应于drivers/sound。这个目录拥有50%以上的内核源码,系统中所有的设备驱动程序都位于该目录中。
- (7)fs目录:Linux支持的文件系统代码。不同的文件系统有不同的子目录与之对应。如ext、fat、ntfs等。
- (8)include目录:存放头文件,包括了内核的大多数头文件,另外对每种支持的体系结构分别有一个子目录。其中,和系统相关的头文件被放置在linux子目录下。
- (9)init目录:存放内核初始化代码(注意不是系统引导代码)。包含了所有系统的初始化源码,许多主要的文件,如main.c就位于该目录下。该文件还包含了许多核心代码——如实现fork()的代码和最常执行的代码——cpuidle()循环。
- (10)ipc目录:处理进程间通信的全部所需的代码都放在该目录下。
- (11)kernel目录:内核的最核心部分,许多最常调用的内核函数放在该目录下。包括调度器fork()和timer.c等,和平台相关的一部分代码放在arch/*/kernel目录下。
- (12)lib目录:存放库文件代码。该目录放置内核其他部分经常所需要的代码,如inflate.c就放在这里,它能够在引导时解压内核并装入内存。与处理器结构相关的库代码放在arch/*/lib目录下。
- (13)mm目录:包含了所有Linux实现虚拟内存管理的源码。与具体硬件体协结构相关的内存管理代码位于arch/*/mm目录下,如对应X86的就是arch/i386/mm/fault.c
- (14)modules目录: 存放已编译好的可动态加载的模块。
- (15)net目录:存放所有提供网络支持的代码代码,实现了各种常见的网络协议,每个子目录对应网络的一个方面。
- (16)scripts目录:存放用于配置内核的脚本文件及用户开发和维护手册。
- (17)security目录:主要是一个SELinux的模块。
- (18)sound目录:常用音频设备的驱动程序等。
- (19)usr目录:/usr 这是最庞大的目录,我们要用到的应用程序和文件几乎都存放在这个目录下
- Linux的移植
:就是把Linux操作系统针对具体的目标平台做必要改写之后,安装到该目标平台使其正确的运行起来。过程:
(1)下载内核:到 ftp://ftp.arm.linux.org.uk 上下载 Linux2.6.18 内核及其关于 ARM 平台的补丁(如:Patch-2.6.18-rmk1.gz)。
(2)给 Linux2.6.18 打补丁:zcat ../patch-2.6.18-rmk1.gz | patch –p1(前面../表示补丁文件放在内核文件上一层目录)
(3)准备交叉编译环境。交叉编译环境工具链一般包括 binutils(含 AS 汇编器,LD 链接器等),arm-gcc,glibc 等。交叉编译环境的搭建也是个复杂的过程,请参照3.2节。
(4)修改相关的配置文件,如修改内核目录下的 makefile 文件中关于交叉编译工具相关的内容,此后就可以使用这个makefile进行编译了。
(5)修改linux内核源码,主要是修改和CPU相关的部分。
(6)内核的裁剪,根据项目的需要裁剪内核模块。
(7)内核的编译,将裁剪好的内核进行编译,生成二进制映像文件。
(8)内核的下载,将生成的二进制映像文件,烧写到目标平台
3.7Linux设备驱动
- 设备驱动的作用
Linux 系统内核通过设备驱动程序与外围设备进行交互,设备驱动程序是Linux内核的一部分,它是一组数据结构和函数,这些数据结构和函数通过定义的接口控制一个或多个设备。
- 设备驱动程序的主要功能
- 对设备进行初始化
- 启动或停止设备的运行
- 把数据从内核传送到硬件和从硬件读取数据
- 读取应用程序传送给设备的文件的数据和回送应用程序请求的数据
- 检测和处理设备出现的错误
- 设备驱动程序的特点
- 驱动程序是与设备相关的
- 驱动程序的代码由内核统一管理
- 驱动程序在具有特权级别的内核态下运行
- 是输入输出系统的一部分
- 处于进程的上下文中
- 等待设备时阻塞
- Linux设备驱动的分类
- 字符设备:一个字符( char ) 设备是一种可以当作一个字节流来存取的设备( 如同一个文件 ); 一个字符驱动负责实现这种行为。 这样的驱动常常至少实现 open, close, read, 和 write 系统调用。 文本控制台( /dev/console )和串口( /dev/ttyS0 )是字符设备的例子, 因为它们很好地展现了流的抽象。字符设备通过文件系统结点来存取, 例如 /dev/tty1 和 /dev/lp0。 在一个字符设备和一个普通文件之间唯一有关的不同就是, 你经常可以在普通文件中移来移去, 但是大部分字符设备仅仅是数据通道, 你只能顺序存取。当然,也存在看起来象数据区的字符设备, 你可以在里面移来移去。 例如, frame grabber 经常这样, 应用程序可以使用 mmap 或者 lseek 存取整个要求的图像。
- 块设备:如同字符设备, 块设备通过位于 /dev 目录的文件系统结点来存取。 一个块设备(例如一个磁盘)应该是可以驻有一个文件系统的。 在大部分的 Unix 系统中, 一个块设备只能处理这样的 I/O 操作, 传送一个或多个长度经常是 512 字节( 或一个更大的 2 的幂的数 )的整块。 Linux中则相反, 允许应用程序读写一个块设备象一个字符设备一样 -- 它允许一次传送任意数目的字节。 结果就是, 块和字符设备的区别仅仅在内核在内部管理数据的方式上, 并且因此在内核/驱动的软件接口上不同。 如同一个字符设备, 每个块设备都通过一个文件系统结点被存取的, 它们之间的区别对用户是透明的。 块驱动和字符驱动相比, 与内核的接口完全不同。
- 网络设备:任何网络事务都通过一个接口来进行, 就是说, 一个能够与其他主机交换数据的设备。 通常, 一个接口是一个硬件设备, 但是它也可能是一个纯粹的软件设备, 比如回环接口。 一个网络接口负责发送和接收数据报文, 在内核网络子系统的驱动下, 不必知道单个事务是如何映射到实际的被发送的报文上的。
3.8设备驱动程序接口
- Linux设备控制方式
- 查询方式:设备驱动程序通过设备的I/O端口空间,以及存储器空间完成数据的交换。查询方式的优点是硬件开销小,使用起来比较简单。缺点,但在此方式下,CPU要不断地查询外设的状态,当外设未准备好时,就只能循环等待,不能执行其他程序,这样就浪费了CPU的大量时间,降低了处理器的利用率。
- 中断方式: CPU在满足一定条件下,暂停执行当前正在执行的主程序,转入执行相应能够进行输入/输出操作的子程序,待输入/输出操作执行完毕之后,CPU再返回并继续执行原来被中断的主程序。这样,CPU就避免了把大量时间耗费在等待、查询外设状态的操作上,使其工作效率得以大大提高。CPU响应中断是有条件的,如内部允许中断、中断未被屏蔽、当前指令执行完等。CPU响应中断以后,就会中止当前的程序,转去执行一个中断服务子程序,以完成为相应设备的服务。
- DMA方式:DMA可允许设备和系统内存间在没有处理器参与的情况下传输大量数据。设备驱动程序在利用DMA之前,需要选择DMA通道并定义相关寄存器,以及数据的传输方向,即读取或写入,然后将设备设定为利用该DMA通道传输数据。
4嵌入式应用程序的开发
4.6信号和槽机制
- 基本概念
信号和槽是QT的核心机制,要QT编程就必须对信号和槽有所了解。信号和槽是一种该机接口,应用于对象之间的通信,他是QT的核心特性,也是QT区别于其他工具包的重要地方。要正确处理信号和槽必须借助一个成为moc的QT工具。
信号:当某个信号对其客户或所有者发生的内部状态发生改变,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行,只有当所有的槽返回以后发射函数(emit)才返回。如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,但是它们执行的顺序将会是随机的、不确定的。
槽:槽是普通的C++成员函数,可以被正常调用,它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。
- 信号和槽机制的优点
- 信号和槽的机制是类型安全的:一个信号的签名必须与它的接收槽的签名相匹配。
- 信号和槽是宽松地联系在一起的:一个发射信号的类不用知道也不用注意哪个槽要接收这个信号。
6嵌入式Linux网络编程
6.1网络协议概述
- TCP协议
TCP协议处于传输层,实现了从一个应用程序到另一个应用程序的数据传递。应用程序通过目的地址和端口号来区分接收数据的不同应用程序。
TCP数据包格式:
TCP连接建立过程:
TCP协议通过三次握手来初始化,目的是使数据段的发送和接收同步,告诉其他主机其一次可接收的数据量,并建立连接。TCP连接的建立是通过三次握手实现的。需要连接的双方发送自己的同步SYN信息给对方,在SYN中包含了末端初始的数据序号,并且需要收到对方对自身发出SYN的确认。一个典型的TCP连接建立的过程如图
TCP通信过程:
UDP通信过程:
6.2网络编程基础
- Socket概述
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
常见的Socket有以下三种类型:
- 流式socket(SOCK_STREAM):流式socket提供可靠的、面向连接的通信流。它使用TCP协议,从而保证了数据传输的正确性。
- 数据报socket(SOCK_DGRAM):数据报socket定义了一种无连接的服务,它使用UDP协议,通过相互独立的数据报传输数据,协议本身不保证传输的可靠性和数据的原始顺序。
- 原始socket:原始socket允许对底层协议如IP,进行直接访问,它的功能强大,用户可以通过该socket开发自己的协议。
- 网络地址
网络地址的表示主要通过两个重要的数据类型:结构体sockaddr和sockaddr_in,其定义分别如下:
sa_family:一般为AF_INET,代表Internet(TCP/IP)地址族的IPV4协议,其他的值请查阅相关手册。
sa_data:包含了一些远程计算机的IP地址、端口号和套接字的数目,这些数据是混杂在一起的。
struct sockaddr_in { short int sin_family; /* 地址族 */ unsigned short int sin_port; /* 端口号 */ struct in_addr sin_addr /* IP地址 */ unsigned char sin_zero[8]; /* 填充0 以保持*/ /*与struct sockaddr同样大小 */ }; |
- 字节序
unsigned long int htonl(unsigned long int hostlong); unsigned short int htons(unisgned short int hostshort); unsigned long int ntohl(unsigned long int netlong); unsigned short int ntohs(unsigned short int netshort); |
在这四个转换函数中,h 代表host, n 代表 network。s 代表short,l代表long。 第一个函数的意义是将本机器上的long数据转化为网络上的long。 其他几个函数的意义也差不多。
最后
以上就是英勇灯泡为你收集整理的嵌入式软件复习总结1嵌入式系统概述2嵌入式Linux编程基础3基于Linux的嵌入式软件开发4嵌入式应用程序的开发6嵌入式Linux网络编程的全部内容,希望文章能够帮你解决嵌入式软件复习总结1嵌入式系统概述2嵌入式Linux编程基础3基于Linux的嵌入式软件开发4嵌入式应用程序的开发6嵌入式Linux网络编程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复