xmrforever 发表于 2008-4-21 15:39:23

请教一个程序移植的问题!

马老师,请问下面的两条语句在ICCAVR中怎么表示?
CMD_PARAM        idata        mCmdParam;
unsigned char idata        TempBuffer;       


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;                /* 输入: 命令块,该缓冲区最多为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;
                struct {                                                                /* 该结构中的成员输入输出必须都是小端格式,如果外部单片机是大端格式,那么需要自行处理大小端格式转换 */
                        unsigned char        DIR_Name;                /* 00H,文件名,共11字节,不足处填空格 */
                        unsigned char        DIR_Attr;                        /* 0BH,文件属性,参考下面的说明 */
/* bit0bit1bit2bit3bit4bit5bit6 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: 向文件写入数据后自动更新文件长度(设置CH375LibConfig的位4):0禁止,1允许 */
/* 位0: 空闲时查询U盘连接状态并自动中断通知:0禁止,1允许 */
        } Setup;                                                                        /* CMD_SetupModule, 设置模块配置 */
        struct {
                unsigned char        mData;                                        /* 输入参数或者返回: 字节数据 */
        } Direct;                                                                        /* CMD_DirectWrCmd, 直接传递给CH375,写命令; CMD_DirectRdDat, 直接传递给CH375,读数据; CMD_DirectWrDat, 直接传递给CH375,写数据 */
        struct {
                unsigned char        mStringSN;                        /* 返回: 产品序列号字符串 */
        } GetSN;                                                                        /* CMD_GetStringSN, 获取产品序列号字符串 */
        struct {
                unsigned char        mVidLow;                                /* 输入参数: 厂商ID低字节 */
                unsigned char        mVidHigh;                                /* 输入参数: 厂商ID高字节 */
                unsigned char        mPidLow;                                /* 输入参数: 产品ID低字节 */
                unsigned char        mPidHigh;                                /* 输入参数: 产品ID高字节 */
        } SetUsbId;                                                                        /* CMD_SetUsbId, USB设备模式: 设置USB设备的厂商VID和产品PID */
        struct {
                unsigned char        mUsbMode;                                /* 输入参数: 工作模式代码, 0=空闲, 2=USB设备模式, 6=USB主机模式 */
        } SetUsbMode;                                                                /* CMD_SetUsbMode, USB设备模式: 设置USB主机/设备工作模式,只支持串口 */
        struct {
                unsigned char        mByteCount;                                /* 返回: 读出的字节数 */
                unsigned char        mByteBuffer[ MAX_BYTE_IO ];        /* 返回: 读出的数据块 */
        } ReadUsbData;                                                                /* CMD_ReadUsbData, USB设备模式: 从模块的数据下传端点读取数据块 */
        struct {
                unsigned char        mByteCount;                                /* 输入参数: 准备写入的字节数,不得大于MAX_BYTE_IO,不得大于CH375_MAX_DATA_LEN */
                unsigned char        mByteBuffer[ MAX_BYTE_IO ];        /* 输入参数: 准备写入的数据块 */
        } WriteUsbData;                                                                /* CMD_WriteUsbData, USB设备模式: 向模块的数据上传端点写入数据块 */
} CMD_PARAM;

machao 发表于 2008-4-22 23:19:21

你要请教什么问题?还是要我帮你重写代码?

xmrforever 发表于 2008-5-11 22:02:45

问题已经解决了
AVR是不是不能间接访问内部存储器?
CMD_PARAM      idata      mCmdParam;
上面的语句是在KEIL C里面实现的
我用ICCAVR写的时候把idata去掉就可以访问了

machao 发表于 2008-5-13 22:38:43

你连AVR的基本结构都不学习?什么是间接访问内部存储器?

xmrforever 发表于 2008-5-14 13:23:58

写51程序用到的idata
比如:unsigned int idata Flag;
请问上句是不是把Flag存放到内部存储器?

machao 发表于 2008-5-14 13:27:51

学点基本的东西吧,AVR的结构同51不同.

xmrforever 发表于 2008-5-14 13:34:18

谢谢马老师的教导
初学者,提的问题让您见笑了
页: [1]
查看完整版本: 请教一个程序移植的问题!