/*/
//
// Object dictionary entry structure
*/
typedef struct OBJ_ENTRY
{
#if !STATIC_OBJECT_DIC
struct OBJ_ENTRY *pPrev; //previous entry(object) in the object dictionary list
struct OBJ_ENTRY *pNext; //next entry(object) in the object dictionary list
#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的数据结构如下:
typedef struct MBX_STRUCT_PACKED_START
{
UINT16 DataType; // 关于索引的数据类型
UINT16 ObjFlags;
/*对象代码和最大子索引将被人为得设置在对象字典里面,这个值经常以大端模式被创造 */
#define OBJFLAGS_MAXSUBINDEXMASK 0x00FF//最大子索引的掩码
#define OBJFLAGS_MAXSUBINDEXSHIFT 0 //最大子索引的偏移
#define OBJFLAGS_OBJCODEMASK 0x0F00//对象的掩码
#define OBJFLAGS_OBJCODESHIFT 8 //对象的偏移
#define OBJCODE_VAR 0x07
#define OBJCODE_ARR 0x08
#define OBJCODE_REC 0x09
// char Name[]; // rest of mailbox data
}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入口地址的描述
// SDO Information / Entry Description:
typedef struct MBX_STRUCT_PACKED_START
{
UINT16 DataType; // 关于索引的数据类型
UINT16 BitLength;
UINT16 ObjAccess; // Bit 0: Read Access in Pre-Op
// Bit 1: Read Access in Safe-Op
// Bit 2: Read Access in Op
// Bit 3: Write Access in Pre-Op
// Bit 4: Write Access in Safe-Op
// Bit 5: Write Access in Op
// Bit 6: mappable in RxPDO
// Bit 7: mappable in TxPDO
// Bit 8: entry will be included in backup
// Bit 9: entry will be included in settings
#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
// UINT16 UnitType; // optional if bit3 of valueInfo
// UINT8 DefaultValue[]; // optional if bit4 of valueInfo
// UINT8 MinValue[]; // optional if bit5 of valueInfo
// UINT8 MaxValue[]; // optional if bit6 of valueInfo
// char Desc[]; // rest of mailbox data
}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,是存放它第一个子索引的入口描述?
那它子索引的初始化是怎样初始化?