canopen 免费的CanFestival版本差异导致的objdictedit 生成的对象字典不可用

免费的CanFestival

CanFestival是免费开源的,大量的工程师在移植使用。但是维护免费的CanFestival源码的工程师,听说也是很多。在实际使用后,发现在同一.c.h文件中,标识的同一版本号,但文件的内容却却有了很大差别。

objdictedit生成的字典不可用

从官网找到的objdictedit,使用已有的OD文件导出字典,放到工程当中使用,直接导致内存访问出错了。查找内存访问出错的地方。发现是这个函数的实现不一致

  • 这是一种版本的
const indextable * TestSlave_scanIndexOD (CO_Data *d, UNS16 wIndex, UNS32 * errorCode)
{
   (void)d;
   int i;
   switch(wIndex){
   	case 0x1000: i = 0;break;
   	case 0x1001: i = 1;break;
   	case 0x1017: i = 2;break;
   	case 0x1018: i = 3;break;
   	default:
   		*errorCode = OD_NO_SUCH_OBJECT;
   		return NULL;
   }
   *errorCode = OD_SUCCESSFUL;
   return &TestSlave_objdict[i];
}
  • 这是另一种版本的
const indextable * TestSlave_scanIndexOD (UNS16 wIndex, UNS32 * errorCode, ODCallback_t **callbacks)
{
	int i;
	*callbacks = NULL;
	switch(wIndex){
		case 0x1000: i = 0;break;
		case 0x1001: i = 1;break;
		case 0x1017: i = 2;*callbacks = TestSlave_Index1017_callbacks; break;
		case 0x1018: i = 3;break;
		default:
			*errorCode = OD_NO_SUCH_OBJECT;
			return NULL;
	}
	*errorCode = OD_SUCCESSFUL;
	return &TestSlave_objdict[i];
}

可以看出来,最大的差别是那个callbacks
再实际查看const indextable TestSlave_objdict的差别,发现问题了

  • 依序对应上面代码的第一种 indextable定义
typedef struct td_subindex
{
    UNS8                    bAccessType;
    UNS8                    bDataType; /* Defines of what datatype the entry is */
    UNS32                   size;      /* The size (in Byte) of the variable */
    void*                   pObject;   /* This is the pointer of the Variable */
	ODCallback_t            callback;  /* Callback function on write event */
} subindex;
  • 第二种定义
typedef struct td_subindex
{
    UNS8                    bAccessType;
    UNS8                    bDataType; /* Defines of what datatype the entry is */
    UNS32                   size;      /* The size (in Byte) of the variable */
    void*                   pObject;   /* This is the pointer of the Variable */
} subindex;

这其中的差别就在那个ODCallback_t,不过实际查看TestSlave_scanIndexOD的实现,好像并没有用到Callback相关的;所以objdictedit生成的对象字典中,我暂时就替换的TestSlave_scanIndexOD函数,实际测试工程可以正常工作了

  • 而具体的
/* index 0x1000 :   Device Type. */
                    UNS32 TestSlave_obj1000 = 0x0;	/* 0 */
                    subindex TestSlave_Index1000[] = 
                     {
                       { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1000, NULL }
                     };

变成了

/* index 0x1000 :   Device Type. */
                    UNS32 TestSlave_obj1000 = 0x0;	/* 0 */
                    subindex TestSlave_Index1000[] = 
                     {
                       { RO, uint32, sizeof (UNS32), (void*)&TestSlave_obj1000 }
                     };

没有了,关于callback的定义,我就没有继续深入下去了。


我也是初学CANopen,后续搞明白了的话回来完善,谁深入这个问题,完美解决了的话,也请告知一下

猜你喜欢

转载自blog.csdn.net/Soonjn/article/details/92590052