`

32位嵌入式系统的字节对齐的概念

阅读更多

  这几天用2440读写SD卡(FAT32文件系统),定义了个文件信息的数据结构里边数据类型有unsigned char, unsigned int, unsigned long几种,在从SD卡上读取数据的时候,直接将结构体对象的引用传入读取数据的函数时,发现结构体的数据并不是按照想象的一样。分析原因是32为嵌入式字节对齐出了问题。现将相关的资料总结一下:

     首先,声明几个概念:

(1)、对象:在C语言中使用结构体类型、共同体类型、或内部基本类型所定义的变量或常量,就称为对象。对象占据了一块实际的存储器空间,这块空间有固定的起始地址和字节数。

(2)、引用:使用对象有两种方法:“对象名”和“引用”。当你在源代码中定义一个对象时,编译器就会为它分配一块存储器,此时,我们就可以使用“对象名”来操作该对象。但是对于程序运行时动态分配的某一块存储器空间(对象),就没法使用“对象名”了,而只能使用“引用”。所以,“引用”就是指向特定类型的对象的指针。  

    在32位嵌入式系统中,单字节对象是1字节对齐的;双字节对象是2字节对齐的;四字节对象是4字节对齐的;其它结构体或共同体对象是8字节对齐的。也就是说:

    (1)在定义一个单字节对象时,该对象的起始地址可以是任何整数;

    (2)定义一个双字节对象时,该对象的起始地址必定是2的倍数的整数;

    (3)定义一个四字节对象时,该对象的起始地址必定是4的倍数的整数;

    (4)定义一个结构体或共同体对象时,该对象的起始地址必定是8的倍数的整数。

    以上说的对象包括“结构体或共同体对象的成员对象”。

字节对齐的故障只能出现在“引用”的使用过程中。当使用“对象名”来操作对象时,根本不用担心字节对齐问题。

   在ADS环境下,有“ALIGN 、“__align(x) 、“__packed”关键字用于字节对齐处理。ALIGN用于汇编语言,__align(x)用于C语言,__packed用于放弃字节对齐。

    单字节对齐类型的引用可以操作任何对象,双字节对齐类型的引用可以操作双字节、四字节、八字节对齐的对象,…………。只有遵守这个规则,程序才可能是健壮的。

    如果我们想使用双字节对齐类型的引用来操作单字节对齐对象,那么你在定义该引用时必须使用__packed关键字!

分享到:
评论
1 楼 agurick 2009-04-05  
在这种系统上,无论是全局变量,局部变量,还是堆上申请的内存基本都会保证字节对齐要求。我的经验有两点,1 定义结构体时,按照字段长度,从大到小安排,不要一个长一个短的定义。2.用指针乱指到一块内存中间,再做强制转换,多半程序因为字节对齐挂都是因为这种情况。

相关推荐

    嵌入式编程规范 字节对齐

    嵌入式编程规范 字节对齐 嵌入式编程规范 字节对齐 嵌入式编程规范 字节对齐 嵌入式编程规范 字节对齐

    嵌入式Linux C编程入门(第2版) PPT

    第1章 嵌入式系统基础知识 .1 1.1 嵌入式系统概述 1 1.1.1 嵌入式系统的发展史 2 1.1.2 嵌入式系统的定义与特点 3 1.1.3 嵌入式系统的特点 4 1.2 嵌入式系统的组成 5 1.2.1 嵌入式系统的硬件架构...

    嵌入式系统/ARM技术中的ARM嵌入式软件编程经验谈

    作者:孙天泽,华清远见嵌入式培训中心品牌讲师。    ARM 系列处理器是 RISC (Reducded Instruction Set Computing)处理器。很多基于ARM的高效代码的程序设计策略都源于RISC 处理器。和很多 RISC 处理器一样,...

    【嵌入式】之中兴嵌入式培训-嵌入式软件易于出错问题分析

    嵌入式软件易于出错问题分析 1.全局符号 可重定位目标文件 可执行目标文件 全局符号强弱对碰问题 全局变量共享访问和死锁问题 2.堆栈帧 PowerPC堆栈帧结构 X86堆栈帧结构 计算堆栈帧链大小 3.字节顺序+字节...

    深入理解嵌入式开发之系统开发篇全覆盖

    Tp01.struct的使用,及字节对齐;struct和class的差别与联系;struct中指针的危险性。 Tp02.extern C修饰的作用及头文件宏保护。 Tp03.变量a的定义 Tp04.static的作用。 Tp05.volatile Tp06.位操作 Tp07.中断...

    FastLZ:小型便携式字节对齐LZ77压缩

    FastLZ:小型便携式字节对齐LZ77压缩

    嵌入式linux开发教程之移植的理论--千锋培训

    文档介绍了移植的基本概念,嵌入式linux开发教程之Linux硬件平台,硬件平台对C程序的影响,嵌入式linux开发教程之数据对齐,字节顺序,时间,内存页面大小,嵌入式linux开发教程之Linux操作系统移植,Linux内核的...

    嵌入式系统/ARM技术中的ARM伪指令之地址读取:ADR ADRL LDR

    1、ADR伪指令--- 小范围的地址读取  ADR伪指令将基于PC相对偏移的地址值或基于... 当地址值是字节对齐时,其取指范围为: +255 ~ 255B;  当地址值是字对齐时,其取指范围为: -1020 ~ 1020B;  2、ADRL伪指

    (中兴通讯内部培训)嵌入式软件易于出错问题分析专题(2).ppt

    1.全局符号 可重定位目标文件 可执行目标文件 全局符号强弱对碰问题 全局变量共享访问和死锁问题 ...3.字节顺序+字节对齐+数据不一致引用 字节顺序 字节对齐 数据不一致引用 综合症问题 4.易出错问题总结

    嵌入式软件设计基础之 --位域--

    在编写嵌入式代码时。常用结构体类型,内存分配时需要注意字节对齐、编译器等,最近发现,结构体中还有一种用法叫做--位域--。​

    嵌入式系统/ARM技术中的CPU学习 (Cache Coherence)

    在2004年写的一篇文章X86汇编语言学习手记(1)中,曾经涉及到gcc编译的代码默认16字节栈对齐的问题。之所以这样做,主要是性能优化方面的考虑。  大多数现代CPU都One-die了L1和L2Cache。对于L1 Cache,大多是write ...

    FatFS文件系统函数说明

    FATFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块,本文主要介绍相关的函数及使用方法

    【STM32】HAL库-CRC校验demo

    采用STM32F103C8T6单片机,KeilMDK5.32版本 在串口输出数据之前,对数据进行CRC校验,并将数据进行4字节对齐(因为CRC校验是对字进行校验)

    at91sam7s64(中文说明书)

    – 高性能的32位RISC架构 – 高密度的16位指令集 – 性能/ 功耗( MIPS/Watt ) 的领先者 – 嵌入式ICE 电路仿真,支持调试通讯 • 64K 字节的片内高速Flash 存储器,共512 页,每页128 字节 – 在最坏的条件下可以30 ...

    c++ 面试题 总结

    15.用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数 A1: 16位的系统下, int i = 65536; cout ; // 输出0; int i = 65535; cout ; // 输出-1; 32位的系统下, int i = 65536; cout ; ...

    关于结构体数据存储的对齐问题

     首先应该明白基本的类型在内存中的大小,char型一般占有1个字节,int型一般占有4个字节,double型一般占有8个字节,short则占有2个字节(当然也会存在一定的变化,具体情况依据编译器决定)。我们都知道C语言的...

    AT91SMA7S64中文手册

    – 高性能的32 位RISC架构 – 高密度的16 位指令集 – 性能/功耗(MIPS/Watt) 的领先者 – 嵌入式ICE电路仿真,支持调试通讯 • 64K 字节的片内高速Flash存储器,共512 页,每页128 字节 – 在最坏的条件下可以30 MHz...

    ARM嵌入式软件编程经验谈

    ARM系列处理器是 RISC (Reducded InSTructiON Set Computing)处理器。很多基于ARM的高效代码的程序设计策略都源于RISC 处理器。...存取“字节(Byte)”数据时要求该数据按其自然尺寸边界(Natural Size Boundary)定位。

    c/c++ 学习总结 初学者必备

     \xhh 任意字符 二位十六进制  字符型常量  字符型常量所表示的值是字符型变量所能包含的值。我们可以用ASCII表达式来表示一个字符型常量,或者用单引号内加反斜杠表示转义字符。  'A', '\x2f', '\013';  ...

    magic-latex-buffer:LaTeX模式缓冲区的神奇语法高亮显示

    由iimage-mode支持的嵌入式图像预览 修复带有多字节字符的文档的行内数学突出显示 安装 安装支持许多符号的unicode字体(例如Symbolas,Unifont等)。 将magic-latex-buffer.el放入“加载路径”目录中,并将其加载...

Global site tag (gtag.js) - Google Analytics