zoukankan      html  css  js  c++  java
  • __align(num) 分析

    这几天用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.__align(num)   
            这个用于修改最高级别对象的字节边界。在汇编中使用LDRD或者STRD时   
            就要用到此命令__align(8)进行修饰限制。来保证数据对象是相应对齐。   
            这个修饰对象的命令最大是8个字节限制,可以让2字节的对象进行4字节   
            对齐,但是不能让4字节的对象2字节对齐。   
            __align是存储类修改,他只修饰最高级类型对象不能用于结构或者函数对象。   
              
      2.__packed     
          __packed是进行一字节对齐   
          1.不能对packed的对象进行对齐   
          2.所有对象的读写访问都进行非对齐访问   
          3.float及包含float的结构联合及未用__packed的对象将不能字节对齐   
          4.__packed对局部整形变量无影响   
          5.强制由unpacked对象向packed对象转化是未定义,整形指针可以合法定   
          义为packed。   

  • 相关阅读:
    秒杀系统性能测试和优化
    性能测试分析过程(三)linux下查看最消耗CPU/内存的进程
    [改善Java代码]注意方法中传递的参数要求(replaceAll和replace的区别)
    [改善Java代码]由点及面,一叶知秋----集合大家族
    [改善Java代码]非稳定排序推荐使用List
    [改善Java代码]多线程使用Vector或HashTable
    [改善Java代码]减少HashMap中元素的数量
    [改善Java代码]使用shuffle打乱列表
    [改善Java代码]集合运算时使用更优雅的方式
    [改善Java代码]集合中的元素必须做到compareTo和equals同步
  • 原文地址:https://www.cnblogs.com/alan666/p/8312274.html
Copyright © 2011-2022 走看看