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

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

    关注

    5186

    文章

    20165

    浏览量

    329041
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144651

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    嵌入式应掌握的几种能力

    1. 编程语言 基本掌握嵌入式必备的编程语言。C语言为主,C++为辅。在资源有限的情况下,大多数嵌入式产品还是使用C语言为主的,特别是底层驱动开发。上层应用开发大多用C,在一些资源比
    发表于 12-08 06:05

    CW32嵌入式软件开发的必备知识

    嵌入式系统中最常用的编程语言,因为它们提供了直接访问硬件的能力,并且代码执行效率高。 了解汇编语言,用于编写底层驱动、中断处理程序以及性能要求极高的代码段。 对其他编程语言如Pytho
    发表于 11-28 07:48

    嵌入式和FPGA的区别

    ,FPGA凭借硬件并行处理能力,能够实现纳秒级响应,远优于微秒级的嵌入式系统。 功耗效率上,嵌入式系统针对特定应用优化后能效比很高,而FPGA由于可
    发表于 11-19 06:55

    2025年最佳的嵌入式编程语言有哪些呢?

    嵌入式系统是现代科技不可或缺的一部分。它们存在于家用电器、汽车、住宅、医院、商店等各个领域。它们与我们的社会紧密相连。选择合适的语言来构建嵌入式系统对于成功至关重要。那么,2025年最
    的头像 发表于 11-14 10:27 916次阅读
    2025年最佳的<b class='flag-5'>嵌入式</b><b class='flag-5'>编程</b>语言有哪些呢?

    嵌入式开发的关键点介绍

    嵌入式开发在现代科技中扮演着非常重要的角色。随着物联网的发展,嵌入式系统的需求也越来越大。嵌入式开发不仅需要开发人员具备深入的硬件知识和编程
    发表于 11-13 08:12

    嵌入式实时操作系统的特点

    操作系统具备高效的中断处理机制,能够快速响应和处理系统的中断事件。 资源管理:实时嵌入式操作系统提供有效的资源管理机制,包括内存管理、设备驱
    发表于 11-13 06:30

    嵌入式需要掌握哪些核心技能?

    : 1)C语言与底层编程 核心地位:C语言是嵌入式开发的基石,需精通指针操作、内存管理、位运算,直接操控硬件资源。 延伸技能:C++用于复杂项目架构设计,汇编语言优化底层性能(如启动代码、中断处理
    发表于 10-21 16:25

    入行嵌入式应该怎么准备?

    知识: 一、C/C++编程C/C++是嵌入式系统开发中最常用的编程语言。熟练掌握C/C++语言将使你能够理解和编写底层驱动程序、操作系统
    发表于 08-06 10:34

    Linux嵌入式和单片机嵌入式的区别?

    : 单片机嵌入式 :开发环境相对简单,通常使用C语言或汇编语言进行编程,开发工具包括Keil、IAR等。 Linux嵌入式 :开发环境较为复杂,除了需要掌握C语言,还需要了解Linux操作
    发表于 06-20 09:46

    嵌入式开发入门指南:从零开始学习嵌入式

    特定功能的计算机系统,广泛应用于智能家居、工业控制、医疗设备、车载系统等领域。 2. 学习嵌入式开发的前置知识熟悉C语言编程掌握基本的数据结构与算法了解数字电路与微控制器原理熟悉Lin
    发表于 05-15 09:29

    嵌入式编程设计模式

    嵌入式编程设计模式,介绍如何使用设计模式为嵌入式系统创建高效且优化的C语言设计。 纯分享贴,有需要可以直接下载附件获取完整资料! (如果内容有帮助可以关注、点赞、评论支持一下哦~
    发表于 04-15 14:47

    C语言中结构体与联合体的深度解析:内存布局与应用场景

    在于对内存的极致操控。结构体构建数据实体,联合体实现内存复用,二者的组合使用能创造出强大的数据结构。掌握它们的底层原理,配合内存分析工具(如Valgrind、GDB),将助你在嵌入式
    发表于 04-08 09:18

    嵌入式主板的概述与发展

    未来发展趋势进行深入探讨。嵌入式主板的基本概念嵌入式主板是指为嵌入式系统设计的电路板,它通常集成了微处理器、内存、输入输出接口等关键组件。与
    的头像 发表于 01-13 16:30 1191次阅读
    <b class='flag-5'>嵌入式</b>主板的概述与发展

    为什么嵌入式驱动开发工程师可以拿高薪?

    场景下可以提供额外的优势。 熟练使用C/C++进行嵌入式系统编程,便于理解内存管理、指针、数据结构等高级特性。 3)项目实践: 通过动手做项目来积累经验,这是嵌入式工作经验积累的重要
    发表于 01-07 16:56

    新手怎么学嵌入式?

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