原文地址:http://blog.csdn.net/huangxianxinalice/article/details/10956137
关于对象字典的数据结构如下:
[cpp] view plain copy
-
-
-
-
-
- typedef struct OBJ_ENTRY
- {
- #if !STATIC_OBJECT_DIC
- struct OBJ_ENTRY *pPrev;
- struct OBJ_ENTRY *pNext;
- #endif //#if !STATIC_OBJECT_DIC
-
- UINT16 Index;
- TSDOINFOOBJDESC ObjDesc;
- OBJCONST TSDOINFOENTRYDESC OBJMEM *pEntryDesc;
- OBJCONST UCHAR OBJMEM *pName;
- void MBXMEM *pVarPtr;
- UINT8 (* Read)( UINT16 Index, UINT8 Subindex, UINT32 Size, UINT16 MBXMEM * pData, UINT8 bCompleteAccess );
- UINT8 (* Write)( UINT16 Index, UINT8 Subindex, UINT32 Size, UINT16 MBXMEM * pData, UINT8 bCompleteAccess );
- UINT16 NonVolatileOffset;
- }
- TOBJECT;
代码1
对象字典的对象的数据结构是采用链表的形式,组成整个对象字典。
其中,在对象里面定义了索引,对象的描述,SDO入口指针的描述,对象字典的名称,变量的指针,还定义了读和写两个虚函数
ObjDesc的数据结构如下:
[cpp] view plain copy
- typedef struct MBX_STRUCT_PACKED_START
- {
- UINT16 DataType;
- UINT16 ObjFlags;
-
- #define OBJFLAGS_MAXSUBINDEXMASK 0x00FF//最大子索引的掩码
- #define OBJFLAGS_MAXSUBINDEXSHIFT 0<span style="white-space:pre"> </span> //最大子索引的偏移
- #define OBJFLAGS_OBJCODEMASK 0x0F00//对象的掩码
- #define OBJFLAGS_OBJCODESHIFT 8<span style="white-space:pre"> </span> //对象的偏移
-
- #define OBJCODE_VAR 0x07
- #define OBJCODE_ARR 0x08
- #define OBJCODE_REC 0x09
-
- }MBX_STRUCT_PACKED_END
- TSDOINFOOBJDESC;
代码2
其中,对于OBJCODE里面这三个宏定义OBJCODE_VAR OBJCODE_ARR OBJCODE_REC
(请问这三个宏定义分别代表着哪三种情况)
从字面上的意思来说,OBJCODE的变量,OBJCODE的队列,OBJCODE的记录
OBJCODE通过函数
UINT8 objCode = (pObjEntry->ObjDesc.ObjFlags & OBJFLAGS_OBJCODEMASK) >> OBJFLAGS_OBJCODESHIFT;
最后,得出的是OBJCODE的类别
如果是变量的话,就return 0;
如果是对象的队列和记录得话,则可以得出OBJCODE的偏移量
如果对象字典object code的类别得出是OBJCODE的队列的时候,得出对象字典的入口地址是&pObjEntry->pEntryDesc[1];
如果,是OBJCODE_REC的时候,得出的对象字典的入口地址是&pObjEntryDesc[i];
Obj_Desc的作用是为了找到关于对象的描述
SDO入口地址的描述
[cpp] view plain copy
-
- typedef struct MBX_STRUCT_PACKED_START
- {
- UINT16 DataType;
- UINT16 BitLength;
- UINT16 ObjAccess;
-
-
- <span style="white-space:pre"> </span>
- <span style="white-space:pre"> </span>
- <span style="white-space:pre"> </span>
- <span style="white-space:pre"> </span>
- <span style="white-space:pre"> </span>
- <span style="white-space:pre"> </span>
- <span style="white-space:pre"> </span>
-
- #define ACCESS_READWRITE 0x003F
- #define ACCESS_READ 0x0007
- #define ACCESS_READ_PREOP 0x0001
- #define ACCESS_READ_SAFEOP 0x0002
- #define ACCESS_READ_OP 0x0004
- #define ACCESS_WRITE 0x0038
- #define ACCESS_WRITE_PREOP 0x0008
- #define ACCESS_WRITE_SAFEOP 0x0010
- #define ACCESS_WRITE_OP 0x0020
- #define OBJACCESS_NOPDOMAPPING 0x0000
- #define OBJACCESS_RXPDOMAPPING 0x0040
- #define OBJACCESS_TXPDOMAPPING 0x0080
- #define OBJACCESS_BACKUP 0x0100
- #define OBJACCESS_SETTINGS 0x0200
- #define OBJACCESS_SAFEINPUTS 0x0400
- #define OBJACCESS_SAFEOUTPUTS 0x0800
- #define OBJACCESS_SAFEPARAMETER 0x1000
-
-
-
-
-
- }MBX_STRUCT_PACKED_END
- TSDOINFOENTRYDESC;
代码3
算法:
for (i = 1; i <= subindex; i++)
{
/* get the entry description获得入口描述 */
if (objCode == OBJCODE_ARR)
pEntry = &pObjEntry->pEntryDesc[1];
else
pEntry = &pObjEntry->pEntryDesc[i];
这里根据子索引数找到相关的入口地址
其中,pObjEntry->pEntryDesc (见代码1),是定义了一个指针,指针类型是TSDOINFOENTRYDESC的结构体。那里上面的代码是指向它相邻的一个结构体的pEntryDesc吗?那这个pEntryDesc,是存放它第一个子索引的入口描述?
那它子索引的初始化是怎样初始化?