Matlab2019b部署BeagleBone Blue计步例程I2C相关C代码报错如何解决
问题根因
该报错是Matlab R2019b版本BeagleBone Blue官方支持包的内置I2C驱动模板代码存在两处缺陷:
- 底层I2C实现文件缺失Linux标准I2C头文件引用,导致
struct i2c_msg、I2C_M_RD等内核标准定义无法被识别 - 驱动上下层的I2C句柄类型不匹配,底层函数要求传入int类型的文件描述符,上层调用传入的是void*类型的自定义句柄,触发类型转换警告及逻辑错误
解决步骤(修改支持包模板一劳永逸)
- 找到Matlab R2019b BeagleBone Blue支持包的I2C源码模板,Windows默认路径为
C:\ProgramData\MATLAB\SupportPackages\R2019b\toolbox\target\supportpackages\beagleboneblue\src\MW_I2C.c,Linux系统对应找R2019b支持包安装目录下的beagleboneblue/src文件夹即可 - 打开
MW_I2C.c文件,在开头的头文件引用段新增一行:
#include <linux/i2c.h>
- 找到三个上层调用底层I2C函数的位置,添加强制类型转换:
- 将
status = EXT_I2C_readH(I2CModuleHandle, SlaveAddress, data, DataLength);修改为status = EXT_I2C_readH((int)I2CModuleHandle, SlaveAddress, data, DataLength); - 将
status = EXT_I2C_writeH(I2CModuleHandle, SlaveAddress, data, DataLength);修改为status = EXT_I2C_writeH((int)I2CModuleHandle, SlaveAddress, data, DataLength); - 将
EXT_I2C_terminateH(I2CModuleHandle);修改为EXT_I2C_terminateH((int)I2CModuleHandle);
- 将
- 保存修改后的文件,重启Matlab,删除之前生成的编译缓存目录(即报错中提到的
/home/debian/beagleboneblue_countstep_ert_rtw),重新打开Simulink模型编译烧录即可正常运行
临时替代方案
如果暂时不想修改支持包源码,可每次生成代码后手动修改烧录到BeagleBone Blue设备上的MW_I2C.c文件,执行上述相同修改后,手动进入编译目录执行make命令编译运行即可。
内容的提问来源于stack exchange,提问作者Matěj Kopecký
相关产品推荐
相关产品推荐

