vscode代替vitis方法

在纯Windows环境下使用Vscode来代替Vitis来进行应用程序代码的编辑、编译、Linux应用调试(gdb)

零.前提条件

(1).需要在Windows下安装完整的vitis环境

(2).如果事先在Windows下安装过GNU make,并设置了环境变量,请将环境变量删除;当然如果不嫌麻烦,你可以不使用环境变量,使用绝对路径

一.为什么要用vscode代替vitis?

(1).vscode中的插件:One dark pro主题深得我心

(2).vitis代码自动补全功能不齐全

(3).使用tcf-agent来调试linux应用总是调试几次就出问题了,无法继续调试

二.实现原理(不感兴趣可以跳过本章):

赛灵思官方文档中提到过vitis的软件开发环境原本是为linux系统而设计的,所以在linux上使用vscode来代替vitis IDE是很简单的;

linux下,vscode很容易调用vitis IDE的一些构建工具;

赛灵思官方wiki中就有一篇文章专门讲了如何使用vscode来编辑和调试《裸机》应用程序,是的,并没有提到如何调试linux应用程序(因为vitis本身也没有使用gdb调试linux应用程序的调试选项,只能调试裸机,貌似还是通过硬件仿真器实现的,不是通常所用的网线,还有这种用法?);

包括UG1400这个文档中也只提到使用vitis的gdb调试裸机应用程序,言外之意,赛灵思并没有官方支持使用gdb来调试Linux应用;但既然是linux应用,肯定是可以通过gdb调试的,肯定有办法,就是不知道会不会有什么bug,要试了才知道。

有需要的朋友可以按这篇文章来实现在linux下使用Vscode来代替Vitis来进行应用程序代码的编辑、编译、裸机调试(gdb),如果要调试linux应用,还是要参考我的文章来做;

这是文章的直达链接

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/2173435938/Vitis+Debug+Development+with+VS+Code

经过实操我确实在Windows下使用虚拟机运行Ubuntu 22.04实现了用vscode来编译vitis应用程序,但我不想无论何时都还要开一个虚拟机,这增加了对电脑性能的消耗。

于是我想,既然Windows和linux下都可以安装vitis,那Windows下的vitis肯定也是使用了linux下移植过来的一些工具的,为什么我这么确定呢?

看图

在这里插入图片描述

从这张图可以看出,虽然vitis运行在Windows环境下,但编译时并没有使用cmake,而是用了GNU make;所以,Windows环境下的vitis安装路径下肯定有从linux移植过来的一些原本运行在linux上的工具,否则,它就不能调用GNU make。

来找一下有没有

找到了

适用于Windows的交叉编译工具集,gcc和gdb都在个路径下

在这里插入图片描述

gdbserver_9.2_aarch64这个文件夹是我自己新建的,里面存放了我使用交叉编译器编译得到的gdbserver;

为什么要自己编译呢?因为Windows下的vitis安装路径下压根没有gdbserver,那么linux下的vitis安装路径下有没有呢?我去搜索了一下,发现了安装路径下有3个版本的gdbserver,最高的版本是9.2,但它的文件类型是x86_64,也就是无法运行在ARM64的开发板上;3个版本都不是ARM64的;为什么不提供呢?我也搞不懂;上wiki搜索,发现只有Xilinx SDK版本,安装路径下自带gdbserver;但我现在用的是vitis,那就自己编译(网上教程很多),并且使用gdb-9.2的版本,如果你使用的也是2021.1版本的vitis,那可以直接用我编译好的gdbserver;需要的朋友私信我。

在这里插入图片描述

上图中,我使用gdb源码,和vitis安装路径下的交叉编译器,编译得到了ARM64版的gdbserver

三.设置编译环境

1.设置环境变量

在这里插入图片描述

2.在Windows powershell中使用make -v来确认环境正确性

目的是确定make是从环境变量二中获得的

如果你事先安装了GNU make,并设置了环境变量,请将它删除。

在这里插入图片描述

3.设置vscode配置文件

例如,这是我的vitis工作空间

在这里插入图片描述

在其中新建.vscode文件夹

在.vscode文件夹中新建tasks.json文件

这个配置文件用于编译

{  
    "version": "2.0.0",  
    "tasks": [  
        // 使用make编译hello工程
        {
            "label": "build hello with makefile",
            "type": "shell",
            "command": "make",
            "args": [
                "-j8",//这个按需更改,也可以屏蔽,原本没有这个参数,这是自己加的
                "-C",
                "hello/Debug",
                "all"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": []
        },
        {
            "label": "clean hello with makefile",
            "type": "shell",
            "command": "make",
            "args": [
                "-C",
                "hello/Debug",
                "clean"
            ],
            "problemMatcher": []
        },
        // 不使用make编译hello工程
        {  
            "type": "shell",  
            "label": "build hello without makefile",  
            "command": "C:\\Xilinx\\Vitis\\2021.1\\gnu\\aarch64\\nt\\aarch64-linux\\bin\\aarch64-linux-gnu-gcc.exe",  
            "args": [  
                "-g",  
                "${file}",  
                "-o",  
                "${fileDirname}\\${fileBasenameNoExtension}_g.elf"  
            ],  
            "options": {  
                "cwd": "${workspaceFolder}"  
            },  
            "problemMatcher": ["$gcc"],  
            "group": {  
                "kind": "build",  
                "isDefault": true  
            },  
            "detail": "compiler: C:\\Xilinx\\Vitis\\2021.1\\gnu\\aarch64\\nt\\aarch64-linux\\bin\\aarch64-linux-gnu-gcc.exe"  
        },  
        {  
            "label": "clean hello without makefile",  
            "type": "shell",  
            "command": "del",  
            "args": [  
                "${fileDirname}\\${fileBasenameNoExtension}_g.elf"  
            ],  
            "group": {  
                "kind": "build",  
                "isDefault": false  
            },  
            "presentation": {  
                "echo": true,  
                "reveal": "always",  
                "focus": false,  
                "panel": "shared",  
                "showReuseMessage": true,  
                "clear": true  
            },  
            "problemMatcher": []  
        },
        // 使用make编译rf4_link4a11_app工程
        {  
            "label": "build rf4_link4a11_app with makefile",  
            "type": "shell",  
            "command": "make",  
            "args": [ 
                "-j22", // 按实际情况修改,-j20选项必须加在-C选项的前面,否则报错
                // "-g",
                "-C",
                "${workspaceFolder}/rf4_link4a11_app/Debug", // 确保路径正确指向 makefile 所在的目录  
                "all"  
            ],  
            "group": {  
                "kind": "build",  
                "isDefault": true  
            },  
            "problemMatcher": ["$gcc"], // 假设你的 makefile 使用 GCC,这个 matcher 可以帮助识别编译错误  
            "options": {  
                "cwd": "${workspaceFolder}/rf4_link4a11_app/Debug" // 设置工作目录为 makefile 所在的目录(可选,但通常有用)  
            }  
        },  
        {  
            "label": "clean rf4_link4a11_app with makefile",  
            "type": "shell",  
            "command": "make",  
            "args": [  
                "-C",  
                "${workspaceFolder}/rf4_link4a11_app/Debug",  
                "clean"  
            ],  
            "problemMatcher": [],  
            "options": {  
                "cwd": "${workspaceFolder}/rf4_link4a11_app/Debug" // 同样,设置工作目录为 makefile 所在的目录(可选)  
            }  
        } 
    ]  
}

4.使用vscode打开此文件夹

点击终端中的运行任务

在这里插入图片描述

点击"build rf4_link4a11_app with makefile"

在这里插入图片描述

即可编译成功

点击"clean rf4_link4a11_app with makefile" 即可clean工程,这里有个好处就是不会清除bsp工程,vitis中就经常会出现清除应用工程顺带清除了bsp工程,导致编译时间漫长。

5.使用快捷键来完成编译

打开用户按键映射配置文件C:\Users$username\AppData\Roaming\Code\User\keybindings.json

修改成我这样

// 将键绑定放在此文件中以覆盖默认值
[
    // {
    //     "key": "ctrl+b",
    //     "command": "-supercollider.bootServer",
    //     "when": "config.scvsc.useScideKeybindings && editorTextFocus"
    // },
    // {
    //     "key": "ctrl+b",
    //     "command": "-workbench.action.toggleSidebarVisibility"
    // }
    {
        "key": "ctrl+b",
        "command": "workbench.action.tasks.runTask",
        "args": "build rf4_link4a11_app with makefile",
        "when": "editorTextFocus"
    },
    {
        "key": "ctrl+shift+b",
        "command": "workbench.action.tasks.runTask",
        "args": "clean rf4_link4a11_app with makefile",
        "when": "editorTextFocus"
    }
]

现在,使用CTRL+B可以编译应用工程,使用CTRL+SHIFT+B可以clean应用工程。

PS:如果编译有问题,请重新建vitis工程再试

四.设置gdb调试环境

1.设置vscode配置文件

1.1 c_cpp_properties.json文件

在.vscode文件夹中新建c_cpp_properties.json文件

输入

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "C:\\Xilinx\\Vitis\\2021.1\\gnu\\aarch64\\nt\\aarch64-linux\\aarch64-xilinx-linux\\usr\\include",
                "${workspaceFolder}/**",
                "${workspaceFolder}/rf4_link4a11_app/src",
                "${workspaceFolder}/rf4_link4a11_app/src/1_dirvers",
                "${workspaceFolder}/rf4_link4a11_app/src/2_tools",
                "${workspaceFolder}/rf4_link4a11_app/src/3_software_info",
                "${workspaceFolder}/rf4_link4a11_app/src/4_task_manager",
                "${workspaceFolder}/rf4_link4a11_app/src/5_phy_interface_test",
                "${workspaceFolder}/rf4_link4a11_app/src/6_middle_layer_interaction",
                "${workspaceFolder}/rf4_link4a11_app/src/7_transmission_layer_simulation",
                "${workspaceFolder}/rf4_link4a11_app/src/8_link_layer_simulation",
                "${workspaceFolder}/rf4_link4a11_app/src/8_link_layer_simulation/link4a",
                "${workspaceFolder}/rf4_link4a11_app/src/8_link_layer_simulation/link11"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "C:\\Xilinx\\Vitis\\2021.1\\gnu\\aarch64\\nt\\aarch64-linux\\bin\\aarch64-linux-gnu-gcc.exe",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "linux-gcc-arm64"
        }
    ],
    "version": 4
}
1.2 launch.json文件

在.vscode文件夹中新建launch.json文件

输入

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/rf4_link4a11_app/Debug/rf4_link4a11_app.elf",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "C:\\Xilinx\\Vitis\\2021.1\\gnu\\aarch64\\nt\\aarch64-linux\\bin\\aarch64-linux-gnu-gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
            ],
            "miDebuggerServerAddress": "192.168.1.177:2001"
        }
    ]
}

2.将gdbserver拷贝到目标板上

增加可执行权限

chmod +x gdbserver

3.将rf4_link4a11_app.elf拷贝到目标板上

增加可执行权限

chmod +x rf4_link4a11_app.elf

4.在目标板上启动gdbserver

./gdbserver 192.168.1.177:2001 rf3_link4a11_app.elf

5.在vscode中点击调试

在这里插入图片描述

五.一些问题的解决方法

1.如果想在vscode中添加新的.c文件,那就需要在vitis中再编译一次,否则直接在vscode中 编译会报错。

解决办法如下:

假如现在我想在7_transmission_layer_simulation文件夹中新增trans_layer_link11_pack.c这个文件

那这时候就需要在Debug/src/7_transmission_layer_simulation目录下的subdir.mk中添加3条信息

../src/7_transmission_layer_simulation/trans_layer_link11_pack.c
./src/7_transmission_layer_simulation/trans_layer_link11_pack.o
./src/7_transmission_layer_simulation/trans_layer_link11_pack.d

如下图所示

在这里插入图片描述

这样就可以编译了

2.每次调试结束后,想再次进入调试还要在目标板上手动重新运行gdbserver,太麻烦

解决方法:
将运行gdbserver的方法改成下面这种

./gdbserver --multi 192.168.1.177:2001

可以添加到开机自启动中,这样就不用每次都手动执行了
改完之后会发现,无论是重新进调试,还是停止调试后,再次进入调试,都不用再启动gdbserver

3.每次都要手动将可执行文件拷贝到目标板上,太麻烦

解决方法:
在tasks.json中新增一个任务

        // 将编译后的ELF文件上传到目标板  
        {  
            "label": "Upload ELF file to target board",  
            "type": "shell",  
            "command": "scp",  
            "args": [  
                // 注意:这里假设ELF文件名是固定的,或者你可以使用通配符(如*.elf)来匹配多个文件  
                // 但如果文件名不固定,你可能需要编写一个脚本来找到最新的ELF文件  
                "${workspaceFolder}/app/Debug/app.elf", // 替换app.elf为你的实际ELF文件名  
                "root@192.168.1.175:/home/root/lvjun/2301/"  
            ],  
            "group": {  
                "kind": "none",  
                "isDefault": false  
            },  
            "problemMatcher": [], // 这个任务不会产生编译错误,所以不需要problemMatcher  
            "options": {  
                "cwd": "${workspaceFolder}" // 设置工作目录到你的工作区根目录,以便scp可以找到本地文件  
            },  
            "detail": "将elf文件上传到目标板的指定路径下"  
        }  

在launch.json中新增如下字段

            "useExtendedRemote": true,// 需要增加这个配置,因为这里是用target extended-remote来连接,否则会导致报错
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "text": "set remote exec-file /home/root/lvjun/2301/app.elf", // 先设置远程运行二进制文件的地址(app.elf)
                    "ignoreFailures": true
                },
            ],
            "miDebuggerServerAddress": "192.168.1.175:2001",
            "preLaunchTask": "Upload ELF file to target board", // 进入调试前先上传elf文件

这样,在每次进入调试之前,都会自动先运行将二进制文件上传到目标板这个任务,然后再进入调试
补充一下,自动上传使用了scp命令;scp命令基于ssh,而scp命令不支持在命令中夹带密码,所以你需要配置ssh免密登录。
如果嫌麻烦,也可以使用sftp插件,但vscode中的sftp插件没有开放API接口以供任务来调用,无法做到自动上传二进制文件,如果要一次性调试多个目标板,多一个操作步骤就会明显浪费时间。

总结

通过5.2和5.3的方法,就可以得到一个与vitis使用体验差不多的开发环境,可以一键进入调试。
当然,如果想完全脱离vitis开发环境,需要用到xsct——赛灵思命令行工具。
可以参考这个文档《ug1208-xsct-reference-guide.pdf》,来使用命令行创建和构建应用工程,暂时觉得就这样就够用了,有兴趣的朋友自己研究出来了可以发个博客,评论区给个链接,参考一下。
有用请点赞,谢谢!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值