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

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

    关注

    5086

    文章

    19141

    浏览量

    305937
  • C语言
    +关注

    关注

    180

    文章

    7606

    浏览量

    137051

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

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

收藏 人收藏

    评论

    相关推荐

    新手怎么学嵌入式?

    嵌入式系统的发展,嵌入式操作系统也变得越来越重要。学习嵌入式操作系统可以帮助你更好地管理
    发表于 12-12 10:51

    嵌入式系统开发与硬件的关系 嵌入式系统开发常见问题解决

    系统开发与硬件关系的几个关键点: 硬件依赖性 :嵌入式系统的软件必须能够在特定的硬件上运行,这包括处理器、内存、输入/输出接口等。软件必须能够充分利用硬件的特性,同时绕过其限制。 资源
    的头像 发表于 12-09 09:38 291次阅读

    ARM嵌入式系统内存对齐的重要性

    嵌入式系统软件开发,经常在代码中看到各种各样的对齐,很多时候我们都是知其然不知其所以然,知道要做好各种对齐,但是不明白为什么要对齐,不
    的头像 发表于 11-11 17:17 899次阅读
    ARM<b class='flag-5'>嵌入式</b><b class='flag-5'>系统</b>中<b class='flag-5'>内存</b><b class='flag-5'>对齐</b>的重要性

    嵌入式 Linux 操作系统配置

    随着物联网(IoT)和智能设备的快速发展,嵌入式系统在各个领域扮演着越来越重要的角色。Linux因其开源、灵活和稳定的特性,成为嵌入式系统的首选操作
    的头像 发表于 11-06 10:22 450次阅读

    嵌入式常用数据结构有哪些

    嵌入式编程中,数据结构的选择和使用对于程序的性能、内存管理以及开发效率都具有重要影响。嵌入式系统由于资源受限(如处理器速度、
    的头像 发表于 09-02 15:25 501次阅读

    嵌入式系统怎么学?

    一系列课程和技术,包括但不限于以下内容: 1、基础知识:学习计算机组成原理、数字威廉希尔官方网站 、模拟威廉希尔官方网站 等基础知识,建立对计算机硬件的认知与理解。 2、编程语言:掌握至少一种嵌入式系统常用的编程
    发表于 07-02 10:10

    如何提升嵌入式编程能力?

    代码以提高性能,包括减少内存使用、提高处理速度等。 16. 调试技巧:掌握嵌入式系统的调试技巧,包括使用调试器、日志记录和性能分析工具。 17. 参加竞赛和挑战:参加编程竞赛或黑客马拉
    发表于 06-21 10:01

    嵌入式系统的外设器件选择

    作者:DigiKey Editor 嵌入式系统除了最重要的为处理器选择之外,配合的相关外设器件也是嵌入式系统的重要组成部分,包括内存、时钟(
    的头像 发表于 05-05 09:38 923次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系统</b>的外设器件选择

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

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

    嵌入式fpga是什么意思

    嵌入式FPGA是指将FPGA技术集成到嵌入式系统中的一种解决方案。嵌入式系统是一种为特定应用而设计的计算机
    的头像 发表于 03-15 14:29 1281次阅读

    fpga是嵌入式

    FPGA(现场可编程门阵列)不是嵌入式系统,但FPGA在嵌入式系统中有着重要的应用。
    的头像 发表于 03-14 17:19 2356次阅读

    fpga与嵌入式的区别 嵌入式和fpga开发有什么关系

    fpga与嵌入式的区别 FPGA与嵌入式系统在设计和应用上存在一些关键的区别,具体如下: 灵活性:FPGA具有高度的灵活性,可以根据需要重新编程以实现不同的功能。而
    的头像 发表于 03-14 17:04 6929次阅读

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

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

    嵌入式学习步骤

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

    嵌入式系统的应用实例

    嵌入式系统的三个基本要素是嵌入性、专用性与计算机系统
    的头像 发表于 01-22 09:57 1087次阅读