免费的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,后续搞明白了的话回来完善,谁深入这个问题,完美解决了的话,也请告知一下