我把模塊調試出來了,可是在整合的時候遇到問題了 也就是一個大的union函數,我覺得應該加__packed__,可是加了反而出錯,是為什么呢?? 原先的函數: typedef union _CMD_PARAM { struct { unsigned char mBuffer[ MAX_PATH_LEN ]; } Other; struct { unsigned long mDiskSizeSec; /* 返回: 整個物理磁盤的總扇區(qū)數 */ unsigned long mTotalSector; /* 返回: 當前邏輯盤的總扇區(qū)數 */ unsigned long mFreeSector; /* 返回: 當前邏輯盤的剩余扇區(qū)數 */ 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; /* 輸入參數: 扇區(qū)偏移,0則移動到文件頭,0FFFFFFFFH則移動到文件尾, 返回: 當前文件指針對應的絕對線性扇區(qū)號, 0FFFFFFFFH則已到文件尾 */ } Locate; /* CMD_FileLocate, 移動當前文件指針 */ struct { unsigned char mSectorCount; /* 輸入參數: 讀取扇區(qū)數, 返回: 實際讀取扇區(qū)數 */ } Read; /* CMD_FileRead, 從當前文件讀取數據 */ struct { unsigned char mSectorCount; /* 輸入參數: 寫入扇區(qū)數, 返回: 實際寫入扇區(qū)數 */ } Write; /* CMD_FileWrite, 向當前文件寫入數據 */ struct { unsigned long mDiskSizeSec; /* 返回: 整個物理磁盤的總扇區(qū)數 */ } DiskSize; /* CMD_DiskSize, 查詢磁盤容量 */ struct { unsigned long mByteOffset; /* 輸入參數: 以字節(jié)為單位的偏移量, 以字節(jié)為單位的文件指針, 返回: 當前文件指針對應的絕對線性扇區(qū)號, 0FFFFFFFFH則已到文件尾 */ } ByteLocate; /* CMD_ByteLocate, 以字節(jié)為單位移動當前文件指針 */ struct { unsigned char mByteCount; /* 輸入參數: 準備讀取的字節(jié)數,不得大于MAX_BYTE_IO, 返回: 實際讀出的字節(jié)數 */ unsigned char mByteBuffer[ MAX_BYTE_IO ]; /* 返回: 讀出的數據塊 */ } ByteRead; /* CMD_ByteRead, 以字節(jié)為單位從當前文件讀取數據塊 */ struct { unsigned char mByteCount; /* 輸入參數: 準備寫入的字節(jié)數,不得大于MAX_BYTE_IO,如果為0則刷新文件長度而不寫入,如果不為0則寫入數據但不刷新文件長度, 返回: 實際寫入的字節(jié)數 */ unsigned char mByteBuffer[ MAX_BYTE_IO ]; /* 輸入參數: 準備寫入的數據塊 */ } ByteWrite; /* CMD_ByteWrite, 以字節(jié)為單位向當前文件寫入數據塊 */ 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]; /* 輸入: 命令塊,該緩沖區(qū)最多為16個字節(jié) */ } mCBW; /* BulkOnly協(xié)議的命令塊, 輸入CBW結構 */ struct { unsigned long mCSW_Sig; unsigned long mCSW_Tag; unsigned long mCSW_Residue; /* 返回: 剩余數據長度 */ unsigned char mCSW_Status; /* 返回: 命令執(zhí)行結果狀態(tài) */ unsigned char mReserved; } mCSW; /* BulkOnly協(xié)議的命令狀態(tài)塊, 輸出CSW結構 */ } BOC; /* CMD_BulkOnlyCmd, 執(zhí)行基于BulkOnly協(xié)議的命令, 如果有數據傳輸那么數據在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; /* 返回: 實際讀取扇區(qū)數,為1則已經讀取最后扇區(qū),為0則沒有零碎數據(文件長度是512的倍數) */ } ReadLast; /* CMD_FileReadLast, 從當前文件的尾部讀取不足一個扇區(qū)長度的零碎數據 */ struct { unsigned char mAccessMode; /* 輸入: 存取方式, 0=讀取文件目錄信息,0F0H=寫入/更新文件目錄信息,其它值無效 */ unsigned char mReserved[3]; struct { /* 該結構中的成員輸入輸出必須都是小端格式,如果外部單片機是大端格式,那么需要自行處理大小端格式轉換 */ unsigned char DIR_Name[11]; /* 00H,文件名,共11字節(jié),不足處填空格 */ unsigned char DIR_Attr; /* 0BH,文件屬性,參考下面的說明 */ /* bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 */ /* 只讀 隱藏 系統(tǒng) 卷標 目錄 存檔 未定義 */ unsigned char DIR_NTRes; /* 0CH */ unsigned char DIR_CrtTimeTenth; /* 0DH,文件創(chuàng)建的時間,以0.1秒單位計數 */ unsigned short DIR_CrtTime; /* 0EH,文件創(chuàng)建的時間,參考前面的宏MAKE_FILE_TIME,小端格式 */ unsigned short DIR_CrtDate; /* 10H,文件創(chuàng)建的日期,參考前面的宏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; /* 返回: 上次的操作狀態(tài) */ unsigned char mDiskStatus; /* 返回: 磁盤及文件狀態(tài) */ unsigned char mIntStatus; /* 返回: CH375操作的中斷狀態(tài) */ unsigned char reserved; unsigned long mFileSize; /* 返回: 當前文件的長度 */ unsigned long mCurrentOffset; /* 返回: 當前文件指針,當前讀寫位置的字節(jié)偏移 */ } Status; /* CMD_QueryStatus, 查詢當前模塊的狀態(tài) */ struct { unsigned long mFileSize; /* 輸入: 指定新的文件長度變量,只修改子程序庫的變量,只在更新文件長度后影響實際文件長度 */ } SetFileSize; /* CMD_SetFileSize, 修改模塊系統(tǒng)內子程序庫的文件長度變量 */ 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: 數據字節(jié)順序: 00-保持當前格式, 01-設置小端格式LITTLE_ENDIAN, 10-設置大端格式BIG_ENDIAN, 11-保留/保持當前格式 */ /* 位4: 向文件寫入數據后自動更新文件長度(設置CH375LibCo
一般對齊這個是對于16位或者32位單片機才需要的,實際上對于如果是8位單片機的話是不需要對齊的.
對的,我是使用的ARM單片機,不優(yōu)化的時候能正常運行,一優(yōu)化之后那些東西就變成__((__packed__)) 類型的,所以我在模仿優(yōu)化之后的采用__((__packed__)) 類型的,但是出錯,故有此疑問~~~~ 個人覺得他們應該沒太大的區(qū)別?為啥運行起來就不能使用了呢???
這個是一個結構體,你只需要結構體的定義的時候對齊就可以了,沒必要里面每一個結構都對齊,這個是沒必要的,例如下面這個例子: typedef __packed struct //數據位對齊 { UINT8 Name[ 13 ]; // 短文件名 8+3格式(已經轉換過) UINT8 attrib; // 是文件還是文件夾0--文件,1--文件夾 UINT32 FileLen; // 文件長度,文件夾為0 UINT16 UpdateDate; // 修改日期 UINT16 UpdateTime; // 修改時間 UINT16 CreateDate; // 創(chuàng)建日期 UINT16 CreateTime; // 創(chuàng)建時間 UINT16 LongNameLen; // 存放長文件名 有效長度等于: RecCmd.len - 25 } disk_2; 這樣就可以.