这几天用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章 嵌入式系统基础知识 .1 1.1 嵌入式系统概述 1 1.1.1 嵌入式系统的发展史 2 1.1.2 嵌入式系统的定义与特点 3 1.1.3 嵌入式系统的特点 4 1.2 嵌入式系统的组成 5 1.2.1 嵌入式系统的硬件架构...
作者:孙天泽,华清远见嵌入式培训中心品牌讲师。 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压缩
文档介绍了移植的基本概念,嵌入式linux开发教程之Linux硬件平台,硬件平台对C程序的影响,嵌入式linux开发教程之数据对齐,字节顺序,时间,内存页面大小,嵌入式linux开发教程之Linux操作系统移植,Linux内核的...
1、ADR伪指令--- 小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于... 当地址值是字节对齐时,其取指范围为: +255 ~ 255B; 当地址值是字对齐时,其取指范围为: -1020 ~ 1020B; 2、ADRL伪指
1.全局符号 可重定位目标文件 可执行目标文件 全局符号强弱对碰问题 全局变量共享访问和死锁问题 ...3.字节顺序+字节对齐+数据不一致引用 字节顺序 字节对齐 数据不一致引用 综合症问题 4.易出错问题总结
在编写嵌入式代码时。常用结构体类型,内存分配时需要注意字节对齐、编译器等,最近发现,结构体中还有一种用法叫做--位域--。
在2004年写的一篇文章X86汇编语言学习手记(1)中,曾经涉及到gcc编译的代码默认16字节栈对齐的问题。之所以这样做,主要是性能优化方面的考虑。 大多数现代CPU都One-die了L1和L2Cache。对于L1 Cache,大多是write ...
FATFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块,本文主要介绍相关的函数及使用方法
采用STM32F103C8T6单片机,KeilMDK5.32版本 在串口输出数据之前,对数据进行CRC校验,并将数据进行4字节对齐(因为CRC校验是对字进行校验)
– 高性能的32位RISC架构 – 高密度的16位指令集 – 性能/ 功耗( MIPS/Watt ) 的领先者 – 嵌入式ICE 电路仿真,支持调试通讯 • 64K 字节的片内高速Flash 存储器,共512 页,每页128 字节 – 在最坏的条件下可以30 ...
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语言的...
– 高性能的32 位RISC架构 – 高密度的16 位指令集 – 性能/功耗(MIPS/Watt) 的领先者 – 嵌入式ICE电路仿真,支持调试通讯 • 64K 字节的片内高速Flash存储器,共512 页,每页128 字节 – 在最坏的条件下可以30 MHz...
ARM系列处理器是 RISC (Reducded InSTructiON Set Computing)处理器。很多基于ARM的高效代码的程序设计策略都源于RISC 处理器。...存取“字节(Byte)”数据时要求该数据按其自然尺寸边界(Natural Size Boundary)定位。
\xhh 任意字符 二位十六进制 字符型常量 字符型常量所表示的值是字符型变量所能包含的值。我们可以用ASCII表达式来表示一个字符型常量,或者用单引号内加反斜杠表示转义字符。 'A', '\x2f', '\013'; ...
由iimage-mode支持的嵌入式图像预览 修复带有多字节字符的文档的行内数学突出显示 安装 安装支持许多符号的unicode字体(例如Symbolas,Unifont等)。 将magic-latex-buffer.el放入“加载路径”目录中,并将其加载...