模块((__packed__)) 求助,望尽快帮忙[求助]

我把模块调试出来了,可是在整合的时候遇到问题了 也就是一个大的union函数,我觉得应该加__packed__,可是加了反而出错,是为什么呢?? 原先的函数: typedef union _CMD_PARAM { struct { unsigned char mBuffer[ MAX_PATH_LEN ]; } Other; struct { unsigned long mDiskSizeSec; /* 返回: 整个物理磁盘的总扇区数 */ unsigned long mTotalSector; /* 返回: 当前逻辑盘的总扇区数 */ unsigned long mFreeSector; /* 返回: 当前逻辑盘的剩余扇区数 */ unsigned char mDiskFat; /* 返回: 当前逻辑盘的FAT类型 */ } Query; /* CMD_DiskQuery, 查询磁盘信息 */ struct { unsigned char mPathName[ MAX_PATH_LEN ]; /* 输入参数: 路径: [盘符,冒号,斜杠,目录名或者文件名及扩展名...,结束符00H], 其中盘符和冒号可以省略, 例如"C:\DIR1.EXT\DIR2\FILENAME.EXT",00H */ } Open; /* CMD_FileOpen, 打开文件 */ struct { unsigned char mPathName[ MAX_PATH_LEN ]; /* 输入参数: 路径: [盘符,冒号,斜杠,目录名或者文件名及扩展名(含通配符*)...,枚举序号], 其中盘符和冒号可以省略, 例如"C:\DIR1.EXT\DIR2\FILE*",00H */ } Enumer; /* CMD_FileEnumer, 枚举文件,返回文件名 */ struct { unsigned char mUpdateLen; /* 输入参数: 是否允许更新长度: 0禁止,1允许 */ } Close; /* CMD_FileClose, 关闭当前文件 */ struct { unsigned char mPathName[ MAX_PATH_LEN ]; /* 输入参数: 路径: [盘符,冒号,斜杠,目录名或者文件名及扩展名...,结束符00H], 其中盘符和冒号可以省略, 例如"C:\DIR1.EXT\DIR2\FILENAME.EXT",00H */ } Create; /* CMD_FileCreate, 新建文件并打开,如果文件已经存在则先删除后再新建 */ struct { unsigned char mPathName[ MAX_PATH_LEN ]; /* 输入参数: 路径: [盘符,冒号,斜杠,目录名或者文件名及扩展名...,结束符00H], 其中盘符和冒号可以省略, 例如"C:\DIR1.EXT\DIR2\FILENAME.EXT",00H */ } Erase; /* CMD_FileErase, 删除文件并关闭 */ struct { unsigned long mFileSize; /* 输入参数: 新的文件长度,为0FFFFFFFFH则不修改, 返回: 原长度 */ unsigned short mFileDate; /* 输入参数: 新的文件日期,为0FFFFH则不修改, 返回: 原日期 */ unsigned short mFileTime; /* 输入参数: 新的文件时间,为0FFFFH则不修改, 返回: 原时间 */ unsigned char mFileAttr; /* 输入参数: 新的文件属性,为0FFH则不修改, 返回: 原属性 */ } Modify; /* CMD_FileQuery, 查询当前文件的信息; CMD_FileModify, 查询或者修改当前文件的信息 */ struct { unsigned long mSectorOffset; /* 输入参数: 扇区偏移,0则移动到文件头,0FFFFFFFFH则移动到文件尾, 返回: 当前文件指针对应的绝对线性扇区号, 0FFFFFFFFH则已到文件尾 */ } Locate; /* CMD_FileLocate, 移动当前文件指针 */ struct { unsigned char mSectorCount; /* 输入参数: 读取扇区数, 返回: 实际读取扇区数 */ } Read; /* CMD_FileRead, 从当前文件读取数据 */ struct { unsigned char mSectorCount; /* 输入参数: 写入扇区数, 返回: 实际写入扇区数 */ } Write; /* CMD_FileWrite, 向当前文件写入数据 */ struct { unsigned long mDiskSizeSec; /* 返回: 整个物理磁盘的总扇区数 */ } DiskSize; /* CMD_DiskSize, 查询磁盘容量 */ struct { unsigned long mByteOffset; /* 输入参数: 以字节为单位的偏移量, 以字节为单位的文件指针, 返回: 当前文件指针对应的绝对线性扇区号, 0FFFFFFFFH则已到文件尾 */ } ByteLocate; /* CMD_ByteLocate, 以字节为单位移动当前文件指针 */ struct { unsigned char mByteCount; /* 输入参数: 准备读取的字节数,不得大于MAX_BYTE_IO, 返回: 实际读出的字节数 */ unsigned char mByteBuffer[ MAX_BYTE_IO ]; /* 返回: 读出的数据块 */ } ByteRead; /* CMD_ByteRead, 以字节为单位从当前文件读取数据块 */ struct { unsigned char mByteCount; /* 输入参数: 准备写入的字节数,不得大于MAX_BYTE_IO,如果为0则刷新文件长度而不写入,如果不为0则写入数据但不刷新文件长度, 返回: 实际写入的字节数 */ unsigned char mByteBuffer[ MAX_BYTE_IO ]; /* 输入参数: 准备写入的数据块 */ } ByteWrite; /* CMD_ByteWrite, 以字节为单位向当前文件写入数据块 */ union { struct { unsigned long mCBW_Sig; unsigned long mCBW_Tag; unsigned char mCBW_DataLen; /* 输入: 数据传输长度,有效值是0到255 */ unsigned char mCBW_DataLen1; unsigned char mCBW_DataLen2; unsigned char mCBW_DataLen3; unsigned char mCBW_Flag; /* 输入: 传输方向等标志 */ unsigned char mCBW_LUN; unsigned char mCBW_CB_Len; /* 输入: 命令块的长度,有效值是1到16 */ unsigned char mCBW_CB_Buf[1]; /* 输入: 命令块,该缓冲区最多为16个字节 */ } mCBW; /* BulkOnly协议的命令块, 输入CBW结构 */ struct { unsigned long mCSW_Sig; unsigned long mCSW_Tag; unsigned long mCSW_Residue; /* 返回: 剩余数据长度 */ unsigned char mCSW_Status; /* 返回: 命令执行结果状态 */ unsigned char mReserved; } mCSW; /* BulkOnly协议的命令状态块, 输出CSW结构 */ } BOC; /* CMD_BulkOnlyCmd, 执行基于BulkOnly协议的命令, 如果有数据传输那么数据在DISK_BASE_BUF中 */ struct { unsigned char mPathName[ MAX_PATH_LEN ]; /* 输入参数: 路径: [盘符,冒号,斜杠,目录名或者文件名及扩展名...,结束符00H], 其中盘符和冒号可以省略, 例如"C:\DIR1.EXT\DIR2\FILENAME.EXT",00H */ } DirCreate; /* CMD_DirCreate, 新建目录并打开,如果目录已经存在则直接打开 */ struct { unsigned char mSectorCount; /* 返回: 实际读取扇区数,为1则已经读取最后扇区,为0则没有零碎数据(文件长度是512的倍数) */ } ReadLast; /* CMD_FileReadLast, 从当前文件的尾部读取不足一个扇区长度的零碎数据 */ struct { unsigned char mAccessMode; /* 输入: 存取方式, 0=读取文件目录信息,0F0H=写入/更新文件目录信息,其它值无效 */ unsigned char mReserved[3]; struct { /* 该结构中的成员输入输出必须都是小端格式,如果外部单片机是大端格式,那么需要自行处理大小端格式转换 */ unsigned char DIR_Name[11]; /* 00H,文件名,共11字节,不足处填空格 */ unsigned char DIR_Attr; /* 0BH,文件属性,参考下面的说明 */ /* bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 */ /* 只读 隐藏 系统 卷标 目录 存档 未定义 */ unsigned char DIR_NTRes; /* 0CH */ unsigned char DIR_CrtTimeTenth; /* 0DH,文件创建的时间,以0.1秒单位计数 */ unsigned short DIR_CrtTime; /* 0EH,文件创建的时间,参考前面的宏MAKE_FILE_TIME,小端格式 */ unsigned short DIR_CrtDate; /* 10H,文件创建的日期,参考前面的宏MAKE_FILE_DATE,小端格式 */ unsigned short DIR_LstAccDate; /* 12H,最近一次存取操作的日期,参考前面的宏MAKE_FILE_DATE,小端格式 */ unsigned short DIR_FstClusHI; /* 14H */ unsigned short DIR_WrtTime; /* 16H,文件修改时间,参考下面的说明和前面的宏MAKE_FILE_TIME,小端格式 */ /* 文件时间 UINT16: Time = (Hour<<11) + (Minute<<5) + (Second>>1) */ unsigned short DIR_WrtDate; /* 18H,文件修改日期,参考下面的说明和前面的宏MAKE_FILE_DATE,小端格式 */ /* 文件日期 UINT16: Date = ((Year-1980)<<9) + (Month<<5) + Day */ unsigned short DIR_FstClusLO; /* 1AH */ unsigned long DIR_FileSize; /* 1CH,文件长度,小端格式 */ } mDir; /* 20H */ } FileDirInfo; /* CMD_FileDirInfo, 存取当前已打开文件的目录信息 */ struct { unsigned char mLastStatus; /* 返回: 上次的操作状态 */ unsigned char mDiskStatus; /* 返回: 磁盘及文件状态 */ unsigned char mIntStatus; /* 返回: CH375操作的中断状态 */ unsigned char reserved; unsigned long mFileSize; /* 返回: 当前文件的长度 */ unsigned long mCurrentOffset; /* 返回: 当前文件指针,当前读写位置的字节偏移 */ } Status; /* CMD_QueryStatus, 查询当前模块的状态 */ struct { unsigned long mFileSize; /* 输入: 指定新的文件长度变量,只修改子程序库的变量,只在更新文件长度后影响实际文件长度 */ } SetFileSize; /* CMD_SetFileSize, 修改模块系统内子程序库的文件长度变量 */ struct { unsigned char mFileLibVer; /* 返回: 子程序库的版本号 */ unsigned char mModuleVer; /* 返回: 模块的版本号 */ unsigned char mUsbIcVer; /* 返回: USB芯片版本:10H-CH375S,2xH-CH375A */ } GetVer; /* CMD_GetVer, 获取当前模块的版本号 */ struct { unsigned char mDivisor; /* 输入参数: 通讯波特率除数 */ } BaudRate; /* CMD_BaudRate, 设置串口通讯波特率 */ struct { unsigned char mSetup; /* 输入参数: 模块配置值 */ /* 位7位6: 数据字节顺序: 00-保持当前格式, 01-设置小端格式LITTLE_ENDIAN, 10-设置大端格式BIG_ENDIAN, 11-保留/保持当前格式 */ /* 位4: 向文件写入数据后自动更新文件长度(设置CH375LibCo

一般对齐这个是对于16位或者32位单片机才需要的,实际上对于如果是8位单片机的话是不需要对齐的.


对的,我是使用的ARM单片机,不优化的时候能正常运行,一优化之后那些东西就变成__((__packed__)) 类型的,所以我在模仿优化之后的采用__((__packed__)) 类型的,但是出错,故有此疑问~~~~ 个人觉得他们应该没太大的区别?为啥运行起来就不能使用了呢???


这个是一个结构体,你只需要结构体的定义的时候对齐就可以了,没必要里面每一个结构都对齐,这个是没必要的,例如下面这个例子: typedef __packed struct //数据位对齐 { UINT8 Name[ 13 ]; // 短文件名 8+3格式(已经转换过) UINT8 attrib; // 是文件还是文件夹0--文件,1--文件夹 UINT32 FileLen; // 文件长度,文件夹为0 UINT16 UpdateDate; // 修改日期 UINT16 UpdateTime; // 修改时间 UINT16 CreateDate; // 创建日期 UINT16 CreateTime; // 创建时间 UINT16 LongNameLen; // 存放长文件名 有效长度等于: RecCmd.len - 25 } disk_2; 这样就可以.


只有登录才能回复,可以选择微信账号登录