1.适用范围
本文档适用于使用SylixOS进行驱动模块开发的客户人员和技术工程师。
2.工作准备
BSP驱动开发软件;
CAN驱动模块代码;
CAN应用程序测试代码。
3.原理概述
翼辉BSP驱动开发软件是一种用于调试驱动程序的软件库,它通过替换系统IO接口,利用软件库内的中间线程做中转,将内核态的驱动程序构建为用户态,使驱动程序的调试如普通应用程序一样简单。
4.使用说明
下面以AM4378板卡的CAN设备驱动为例,说明BSP驱动开发软件的使用过程。使用步骤如下:
4.1构建用户态驱动工程
1.在RealEvo-IDE下创建APP工程(can_debug),创建过程请参考《RealEvo-IDE使用手册》第2.4章节——创建SylixOS APP工程。
2.创建成功后,将CAN设备驱动代码拷贝至APP工程内,并将驱动模块的moudle_init函数替换为应用程序的main函数,其它代码不变。替换结果如程序清单4. 1所。
程序清单4. 1 APP工程替换结果
int main (int argc, char **argv) { printf("Hello SylixOS!\n"); /* * 打开 CAN0 还是 CAN1 的总线驱动,是在 bspboard.h 中配置 */ CAN_CHAN *pcanchan = LW_NULL; pcanchan = __canChanCreate(0); /* 对应 CAN0 设备 */ canDevCreate("/dev/can0", pcanchan, 128, 128); return (0); }
4.2替换系统注册接口
1.将CAN驱动代码中的系统注册接口替换为驱动调试库内相应的接口,CAN驱动需要向系统注册设备和注册CAN中断服务函数,因此替换结果如图4.1所示。
图4.1 替换CAN系统注册接口
替换规则是将需要替换函数的前面加上"debug"字符串,其他驱动代码也是相同规则。
2 .然后在APP程序内添加对应的函数声明,并进行编译,CAN驱动需要的函数声明如程序清单4. 2所示。
程序清单4. 2 函数声明
extern INT32 debugcanDevCreate(PCHAR pcName, CAN_CHAN *pcanchan, UINT uiRdFrameSize, UINT uiWrtFrameSize); extern ULONG debugAPI_InterVectorConnect (ULONG ulVector, POVID pvArg, CPCHAR pcName);
4.3部署调试库和用户态驱动工程
将已有的调试库文件(libIoDevDebug.so)和编译好的APP程序下载到目标板卡上,下载步骤为:
1 .使用RealEvo-IDE的一键部署功能实现库文件下载,右键驱动调试库(IoDevDebug)工程,选择菜单"Properties"打开工程属性页,选择"SylixoS Project→Device Setting"选项卡,可查看和更改部署配置。如图4.2所示。
图4.2 工程部署设置
1. 在"Device Name"栏里设置与目标板卡一致的IP地址。
2. 可以在"Upload Setting"栏目里设置库文件的本地路径和将要下载到目标板卡的远端路径,库文件需要下载至目标板的"/lib/"目录内,选择默认配置即可。
3. 依次点击"Apply"和"OK"按钮设置成功。
4. 设置完成后,右键库文件工程,选择菜单" SylixOS→Upload"部署。部署成功后,会在目标板的"/lib/"目录下看到libIoDevDebug.so文件
5. 部署APP程序与部署库文件类似,只需将右击库文件工程替换成右击APP工程即可。部署成功后,会在目标板的"/apps/"目录下看到can_dbeug目录。
4.4 APP工程添加动态链接库
APP工程需要添加调试库的路径,调试时才能够找到调试库中提供的接口,添加步骤如下:
1. 右击APP工程(can_debug),选择菜单" Properties",在弹出窗口上点击" SylixOS Project"下的" Linker Setting",在工作空间中选择要添加的库文件(libIoDevDebug.so),如图4.3所示。
图4.3 添加动态库设置
1.添加完成后,在" Library Path"选项卡下可以看到已经加入了库文件路径,需要注意的是不能添加"strip/"目录下的libIoDevDebug.so文件,因为"strip/"目录下的文件不带调试信息。
4.5 调试选项配置
调试选项配置步骤如下:
1. 右击APP工程(can_debug),选择菜单"Debug As→Debug Configurations",在弹出的窗口中进行以如图4.4所示操作来新建一个调试项目。
图4.4 新建调试项目
2. 点击Debugger选项卡,设置添加动态库路径,如图4.5所示。
图4.5 添加动态库路径
动态库路径是在4.4小节中配置的,此处无法修改,选择默认即可。
3.配置完成后点击Debug按钮即可进入调试界面(确保AM4378板卡正在运行SylixOS)。
4.6 驱动程序调试
4.6.1 调试main函数
点击"Debug"按钮后的调试界面如下所示。图4.6可以看出程序已经进入到CAN设备初始化函数(main函数)、并且可以使用单步执行、进入执行、全速运行等功能。
图4.6 调试main函数
4.6.2调试系统IO接口和中断服务程序
1. 在__canIoCtl函数内设置断点,该函数在打开CAN设备时会被调用。
2. 在__canIsr函数内设置断点,该函数是CAN设备中断服务函数。
设置断点位置如图4.7所示。
图4.7 设置断点位置
3. 点击RealEvo-IDE菜单栏下的(Resume)按钮使程序全速运行,运行结束后CAN设备注册成功,可以在目标板的shell命令行内使用"devs"命令查看到CAN0设备节点。
4. 执行CAN测试程序,该测试程序会打开CAN0设备,并发送数据产生中断,在执行的过程中,可以发现程序停在了刚刚设置断点的位置。如图4.8所示。
图4.8 打开函数断点位置
5. 继续运行,可以看到程序会停在中断服务程序内,如图4.9所示。
图4.9 中断服务程序断点位置
5. 总结
通过上面的测试可以说明,BSP驱动开发软件可以实现对驱动模块的调试,并可以调试中断服务程序,用户态的驱动调试结果最终可以回归到内核态相应的调用位置,以维持系统驱动的功能完整性。