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

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

3天内不再提示

在嵌入式C语言中使用结构的方法

h1654155282.3538 来源:EEtoday 作者:EEtoday 2020-11-20 10:22 次阅读

本文将首先解释内存访问粒度概念,以便可以了解处理器如何访问内存。然后,将进一步了解数据对齐的概念,并研究一些示例结构的内存布局。在之前关于嵌入式C中结构的文章中,了解到重新排列结构中成员的顺序可以改变存储结构所需的内存量。还将看到编译器在为结构成员分配内存时具有某些约束。这些约束被称为数据对齐要求,允许处理器以可能出现在存储器布局中的一些浪费空间(称为“填充”)为代价来更有效地访问变量。计算机的内存系统可能比这里介绍的要复杂得多。本文的目标是讨论在编写嵌入式系统时可能有用的一些基本概念。

内存访问粒度

我们通常将内存设想为单字节存储位置的集合,如图1所示。每个位置都有一个唯一的地址,允许我们访问该地址的数据。

图1

但是,处理器通常以大于一个字节的块形式访问内存。例如,处理器可以以四字节块的形式访问内存。在这种情况下,我们可以设想图1中的12个连续字节,如下面的图2所示。

图2

你可能想知道这两种处理内存的方式之间有什么区别。使用图1,处理器一次读取一个字节并向内存写入。请注意,在读取内存位置或写入内存之前,我们需要访问该内存单元,并且每次内存访问都需要一些时间。假设我们想要读取图1中存储器的前八个字节。对于每个字节,处理器需要访问内存并读取它。因此,为了读取前八个字节的内容,处理器将必须访问内存八次。

在图2中,处理器一次读取4个字节并将其写入内存。因此,为了读取前四个字节,处理器访问存储器的地址0并读取四个连续的存储位置(地址0到3)。同样,要读取下一个四字节块,处理器需要再次访问内存。它转到地址4并同时从地址4到7读取存储位置。对于字节大小的块,需要8次内存访问来读取连续8个字节的内存。但是,使用图2,只需要两次内存访问。如上所述,每次内存访问都需要一些时间。由于图2中所示的存储器配置减少了访问次数,因此可以提高处理效率。处理器在访问内存时使用的数据大小称为内存访问粒度。图2描绘了具有四字节存储器访问粒度的系统。

内存访问边界

硬件设计人员经常采用另一种重要技术来提高处理系统的效率:它们限制处理器,使其只能在某些边界访问内存。例如,处理器可能仅能够在四字节边界上访问图2的内存,如图3中的红色箭头所示。

图3

这种边界限制会使系统显着提高效率吗?仔细看看。假设我们需要读取地址为3和4的内存位置的内容(由图3中的绿色和蓝色矩形表示)。如果处理器可以从任意地址开始读取一个四字节的块,那么我们可以访问地址3并通过单个内存访问读取两个所需的内存位置。但是,如上所述,处理器不能直接访问任意地址;相反,它只在某些边界访问内存。那么如果处理器只能访问四字节边界,它将如何读取地址3和4的内容?

由于内存访问边界限制,处理器必须访问地址为0的内存位置并读取连续的四个字节(地址0到3)。接下来,它必须使用移位操作将地址3的内容与其他三个字节(地址0到2)分开。类似地,处理器可以访问地址4并从地址4到7读取另一个四字节块。最后,可以使用移位操作将所需字节(蓝色矩形)与其他三个字节分开。

如果没有内存访问边界限制,可以用一个内存访问读取地址3和地址4。但是,边界限制迫使处理器两次访问存储器。那么,如果数据操作变得更加困难,为什么需要限制对某些边界的内存访问呢?内存访问边界存在限制,因为对地址进行某些假设可以简化硬件设计。例如,假设一个内存块中的所有字节都需要32位来寻址。如果将地址限制为四字节边界,那么32位地址中的两个最低有效位将始终为零(因为地址始终可以被4整除)。因此,我们可以使用30位来寻址一个232字节的内存。

数据对齐

既然已经知道基本处理器如何访问内存,那么下面就可以可以讨论数据对齐要求。通常,任何K字节C数据类型必须具有K的倍数的地址。例如,四字节数据类型只能存储在地址0,4,8,中;它不能存储在地址1,2,3,5。这些限制简化了处理器和内存系统之间的接口硬件的设计。

例如,考虑一个具有四字节内存访问粒度的处理器,它只能以四字节边界访问内存。假设一个四字节变量存储在地址1,如图4所示(四个字节对应四种不同的颜色)。在这种情况下,我们需要两次内存访问和一些额外的工作来读取未对齐的四字节数据(“未对齐”指它被分成两个四字节块)。该过程如图所示。

图4

但是,如果将一个四字节变量存储在4的倍数的任何地址,只需要一个内存访问来修改数据或读取数据。所以将K字节数据类型存储在K的倍数的地址可以提高系统的效率。因此,C语言“char”变量(只需要一个字节)可以存储在任何字节地址,但是一个双字节变量必须存储在偶数地址中。四字节类型必须从可被4整除的地址开始,并且八字节数据类型必须存储在可被8整除的地址。例如,假设在特定机器上,“short”变量需要两个字节,“int”和“float”类型占用四个字节,“long”、“double”指针占用八个字节。这些数据类型中的每一种通常应具有K的倍数的地址,其中K由下表给出。

请注意,不同数据类型的大小可能因编译器和计算机体系结构的不同而不同。sizeof()运算符是查找数据类型实际大小的最佳方法。
责任编辑人:CC

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

    关注

    4975

    文章

    18225

    浏览量

    287637
  • C语言
    +关注

    关注

    180

    文章

    7519

    浏览量

    126770
收藏 人收藏

    评论

    相关推荐

    嵌入式入门学习书籍

    基础。第2章~第5章讲解了嵌入式Linux C语言中的基础知识。包括嵌入式Linux C语言中
    发表于 01-08 15:28

    C语言入门书籍《嵌入式Linux C语言程序设计基础教程》全本下载!!

    的数据、数据的输入和输出、运算符和表达式、程序结构和控制语句。第6章到主要讲解了嵌入式Linux C语言中的数组,包括一维数组、多维数组、字符数组和字符串等。第7章主要讲解了
    发表于 03-02 17:09

    (精彩帖子合集)国外大牛带你入门嵌入式C语言

    ?了解内存:如何在嵌入式C语言中使结构学习嵌入式C编程语言
    发表于 09-09 16:09

    【原创分享】如何学好嵌入式系统中的C语言编程

    打交道,所以一个嵌入式软件的程序员应该对这些问题了如指掌。3、认识和掌握C语言中的常见陷阱C语言不是一门面向初学者的编程
    发表于 09-28 20:37

    嵌入式C语言C语言的区别

    嵌入式C语言C语言的区别:最常用的系统编程语言C
    发表于 10-27 06:52

    嵌入式C语言的相关资料分享

    为了方便大家平时公交、地铁、外出办事也能用手机回顾查看文章,我特意用心精选,并分类整理了部分文章:嵌入式C语言中嵌套汇编代码C语言 vola
    发表于 10-28 06:51

    嵌入式C基础知识知识点汇总

    前言本人今天刚开始学stm32,嵌入式C是stm32学习的基础,先贴张嵌入式开发的技能树:一、位运算C语言中的位运算操作命令
    发表于 12-15 09:04

    嵌入式C语言中__I,__O,__IO的相关资料下载

    嵌入式C语言中__I,__O,__IO简介__I,__O,__IO代码中的定义这是ST库里面的宏定义,定义如下:#define __I volatileconst /*!
    发表于 12-15 06:23

    如何解决嵌入式C语言中CAN报文字节序问题

    本文转载我的微信公众号:古德曼汽车工业。希望关注本专栏的朋友,也能一并关注微信公众号。原文地址:嵌入式C语言中CAN报文字节序问题的处理方法
    发表于 12-15 07:55

    C语言中使嵌入式SQL访问Oracle数据库的方法

    使用C语言开发Oracle应用程序通常有两种方法。一是利用嵌入式SQL语言,将SQL作为子语言
    发表于 12-15 06:35

    嵌入式开发选择C语言的原因是什么

    一些复杂的功能,但是汇编比C语言访问硬件的效率更高。所以,一般将硬件初始化的工作交给汇编,比较复杂的操作交给C语言。③C
    发表于 12-15 08:01

    C语言中的宏是什么

    第五章 性能优化5.1 使用宏定义  C语言中,宏是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数
    发表于 12-15 08:20

    嵌入式SQL语言概述

    嵌入式SQL概述嵌入式SQL语言将SQL语言嵌入到某一种高级语言中使用这种高级
    发表于 12-21 06:55

    嵌入式C语言的知识点汇总,绝对实用

    了一些这方面的经验和思考,就希望总结下来,系统的阐述嵌入式C语言的重要知识点,就是这篇文章的由来。本文以自己嵌入式上的实践为基础,
    发表于 02-17 06:10

    嵌入式C语言进阶之道

    的。问题是,若是我不愿意只是当一个小菜鸟,我想对嵌入式 C 语言有 更多更深的了解时,我突然发现,满图书馆的书,竟找不到一本,能解我心头之惑。 对于实际工作当中, 你不再是独自编写程
    发表于 04-19 10:15