对ARM处理器的内存对齐问题
时间:11-09
来源:互联网
点击:
其结果是,存储器被字节逐字节,避免任何疑问对准。
包装的编译器指令
或者,我们可以使用压缩的编译器指令允许使用指针,直接将我们需要的数据,同时迫使编译器来处理对齐问题。在BREW环境中,PACKED被定义如下:
代码:
#ifdef __ARMCC_VERSION #define PACKED __packed #else #define PACKED #endif
包装形式,通过指定一个指针,ARM编译器将生成相应的说明来正确地访问内存,无论对齐。修改后的版本,上面的例子中,使用PACKED指针,如下:
代码:
#define INFOHEADER_OFFSET (sizeof(HEADER)) #define WIDTH_OFFSET (INFOHEADER_OFFSET + offsetof(INFOHEADER, width)) #define HEIGHT_OFFSET (INFOHEADER_OFFSET + offsetof(INFOHEADER, height)) PACKED uint32 * pImageWidth; PACKED uint32 * pImageHeight; uint32 imageWidth, imageHeight; void * fileBuf; pMe->mFile = IFILEMGR_OpenFile(pMe->mFileMgr, "test.bmp", _OFM_READ); if (pMe->mFile) { IFILE_GetInfo(pMe->mFile, &fileInfo); fileBuf = MALLOC(fileInfo.dwSize); if (fileBuf) { result = IFILE_Read(pMe->mFile, fileBuf, fileInfo.dwSize); if (result == fileInfo.dwSize) { pImageWidth = (uint32*)(((byte*)fileBuf) + WIDTH_OFFSET); pImageHeight = (uint32*)(((byte*)fileBuf) + HEIGHT_OFFSET); imageWidth = *pImageWidth; imageHeight = *pImageHeight; } } }
虽然程序员通常会无法控制标准化的数据格式,如BMP头在上面的例子中,当你定义自己的数据结构应确保奠定了良好的对齐方式中的数据定义对齐的数据结构。下面的基本示例演示了这样的原则:
代码:
#ifdef __ARMCC_VERSION typedef PACKED struct { short a; // offsetof(a) = 0 int b; // offsetof(b) = 2 ? misalignment problem! short c; // offsetof(c) = 6 } BAD_STRUCT; typedef struct { int b; // offsetof(b) = 0 ? no problem! short a; // offsetof(a) = 4 short c; // offsetof(c) = 6 } GOOD_STRUCT;
通过简单地重新排列中,我们声明的结构成员,我们可以解决一些对齐的问题。另外请注意,如果未声明为包装,BAD_STRUCT,编译器通常会插入填充,每个字段对齐。然而,这通常是不希望的,因为它浪费内存和避免几乎总是可以简单地通过声明为了减小尺寸的字段。
BREW模拟器测试
BREW模拟器3.1.2及以上版本提供了能够使数据对齐检查。BREW模拟器启用此功能时,将显示一个对话框,通知您的每一个未对齐的内存访问,并为您提供的选项对这一问题视而不见,或闯入的代码,请参阅BREW SDK用户文档一节揗isaligned数据异常支持更多信息,此功能。注:由于x86架构的访问未对齐的数据不会有任何问题,你可以不编译模拟器的DLL使用__packed指令(PACKED这就是为什么在WIN32环境下的空白被定义为)。这意味着,通过使用PACKED指针的非对齐访问,解决依旧会触发在模拟器的对齐检查。
ARM处理器内存对 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)