那是 1981 年(是的——将近 40 年前!),我们正在构建一个系统,其中包含一个 DEC PDP-11 小型计算机,该小型计算机通过共享内存与德克萨斯 TMS990 微处理器接口。这些都是 16 位处理器,所以我们将数据作为字传递。但是发生了一些奇怪的事情:一个 CPU 会将一个值写入共享内存的一个字中,但是当另一个 CPU 读出它时,字节被交换了。解决这个问题很简单:只需在一侧编写一个简单的访问例程来交换字节并确保它始终用于访问共享内存。直到后来才知道为什么会出现这个问题。
在几乎所有现代嵌入式系统中,内存都是按字节组织的。但是,CPU 也可以将数据处理为 16 位或 32 位字。在这种情况下,需要决定如何将字中的字节存储在内存中。有两个明显的选项和许多其他变体。描述此字节顺序的属性称为“字节顺序”(或有时称为“字节顺序”)。
两种常见的字节序形式是:最低有效字节存储在最低地址(“little-endian”)和最高有效字节存储在最低地址(“big-endian”)。字节顺序还有其他变化,甚至还有存储位的可能性。
广义上讲,使用的字节序是由 CPU 决定的。由于有多种选择,因此不同的半导体供应商为其 CPU 选择不同的字节序也就不足为奇了。英特尔 CPU 传统上是小端的。飞思卡尔倾向于支持大端。大多数现代 CPU 的字节序可以在软件中交换。
从嵌入式软件工程师的角度来看,问题是“字节序重要吗?” 并且,“如果有,多少钱?”
当软件开发人员需要考虑字节顺序时,大致有两种情况:
通过通信链路或网络传输的数据
在软件中以多种表示形式处理的数据
前一种情况非常简单——只需遵循或定义协议即可。后者更棘手,需要一些思考。
考虑这段代码:
unsigned int n = 0x0a0b0c0d;
unsigned char c, d, *p;
c = (unsigned char) n;
p = (unsigned char *) &n;
d = *p;
c和d最后会包含什么值?无论字节顺序如何,c 都应该包含值 0x0 d。但是,d的值将取决于字节序。在小端系统上d 将包含 0x0 d;在 big-endian 上,它将具有值0x0a。如果要在n 和unsigned char a之间进行联合,则会观察到同样的效果。
那么,这有关系吗?这么多年前,这对我很重要!但是,请注意,大多数代码可能会独立于字节顺序而编写,我认为几乎所有编写良好的代码都是这样的。但是,如果您确实像我需要的那样构建了字节顺序依赖项,那么良好的文档和注释是必不可少的。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !