【正点原子FPGA连载】第八章使用Vitis开发Linux应用摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

news2024/11/14 10:24:42

1)实验平台:正点原子MPSoC开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html

第八章使用Vitis开发Linux应用

上一章我们学习了在Petalinux搭建的Linux系统上基础外设的使用,本章我们以创建“Hello World”工程为例学习如何使用Vitis开发Linux应用以及如何让应用程序运行在Petalinux搭建的Linux系统上。运行方式本章介绍了三种,可根据个人喜好选择。

8.1创建基于Vitis的Linux平台工程
双击Windows系统桌面的Xilinx Vitis IDE 2019.2图标打开Vitis工具,弹出图 8.1.1所示的Lancher界面:
在这里插入图片描述

图 8.1.1 打开Vitis工具
设置Vitis Workspace文件夹,可以是任一文件夹,最好不要包括中文以及特殊字符,这里笔者选择的是F:\Mpsoc\appDev_Linux文件夹,然后点击“Launch”按钮,进入如下图所示界面:
在这里插入图片描述

图 8.1.2 创建Platform工程
单击“Create Platform Project”,即创建平台工程,进入下图所示界面:
在这里插入图片描述

图 8.1.3 平台工程配置选项
“Project name”栏输入平台工程名“appDev_Linux_plat”,其他保持默认,然后单击底部的“Next >”,进入下一页面,如图 8.2.5所示。
在这里插入图片描述

图 8.1.4 创建新的平台工程
选择“Create from hardware specification (XSA)”,然后单击底部的“Next >”,进入下一页面,如下图所示:
在这里插入图片描述

图 8.1.5 配置平台工程

“XSA file:”栏选择用于该平台工程的xsa文件,与6.3.4节使用的xsa文件相同。
“Operating system”操作系统选择“linux”, 选择后“Processor”默认配置为“psu_cortexa53”。
取消勾选“Generate boot components”。
配置好后,点击底部的“Finish”按钮。
现在我们将开发板资料盘(A盘)\4_SourceCode\3_Embedded_Linux\zynq_petalinux\4ev\linux_boot文件夹拷贝到Vitis Workspace文件夹F:\Mpsoc\appDev_Linux下,如下图所示:
在这里插入图片描述

图 8.1.6 解压缩后的linux_boot文件夹
回到Vitis界面,设置“Bif File”为linux_boot文件夹下的linux_image.bif文件,设置“Boot Components Directory”为linux_boot文件夹,如下图所示:
在这里插入图片描述

图 8.1.7 设置Vitis平台工程
设置完成后编译平台工程如下图所示:

编译完平台工程后,平台工程的搭建就完成了。现在可以创建Linux应用工程了。
8.2创建Linux应用工程
点击Vitis菜单栏的“File->New->Application Project…”,创建应用工程,如下图所示:
在这里插入图片描述

图 8.2.1 创建应用工程
设置工程名为“hello_world”,如下图所示:
在这里插入图片描述

图 8.2.2 设置工程名
单击底部的“Next >”,进入下一页面,选择刚才新建的“appDev_Linux_plat”,如下图所示:
在这里插入图片描述

图 8.2.3 选择appDev_Linux_plat
单击底部的“Next >”,进入下一页面,如下图所示:
在这里插入图片描述

图 8.2.4 选择Domain
Domain保持默认即可,Language默认为C,也可以选择C++,这里保持默认,使用C语言开发应用,然后单击底部的“Next >”,进入下一页面,如图 8.2.5所示。
可以看到有两个模板,第一个是Linux空白应用工程模板,第二个是“Linux Hello World”工程模板。我们选择“Linux Hello World”工程模板,点击底部的“Finish”,进入图 8.2.6所示界面。
在这里插入图片描述

图 8.2.5 工程模板
在这里插入图片描述

图 8.2.6 Vitis界面
关于Vitis的使用想必就不用多介绍了,毕竟我们在《DFZU2EG_4EV MPSoC嵌入式Vitis开发指南》中已经使用的够多了。我们展开左侧的“hello_world”下的src,可以看到helloworld.c文件,双击可以看到右侧的源码,是不是很简单,跟我们平时写的C应用没区别。
编译hello_world工程。至此,Linux应用工程的创建就完成了。下面我们将介绍如何将该工程的elf文件运行在我们第六章搭建的Linux上。
有两种方式,一种是通过Vitis软件自带的TCF Agent,另一种是通过其他方式如NFS、ssh等将文件共享到或传到开发板上的Linux系统中。
注意无论使用什么方式,都需要开发板连接网线,且与Windows系统处于同一网络。
说一下运行前的准备工作:
先在开发板上运行我们第六章搭建的Linux系统,并接上网线,在串口上位机中输入ifconfig命令或“ip a s”命令查看以太网的IP地址,关于开发板以太网的使用请参考7.7小节以太网的使用。从下图可见笔者使用的开发板的IP地址为192.168.2.218,该地址后面会使用到。
在这里插入图片描述

图 8.2.7 开发板的IP地址
完成准备工作后,我们先来看下TCF Agent方式,然后试下NFS方式和SSH方式。
8.3使用TCF Agent方式运行
在Vitis界面,右键点击“hello_world”应用工程,在弹出的菜单中选择“Run As—>Run Configuration”,如图 8.3.1所示。
在这里插入图片描述

图 8.3.1 双击“Linux Agent[defalut]”
在弹出的界面中,双击“Single Applicatuin Debug”,会自动创建“Debugger_hello_world-Default”,如下图所示:
在这里插入图片描述

图 8.3.2 创建Linux Agent
在这里插入图片描述

图 8.3.3 输入Host的IP 地址
输入Host的IP地址,也就是开发板的IP地址,笔者的为192.168.2.218。输入IP地址完成后,点击“Test Connection”,如果出现下图所示的结果,表示连接测试成功,Linux TCF Agent服务运行正常,可以与主机(开发板)连接。点击“OK”按钮,完成设置。
在这里插入图片描述

图 8.3.4 连接测试成功
完成图 8.3.5的1和2之后,我们点击3处的“Apply”,然后点击4处的“Run”,如下图所示:
在这里插入图片描述

图 8.3.5 运行
在Console终端可以看到Hello World输出,表明程序在Linux上运行成功,如下图所示:
在这里插入图片描述

图 8.3.6 Console终端输出运行结果
8.4使用NFS共享方式运行
在4.4.1节我们使用/home/cx/workspace/nfs文件夹供nfs服务器使用,所以首先我们将工程的elf文件复制到Ubuntu虚拟机的该文件夹下。
复制完成后,我们在开发板上挂载Ubuntu主机的NFS目录,在挂载之前先要知道Ubuntu主机的IP地址,使用ifconfig命令或“ip a s”命令查询到笔者的Ubuntu主机的IP地址为192.168.2.134。在连接到开发板的串口上位机如Putty中输入如下命令进行挂载:
mount -t nfs -o nolock 192.168.2.134:/home/cx/workspace/nfs /mnt
其中192.168.2.134为笔者的Ubuntu主机IP地址,/mnt为挂载到开发板的目录。
在串口终端中输入”ls /mnt”可以看到hello_world.elf文件,输入如下命令执行该elf文件:
chmod +x /mnt/hello_world.elf #赋予可执行权限
/mnt/hello_world.elf #执行
执行结果如下图所示:
图 8.4.1 执行elf文件
可以看到打印出“Hello World”信息,表明执行成功。
8.5使用SSH方式运行
SSH方式是将工程的elf文件传到开发板上的Linux系统中,在Ubuntu主机终端中输入如下命令将elf文件传到开发板的Linux系统中(上一节已经工程的elf文件复制到/home/cx/workspace/nfs文件夹):
scp /home/cx/workspace/nfs/hello_world.elf root@192.168.2.132:/home/root
上面命令的192.168.2.132为笔者使用的开发板的IP地址,/home/root表示传到开发板的该目录下,也就是root用户所在的目录。
执行结果如下图所示:
在这里插入图片描述

图 8.5.1 scp命令传输文件
需要输入开发板上Linux系统的root用户密码,默认为”root”。传输完成后,在串口终端中输入“ls”会看到有一个hello_world.elf文件。输入“./hello_world.elf”会打印出“Hello World”信息,表明运行成功。在串口上位机中输入的命令及结果如下图所示:
在这里插入图片描述

图 8.5.2 命令及结果
8.6Vitis开发Linux外设
前面我们用Vitis开发了Linux最基础的HelloWorld应用,其实我们还可以用Vitis开发Linux外设,比如按键和LED。我们将helloworld.c的内容替换成如下内容:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include <signal.h>
#include <pthread.h>
#include <linux/input.h>
  
#define LED_BRIGHTNESS    "/sys/class/leds/ps_led1/brightness"
#define LED_TRIGGER       "/sys/class/leds/ps_led1/trigger"
#define INPUT_EVENT       "/dev/input/event0"
#define LED_MAX_SPEED     10
#define PERIOD_COEFF       16000
  
unsigned int led_speed;
pthread_mutex_t lock;
  
/* Blink LED */
static void *LEDMod(void *dummy)
{
    unsigned int led_period;
    int tmp;
    tmp = open(LED_BRIGHTNESS, O_WRONLY);
    if (tmp < 0)
        exit(1);
    while (1) {
        pthread_mutex_lock(&lock);
        led_period = (LED_MAX_SPEED - led_speed) * PERIOD_COEFF;
        pthread_mutex_unlock(&lock);
  
        write(tmp, "1", 2);
        usleep(led_period);
        write(tmp, "0", 2);
        usleep(led_period);
    }
}
  
int main()
{
    pthread_t pth;
    struct input_event ev;
    int tmp;
    int key_code;
    int size = sizeof(ev);
  
    /* Configure LED */
    led_speed = 5;
    tmp = open(LED_TRIGGER, O_WRONLY);
    if (tmp < 0)
        return 1;
    if (write(tmp, "default-on", 10) != 10) {
        printf("Error writing trigger");
        return 1;
    }
    close(tmp);
    printf("Configured LED for use\n");
  
    /* Create thread */
    pthread_mutex_init(&lock, NULL);
    pthread_create(&pth, NULL, LEDMod, "Blinking LED...");
  
    /* Read event0 */
    tmp = open(INPUT_EVENT, O_RDONLY);
    if (tmp < 0) {
        printf("\nOpen " INPUT_EVENT " failed!\n");
        return 1;
    }
    /* Read and parse event, update global variable */
    while (1) {
        if (read(tmp, &ev, size) < size) {
            printf("\nReading from " INPUT_EVENT " failed!\n");
            return 1;
        }
  
        if (ev.value == 1 && ev.type == 1) {    /* Down press only */
            key_code = ev.code;
            if (key_code == KEY_DOWN) {    /* lower speed */
                /* Protect from concurrent read/write */
                pthread_mutex_lock(&lock);
                if (led_speed > 0)
                    led_speed -= 1;
                pthread_mutex_unlock(&lock);
            } else if (key_code == KEY_UP) {    /* raise speed */
                pthread_mutex_lock(&lock);
                if (led_speed < 9)
                    led_speed += 1;
                pthread_mutex_unlock(&lock);
            }
            printf("Speed: %i\n", led_speed);
            usleep(1000);
        }
    }
}

然后编译应用工程,会出现如下图所示错误:

图 8.6.1 编译出错
出错的原因是缺少相应库——pthread库,现在我们来添加pthread库。鼠标右键点击“hello_world”应用工程,在弹出的菜单中选择“C/C++ Build Settings”,如下图所示:
在这里插入图片描述

图 8.6.2 “C/C++ Build Settings”
添加pthread库,添加方式如下图所示:
在这里插入图片描述

图 8.6.3 添加pthread库
添加完成后,点击该设置界面右下角的“Apply and Close”。再次编译应用工程,编译完成后下载,结果如下图所示:
在这里插入图片描述
在这里插入图片描述

图 8.6.4 输出信息
可以看到开发板上的PS_LED1灯闪烁,按开发板上的PS_KEY1和PS_KEY2可以控制PS_LED1灯的闪烁频率。
当然了也可以用Vitis调试应用工程,此处就不介绍了。
8.7扩展阅读
在Vitis IDE 中构建 Linux 应用程序:https://china.xilinx.com/video/software/building-linux-application-vitis.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129735.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

日本知名汽车零部件公司巡礼系列之株式会社140

株式会社140 业务内容&#xff1a; ・特殊切削工具汽车零件加工用特殊工具的设计、制作・特殊零件海斯、超硬、陶瓷、cBNCD工具的设计与制作・制造用夹具、安装用具、检查用具、定位用具、消耗工具等一制造装饰零件相关的装置或专用机的构成零件等・模具零件制作…钳子、模具…

Spring Boot整合MyBatis(保姆级教程)

前言 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java Objec…

【正点原子FPGA连载】第九章Linux图形界面的搭建摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第九章Linux图形…

单片机之震动传感器、继电器、433M无线发射接收等模块介绍及应用

目录 一、震动传感器模块 二、继电器介绍 三、433M无线发射接收模块 1、 无线控制报警器代码 2、电动车简易防盗器代码实现 一、震动传感器模块 单片机供电VCC GND接单片机 产品不震动&#xff0c;输出高电平、模块上的AO口 产品震动&#xff0c;输出低电平&#xff0c…

Python使用库(一)

Python使用库 库 就是是别人已经写好了的代码, 可以让我们直接拿来用. 荀子曰: “君子性非异也&#xff0c;善假于物也” 一个编程语言能不能流行起来, 一方面取决于语法是否简单方便容易学习, 一方面取决于生态是否完备. 所谓的 “生态” 指的就是语言是否有足够丰富的库, 来…

day11-分类和static

1.案例驱动模式 1.1案例驱动模式概述 (理解) 通过我们已掌握的知识点,先实现一个案例,然后找出这个案例中,存在的一些问题,在通过新知识点解决问题 1.2案例驱动模式的好处 (理解) 解决重复代码过多的冗余,提高代码的复用性解决业务逻辑聚集紧密导致的可读性差,提高代码的可…

【python Turtle源码】教你如何画一只迎福虎将~

前言 大家早好、午好、晚好吖 ❤ ~ 代码展示 导入模块 from turtle import * import time因代码体量有点多 这里就给大家部分展示了&#xff0c;有需要的可以文章下方名片获取哦~ &#xff08;或者评论已点赞收藏&#xff0c;求代码&#xff0c;我私你呀&#xff09; COLO…

用Python实现童年小游戏贪吃蛇

贪吃蛇游戏是有史以来最受欢迎的街机游戏之一。在这个游戏中&#xff0c;玩家的主要目标是在不撞墙或不撞墙的情况下抓住最大数量的水果。在学习 Python 或 Pygame 时&#xff0c;可以将创建蛇游戏视为一项挑战。这是每个新手程序员都应该接受的最好的初学者友好项目之一。学习…

Glove模型的原理与代码

文章目录一、背景二、原理部分1.共现矩阵2. F值的获取3. Glove公式的获取4. 损失函数的获取三、代码部分1.词表映射2. 词嵌入3. 训练函数4. 输出结果总结一、背景 GloVe模型即Global Vectors模型&#xff0c;该模型认为语料库中单词出现的统计(共现矩阵) 是学习词向量表示的无监…

将博客系统部署到云服务器上(允许外网访问)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录访问链接测试部署简单回顾 部署普通小孩也要热爱生活&#xff01; 访问链接测试 个人博客系统 登录名&#xff1a;小小周 密码&#xff1a;xiaozhou 部署 在Linux上搭建一个Java部署环境&#xff0c;然后开始进行博…

声明式事务的属性之传播行为

声明式事务的属性之传播行为 ①介绍 当事务方法被另一个事务方法调用时&#xff0c;必须指定事务应该如何传播。例如&#xff1a;方法可能继续在现有事务中运行&#xff0c;也可能开启一个新事务&#xff0c;并在自己的事务中运行。 ②测试 Controller public class BookC…

望尘科技通过港交所聆讯:坚持深耕“体育游戏”的收获者

文|螳螂观察 作者|李永华 行将结束的2022年&#xff0c;体育大年&#xff0c;除了令人心跳加速的赛事&#xff0c;还有遍地的“黄金”。 各领域大大小小的厂商们使出浑身解数&#xff0c;掘金市场。 刚刚过去不久的世界杯&#xff0c;让这一过程到达了高潮。 广告代言、彩…

排序(完整版)

目录 一、基本概念 二、排序的分类 三、排序算法的好坏的衡量 四、五类内排序 插入排序 直接插入排序 演示&#xff1a; 关键代码&#xff1a; 完整代码 结果&#xff1a; 插入排序算法分析&#xff1a; 带哨兵的插入排序 举例&#xff1a; 关键代码 完整代码 折半…

365天深度学习训练营-第P4周:猴痘病识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 内部限免文章&#xff08;版权归 K同学啊 所有&#xff09;&#x1f366; 参考文章地址&#xff1a; &#x1f517;第P4周&#xff1a;猴痘病识别 | 365天深度学习训练营&#x1f356; 作者&#xff1a;K同学啊 | 接辅导…

Java 发送邮件

使用Java应用程序发送 E-mail 十分简单&#xff0c;但是首先你应该在你的机器上安装 JavaMail API 和Java Activation Framework (JAF) 。 您可以从 Java 网站下载最新版本的 JavaMail&#xff0c;打开网页右侧有个 Downloads 链接&#xff0c;点击它下载。您可以从 Java 网站…

从业10多年,我总结了这几款程序员必备实用工具

优秀程序员之所以优秀的原因并不一定是他写代码的速度比别人快&#xff0c;而是他解决事情的效率比别人高、副业渠道比别人广&#xff0c;所以提供工作效率的方法并不需要我们样样精通&#xff0c;提高副业收入的办法也不需要我们挖空心思&#xff0c;有时候使用好的工具就能帮…

微信小程序开发实战11_1 微信支付下单

微信支付流程图 微信支付存在多个业务流程&#xff0c;包括微信支付流程、退款流程等。本章节主要介绍微信的支付下单流程&#xff0c;图12-1是微信支付流程的交互图&#xff1a; 重点环节说明 步骤1&#xff1a;小程序端用户向商户服务器发起支付请求&#xff0c;重点是提供…

Appium基础 — webview操作(重点)

我们之前说过的所有操作&#xff0c;都是对原生页面的操作。 在手机APP中&#xff0c;除了原生页面&#xff0c;还是有webview页面&#xff08;也就是H5页面&#xff09;&#xff0c;下面我们就说说对webview页面的操作。 1、先了解什么是Hybrid&#xff08;混合&#xff09;…

【Web安全】Ysoserial 简单利用

Ysoserial 简单利用1. Java 反序列化特征2. Ysoserial 流量特征3. Ysoserial 攻击流程3.1 找到序列化接口3.2 漏洞利用3.2.1 常用命令3.2.2 使用案例4. Ysoserial 攻击原理问题参考1. Java 反序列化特征 在日志中&#xff0c;特征通常表现为 请求格式 Json、xml、soap、二进制…

拓扑排序的java代码实现过程详解

拓扑排序 在现实生活中&#xff0c;我们经常会同一时间接到很多任务去完成&#xff0c;但是这些任务的完成是有先后次序的。以我们学习java学科为例&#xff0c;我们需要学习很多知识&#xff0c;但是这些知识在学习的过程中是需要按照先后次序来完成的。从java基础&#xff0c…