1.6 嵌入式通信系统的开发与应用
1.6.1 嵌入式通信系统开发相关技术
相对于在Windows环境下的开发应用程序,嵌入式通信系统开发有着很多的不同。不同的硬件平台和操作系统带来了许多附加的开发复杂性。
1.开发过程
在嵌入式开发过程需要用到宿主机和目标机,宿主机是编译、连接、定址过程的计算机;目标机是运行软件的嵌入式设备。首先须把应用程序转换成可以在目标机上运行的二进制代码。这一过程包含3个步骤:编译、连接、定址。编译过程由交叉编译器实现。所谓交叉编译器就是运行在一个计算机平台上并为另一个平台产生代码的编译器。常用的交叉编译器有GNUC/C++(gcc)。编译过程产生的所有目标文件被连接成一个目标文件,称为连接过程。定址过程会把物理存储器地址指定给目标文件的每个相对偏移处。该过程生成的文件就是可以在嵌入式平台上执行的二进制文件。
2.向嵌入式平台移植软件
在PC上编写软件时,要注意软件的可移植性,选用具有较高移植性的编程语言(如C语言),尽量少调用操作系统函数,注意屏蔽不同硬件平台带来的字节顺序、字节对齐等问题。
(1)字节顺序
字节顺序是指占内存多于一个字节的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节顺序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节顺序是高字节数据存放在低地址处,低字节数据存放在高地址处。基于x86平台的PC是小端字节序的,而有的嵌入式平台则是大端字节顺序的。通常认为,在通信信道中传输的字节的顺序即网络字节顺序为标准顺序,考虑到与协议的一致以及与同类其他平台产品的互通,在程序中发数据包时,将主机字节序转换为网络字节序,收数据包处将网络字节顺序转换为主机字节顺序。
(2)字节对齐
有的嵌入式处理器的寻址方式决定了在内存中占2字节的int16、uint16等类型的数据只能存放在偶数内存地址处,占4字节的int32、uint32等类型数据只能存放在4的整数倍的内存地址处;占8字节的双精度浮光型类型数据只能存放在8的整数倍的内存地址处;而在内存中只占1字节的字符类型数据可以存放在任意地址处。由于这些限制,在这些平台上编程时有很大的不同。若对内存中数据以强制类型转换的方式读取,字节对齐的不同会引起数据读取的错误。
(3)位段
由于位段的空间分配方向因硬件平台的不同而不同,对x86平台,位段是从右向左分配的;而一些嵌入式平台,位段是从左向右分配的。分配顺序的不同导致了数据存取的错误。解决这一问题的一种方法是采用条件编译的方式,针对不同的平台定义顺序不同的位段;也可以在前面所述的两个函数中加上对位段的处理。
(4)代码优化
嵌入式通信系统对应用软件的质量要求更高,因而在嵌入式开发中尤其需要注意对代码进行优化,尽可能地提高代码的效率,减少代码的大小。虽然现代C和C++编译器都提供了一定程度的代码优化,但大部分由编译器执行的优化技术仅涉及执行速度和代码大小的平衡,不可能使程序既快又小,因而必须在编写嵌入式软件时采取必要的措施。包括:提高代码的效率;减小代码的大小;避免内存泄漏等措施。