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驱动开发软件可以实现对驱动模块的调试,并可以调试中断服务程序,用户态的驱动调试结果最终可以回归到内核态相应的调用位置,以维持系统驱动的功能完整性。