0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式系统编程的大小端和内存对齐问题

电子工程师 来源:张飞实战电子 作者:黄忠老师 2021-08-27 10:54 次阅读

C语言是一种高级语言,在大多数情况下C语言的代码是和具体的处理器体系结构无关的。然而,在嵌入式系统编程中,有可能涉及对内存的具体操作。在大小端和内存对齐问题上,C语言就不能屏蔽不同体系结构处理器的差别,也就是说同样的C语言代码在不同的体系结构的处理器上,有可能产生不同的结果。

大小端问题又叫字节序的问题。在各种体系结构的处理器中,对多字节数据的内存操作有着不同的定义。处理器对内存数据的操作有读写两种,这就涉及处理器在读写一个多字节的内存的时候,高字节是在内存的高地址还是低地址。一般在32位或者16位的处理器中,都具有将32位数据和16位数据读写到内存中的指令,这时不同的大小端模式将有不同的结果。

如果读写指令针对的数据长度和类型是一致的,无论数据在内存中存放的形式如何,处理器整体读写都没有问题。这种整内存协调的读写操作问题,一般不会涉及处理器的大小端。

当处理器读写指令针对的数据长度不一致的时候就会涉及大小端的问题,例如:

将0x76543210整体放入内存,然后在内存的首地址用单字节读取的命令读出。

如果不知道大小端模式的情况下,读取的值是多少你能确定吗?

这时就涉及处理器是大端还是小端的问题。

对于小端处理器,写内存的时候会将内存低地址处放入源数据的低字节,在内存的高地址处放入源数据的高字节;读内存的时候,将内存中低地址的数据就视为目标数据的低字节,对应的高地址数据是目标数据的高字节。

对于大端处理器,跟小端就相反的。内存低地址存放数据的高字节,高地址存放数据的低字节。

上面的示例只是处理器自身读取和写入内存的情况,在更多的情况下,内存中的数据可能来自外界的输入,例如:来自网络的数据包;处理器在写内存的时候,这块内存也可能是给系统中别的设备使用的,例如:处理器写显示内存的情况。这时,就更需要注意处理器的大小端问题,只有大小端处理协调匹配,才能获得正确的结果。

在C语言中,使用指针就可以操作内存,指针的基本类型long和short分别代表了32位和16位的数据。使用16位或32位指针操作内存的时候,同样涉及内存的大小端问题。

上面我们说了一下内存读写的模式不同,一个地址存的数据不同。

接下来我们说一下内存对齐的问题,有人会说了内存对齐不对齐还需要你来管吗?这个在写程序的时候也是有讲究的,那么到底什么是内存对齐?为什么要有这个概念呢,我们来一起学习一下吧。

内存对齐操作的含义是:对于一个4字节的数据,要求其内存是4字节对齐的(地址为4字节的整数倍)。32位对齐的含义是其内存的地址的最低位是:0x0,0x4,0x8,0xC

16位对齐的含义是其内存的地址的最低位是:0x0,0x2,0x4,0x6,0x8,0xA,0xC,0xE

显然,对于单字节的内存读写操作,没有内存对齐的问题。从处理器硬件的角度,处理器更适合处理对齐的内存操作。对于非对齐的内存操作,不同的处理器则有不同的结果。

局部变量建立在栈空间上的,由编译器分配,一般保证它们都是对齐的。但是在程序中可能出现不对齐的内存操作。对于嵌入式系统中常用的ARM体系结构,并不支持不对齐的地址操作,当进行不对齐的地址访问的时候,处理器将引发异常。

在嵌入式程序的编写过程中,更需要注意内存对齐的问题。对于内存操作,使用字节操作(8bit)不会有内存对齐的问题,但是效率比较低。在32位系统中,应该尽量使用32位的数据操作,但这将带来内存对齐的问题,因此需要根据系统的具体情况选择合适的内存操作。

我们再来说说常纠结或者容易迷惑的结构体成员的对齐问题。

结构体是一个基本的语法单元。在32位系统中,编译器一般会对结构体的成员变量作一定的对齐处理。例如,在程序中定义如下结构体:

typedef struct _S1

{

char m1;

int m2;

char m3;

short m4;

}S1;

在结构体的定义上,结构体的大小应该是各个结构体成员的大小之和。但是,对于上面这个结构体S1,它的大小并不等于4个成员变量之和。在这种定义中,三个成员变量之和是1+4+2+2=8,但是结构体的大小并不是8字节。

编译器在处理结构体的时候,默认将结构体内部各个变量的内存都是对齐的,由此在结构体的内部可能出现一些空的字节。

一般情况下,在结构体含有4字节长整型成员的时候,结构体的大小将是4字节的倍数。为了对齐可能需要在结构体的最后补充1~3个字节。

如果结构体中含有2字节短整型成员的时候,结构体的大小将是2字节的倍数。为了对齐可能需要在结构体的最后补充一个字节。

这个算字节数的一般出现在找工作中的笔试题的概率还是很高的,其实就是考察的对这个内存对齐的掌握。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4983

    文章

    18286

    浏览量

    288498
  • C语言
    +关注

    关注

    180

    文章

    7533

    浏览量

    128783

原文标题:在嵌入式系统中大小端和对齐问题

文章出处:【微信号:CanaanTech,微信公众号:嘉楠科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式编程片上系统是什么

    嵌入式编程片上系统(Embedded Programmable System-on-Chip,或简称EPSoC)是一种特殊的嵌入式系统,它
    的头像 发表于 03-28 15:33 238次阅读

    嵌入式系统发展前景?

    嵌入式系统发展前景? 嵌入式系统,从定义上来说,是一种专用的计算机系统,它被设计用来控制、监视或者帮助操作一些设备、装置或机器。在过去的几年
    发表于 02-22 14:09

    嵌入式软件开发应该掌握哪些知识?

    掌握的知识 1.基础知识 1.1 c/c++编程语言和数据结构 C/C++ 是嵌入式系统中常用的编程语言,因为它们提供了直接访问硬件的能力。通过使用特定的编译器和调用硬件相关的接口,可
    发表于 02-19 11:23

    嵌入式学习步骤

    语言编写。但是,有些嵌入式系统也使用其他编程语言,例如Python或Java。 (3).了解硬件:深入了解您要控制的硬件设备的功能和特性。您需要了解嵌入式
    发表于 02-02 15:24

    到底要不要放弃嵌入式这条路?

    。 兴趣激发动力 决定是否坚持这条路的重要因素之一就是个人兴趣。如果你对嵌入式技术充满热情,喜欢从事硬件设计、驱动开发、嵌入式系统编程等工作,那么坚持下去是有意义的。兴趣是最好的老师,只有对某个领域
    发表于 12-07 10:43

    C语言嵌入式系统编程修炼之一:背景篇

    电子发烧友网站提供《C语言嵌入式系统编程修炼之一:背景篇.rar》资料免费下载
    发表于 11-17 11:35 1次下载
    C语言<b class='flag-5'>嵌入式</b><b class='flag-5'>系统编程</b>修炼之一:背景篇

    如何成为一名优秀的嵌入式工程师?

    利用指针直接操作内存,这有助于你更高效地使用内存。 3.熟悉数据结构:C语言提供了许多基本的数据结构,如数组、链表、栈、队列等。作为嵌入式工程师,你需要熟悉并掌握这些数据结构的特点和用法,以便在
    发表于 11-07 15:36

    嵌入式系统中,内存不够用了怎么办?

    嵌入式系统中,内存不够用了怎么办? 随着技术的不断发展,微型化、便携化的智能化设备正逐渐成为人们生活中不可或缺的一部分。然而,在这些设备中,嵌入式
    的头像 发表于 10-29 16:33 638次阅读

    嵌入式Linux应用开发的完全手册

    是怎样和硬件发生作用的。 同样,对于想从硬件岗位转到软件岗位的人,对于想从传统单片机(比如51单片机)编程进一·步学习“有操作系统的”嵌入式编程的人,需要找到一个学习的切入点:先掌握各
    发表于 09-25 07:12

    Arm访问内存映射的外围设备

    在大多数Arm嵌入式系统中,外围设备位于内存中的特定地址。通常,将一个C变量映射到内存映射外设的每个寄存器上,然后使用指向该变量的指针来读取和写入寄存器是很方便的。在代码中,您不仅必须
    发表于 08-02 18:26

    SLG47004 在系统编程指南

    SLG47004 在系统编程指南
    发表于 07-04 18:51 0次下载
    SLG47004 在<b class='flag-5'>系统编程</b>指南

    Linux 系统编程的难点是什么

    对于有一定 Linux 开发基础希望进阶学习 Linux 系统编程的开发人员来说,其难点在于,Linux 所囊括的技术点繁杂,往往不知从何下手。
    发表于 06-28 12:54 395次阅读

    嵌入式学习路线你知道吗?

    嵌入式学习路线你知道吗? 1打好嵌入式软件编程的基础 这一阶段重点打好嵌入式软件编程的基础,包括学习Linux
    发表于 06-14 16:00

    嵌入式用什么语言编程?

    具有高级语言的易编程性,具代表性的应用就是UNIX操作系统,从20世纪80年代中期C语言涉足实时系统之后,就受到了普遍的欢迎,是目前使用广泛的嵌入式
    发表于 05-18 10:08

    为什么我们要掌握Linux系统编程

    为什么我们要掌握Linux系统编程
    的头像 发表于 05-17 10:00 612次阅读