这几天用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关键字!
分享到:
相关推荐
在嵌入式系统开发过程中,为了提高程序运行效率以及内存利用效率,字节对齐(Byte Alignment)是一个非常重要的概念。字节对齐是指在计算机内存中,数据结构中的各个成员变量在内存中的地址必须满足某种特定的规则,...
通过理解CRC的工作原理、字节对齐和大小端概念,开发者可以创建高效且跨平台兼容的CRC32校验解决方案。而提供的"CRC32验证程序"则是实现这一目标的实际工具,可以帮助工程师测试和调试他们的CRC32实现。
在计算机科学中,字节对齐(Byte Alignment)是一个至关重要的概念,特别是在处理数据结构,如结构体(Structures)时。它涉及到内存管理和效率优化,确保数据在内存中的存储方式能够快速有效地被处理器访问。以下是...
但需要注意的是,如果对齐方式设置得过于宽松,比如在32位系统上使用8字节对齐,则可能造成内存空间的浪费。因此,在设计程序时,应该在保证效率的前提下,尽量减少内存的占用,这样可以充分利用系统资源,提高程序...
在计算机系统中,数据通常是以字节为单位存储的,但处理器在读取和写入数据时,倾向于按照特定的宽度进行,例如4字节(32位)或8字节(64位)。4字节对齐意味着内存分配时确保每个数据对象的地址能被4整除,这样可以...
ARM处理器采用RISC(精简指令集计算)设计,具有THUMB指令集,允许在16位和32位指令之间切换,以平衡代码大小和执行效率。ARM处理器还采用了指令流水线技术,哈佛结构以提升数据和指令的并行处理能力,以及Cache和...
嵌入式系统研究生课程主要关注的是嵌入式系统的高级学习,特别是与32位嵌入式微处理器相关的知识,特别是ARM架构。ARM处理器是嵌入式领域中的主流选择,其低功耗、高性能的特性使其在众多应用中得到广泛应用。 ARM...
在实践中,理解内存管理和8字节对齐对于优化嵌入式系统的性能至关重要。例如,通过合理配置内存池大小和对齐方式,可以减少内存碎片,提高内存利用率;而遵循正确的对齐规则,则可以避免不必要的性能损失,确保程序...
### C++内存中字节对齐问题详解 #### 一、什么是字节对齐,为什么要对齐? 在C++及其它编程语言中,字节对齐...在某些场景下,如嵌入式系统开发或高性能计算应用,对字节对齐的深入理解甚至可以成为性能优化的关键。
然而,ARM架构的处理器在默认情况下,使用"LDR"和"STR"指令对32位数据进行读写时要求数据地址必须是4字节对齐的,否则会导致异常。 针对这个问题,我们需要编写两条宏定义指令"**LDRUA**"和"**STRUA**",它们能在...
在嵌入式系统开发中,尤其是在使用ARM处理器的场景下,数据的字节对齐问题是一个非常重要但又容易被忽视的细节。本篇文章将深入探讨ARM程序中关于字/半字/字节对齐的问题,并通过具体的示例来帮助理解这一概念。 ##...
ARM嵌入式系统基础知识主要涵盖嵌入式系统的基本概念、嵌入式处理器的分类与特点、实时操作系统的要求、以及ARM处理器的架构和特性。以下是详细的知识点解析: 1. **嵌入式系统**:嵌入式系统是专为特定应用而设计...
ARM状态:处理器执行32位字对齐方式的ARM指令,每条ARM指令长度为32位,指令的功能强大,处理器默认为此状态。Thumb状态:处理机执行16位半字对齐方式的Thumb,每条Thumb指令长度为16位,是ARM指令功能的子集。 ...
在嵌入式系统和实时操作系统(RTOS)如uC/OS(通常简称为ucos)中,内存管理和堆栈管理是非常关键的环节。字节对齐是优化内存访问效率的一种策略,尤其对于浮点数运算而言更为重要。本文将深入探讨ucos中堆栈字节...