ZYNQ之嵌入式开发02——LED实验

文章目录

  • 通过GPIO控制LED状态
  • 通过按键控制LED状态
  • 通过EMIO复用PL端按键控制PS端LED状态
  • 通过EMIO复用多个PL端的GPIO

GPIO(General Purpose Input Output)是一个外设,用来对器件的引脚做观测(输入)和控制(输出)。每个GPIO口都是独立且可以进行动态的编程的,作为输入、输出或者中断感知。软件通过一组存储映射的寄存器来对GPIO进行控制。
MIO(Multiuse Input Output)将来自PS外设和静态存储器接口的访问多路复用到PS的引脚上。
EMIO是扩展的MIO,是PS和PL之间的一个接口,当PS的引脚不够用的时候,可以通过EMIO来进行扩展,从而使用PL的引脚。
GPIO被分为4个Bank,Bank0和Bank1通过MIO将外设连到PS端,Bank2和Bank3通过EMIO将外设连到PL端。
本实验在黑金ZYNQ 7020开发板上进行,使用PS端的MIO控制LED,实现LED的闪烁效果。

通过GPIO控制LED状态

创建IP核完成后,双击配置该IP核,勾选GPIO MIO选项。
在这里插入图片描述
使用GPIO控制LED的步骤为:初始化GPIO的驱动;设置GPIO的方向为输出;设置输出使能;写数据到GPIO输出引脚。
GPIO使用的示例可以通过bsp文件夹下的.mss文件中的网页扩展链接跳转得到。
在这里插入图片描述
这里包括了两种GPIO使用的代码示例,一种是中断类型,一种是直接使用。
在这里插入图片描述
将代码示例导入到工程中。
在这里插入图片描述
在该文件中可以参考相关的写法,碰到函数可以按住Ctrl键并点击跳转到其定义的地方。
在这里插入图片描述
原理图中有两个PS端的LED,对应着黑金开发板上的两个LED,分别接在MIO0_LED和MIO13_LED上,想要点亮LED就需要给相应的引脚置低电平。
在这里插入图片描述
找到这两个LED在原理图中的连接位置,如下图所示,这样就可以将其在代码中写入了。
在这里插入图片描述
本实验参考示例代码xgpiops_polled_example.c编写的C代码如下。

#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"#define GPIO_DEVICE_ID  	XPAR_XGPIOPS_0_DEVICE_ID
XGpioPs_Config *ConfigPtr;  //结构体类型,成员有设备ID和寄存器地址
XGpioPs Gpio;  //结构体类型,GPIO操作实例
static u32 Output_Pin0 = 0;  //PS端LED连接的输出引脚是0号或13号
static u32 Output_Pin13 = 13;  //PS端LED连接的输出引脚是0号或13号int main()
{printf("gpio led test!\n");//查找器件的配置信息ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);//初始化GPIO的驱动XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);//设置GPIO的方向为输出XGpioPs_SetDirectionPin(&Gpio, Output_Pin0, 1);  //0-input,1-outputXGpioPs_SetDirectionPin(&Gpio, Output_Pin13, 1);//设置输出使能XGpioPs_SetOutputEnablePin(&Gpio, Output_Pin0, 1);  //0-disable,1-enableXGpioPs_SetOutputEnablePin(&Gpio, Output_Pin13, 1);//写数据到GPIO输出引脚while(1){XGpioPs_WritePin(&Gpio, Output_Pin0, 0x0);   //点亮LED1printf("ps led1 on!\n");XGpioPs_WritePin(&Gpio, Output_Pin13, 0x1);  //熄灭LED2printf("ps led2 off!\n");sleep(1);XGpioPs_WritePin(&Gpio, Output_Pin0, 0x1);   //熄灭LED1printf("ps led1 off!\n");XGpioPs_WritePin(&Gpio, Output_Pin13, 0x0);  //点亮LED2printf("ps led2 on!\n");sleep(1);}return 0;
}

该程序实现的是点亮黑金开发板上PS端的两个LED,让其交叉亮灭,间隔时间是1秒,效果如下动图所示。
请添加图片描述
因为在程序中还设置了打印输出,因此SDK终端也会有相应的输出,动图如下。
请添加图片描述


通过按键控制LED状态

本实验中需要使用开发板上的两个按键分别控制两个LED的状态。
将上面点亮LED实验的Vivado工程另存,然后在另存工程的基础上进行修改。本实验相较于上面只点亮LED的实验来说,需要从按键对应的GPIO口读入数据,然后将其写入到LED对应的GPIO中。
黑金开发板中PS端的按键在原理图中的连接如下图所示,按键按下后,端口输出是低电平,没按下时是高电平。
在这里插入图片描述
找到这两个按键在原理图中的连接位置,如下图所示。
在这里插入图片描述
用PS端按键控制PS LED的C代码如下。

#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"#define GPIO_DEVICE_ID  	XPAR_XGPIOPS_0_DEVICE_ID
XGpioPs_Config *ConfigPtr;  //结构体类型,成员有设备ID和寄存器地址
XGpioPs Gpio;  //结构体类型,GPIO操作实例
static u32 Output_Pin0 = 0;  //PS端LED1连接的输出引脚是0号
static u32 Output_Pin13 = 13;  //PS端LED2连接的输出引脚是13号
static u32 Input_Pin50 = 50;  //PS端KEY1连接的输入引脚是50号
static u32 Input_Pin51 = 51;  //PS端KEY2连接的输入引脚是51号
static u32 key_value1,key_value2;int main()
{printf("gpio led test!\n");//查找器件的配置信息ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);//初始化GPIO的驱动XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);//设置LED的GPIO方向为输出XGpioPs_SetDirectionPin(&Gpio, Output_Pin0, 1);  //0-input,1-outputXGpioPs_SetDirectionPin(&Gpio, Output_Pin13, 1);//设置KEY的GPIO方向为输入XGpioPs_SetDirectionPin(&Gpio, Input_Pin50, 0);  //0-input,1-outputXGpioPs_SetDirectionPin(&Gpio, Input_Pin51, 0);//设置输出使能XGpioPs_SetOutputEnablePin(&Gpio, Output_Pin0, 1);  //0-disable,1-enableXGpioPs_SetOutputEnablePin(&Gpio, Output_Pin13, 1);while(1){//从KEY读数据key_value1 = XGpioPs_ReadPin(&Gpio, Input_Pin50);key_value2 = XGpioPs_ReadPin(&Gpio, Input_Pin51);//写数据到GPIO输出引脚XGpioPs_WritePin(&Gpio, Output_Pin0, key_value1);   //从KEY1读入的值写入LED1XGpioPs_WritePin(&Gpio, Output_Pin13, key_value2);  //从KEY2读入的值写入LED2}return 0;
}

板上验证结果如下动图所示。
请添加图片描述
在PS KEY1按下时,PS LED1点亮,在PS KEY2按下时,PS LED2点亮,松开时熄灭。


通过EMIO复用PL端按键控制PS端LED状态

PS端还可以通过EMIO复用PL端的接口。
在这里插入图片描述
在前面工程的基础上,配置IP核的时候勾选GPIO EMIO选项。
在这里插入图片描述
需要使用几个EMIO就填几个,这里只需要复用一个PL端的按键,因此选择1个。
在这里插入图片描述
这里的最大宽度是64,因为PL端有两个Bank,每个Bank是32位,如下图所示。
在这里插入图片描述
配置成功之后,IP核图示中就多了一个GPIO_0口,在其上右键选择Make External后就会为其添加引脚,可以进行自己命名引脚名称,我这里命名为了GPIO_KEY,将GPIO_0展开后可以看到其有输入、输出和使能三项,如下图所示。
在这里插入图片描述
重新生成后,打开.v文件如下,里面就多了一行我们添加的GPIO_KEY,因为现在要复用PL端的按键,因此要生成Bitstream文件,点击生成比特流。
在这里插入图片描述
生成比特流文件的时候报错了,这是因为使用PL端接口时要先进行管脚分配。
在这里插入图片描述
点击Open Elaborated Design,然后点击菜单栏Layout,选择I/O Planning调出管脚分配窗口。
在这里插入图片描述
这是PL端的4个按键,这里选择KEY1进行复用。
在这里插入图片描述
在原理图中找到其连接的位置,管脚为N15。
在这里插入图片描述
BANK35连接的电源是VCCIO_35,如下图所示。
在这里插入图片描述
在原理图中找到VCCIO_35,其输出是3.3V的电压。
在这里插入图片描述
然后在管脚分配这里进行设置,管脚设置为N15,电压设置为3.3V,如下图所示。
在这里插入图片描述
点击保存,弹出下面的窗口,自己输入一个文件名称即可。
在这里插入图片描述
这样就在源目录下生成了对应的约束文件,里面的内容就是刚才设置的。
在这里插入图片描述
再次点击生成比特流,生成结束后打开设计。
在这里插入图片描述
也可以点击Report Utilization查看使用率,如下图所示。
在这里插入图片描述
这个时候再导出硬件的时候,就要将比特流文件勾选,因为使用到了PL端的引脚。
在这里插入图片描述
PL端的Bank编号是从54开始的,本实验中也只使用了一个,因此其编号就是54。
在这里插入图片描述
本实验中的代码相比于PS端按键控制PS LED只改动了一点,将其中一个PL按键的编号改为了54,具体代码如下。

#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"#define GPIO_DEVICE_ID  	XPAR_XGPIOPS_0_DEVICE_ID
XGpioPs_Config *ConfigPtr;  //结构体类型,成员有设备ID和寄存器地址
XGpioPs Gpio;  //结构体类型,GPIO操作实例
static u32 Output_Pin0 = 0;  //PS端LED1连接的输出引脚是0号
static u32 Output_Pin13 = 13;  //PS端LED2连接的输出引脚是13号
static u32 Input_Pin50 = 50;  //PS端KEY1连接的输入引脚是50号
static u32 Input_Pin54 = 54;  //PL端KEY1设置为54
static u32 key_value1,key_value2;int main()
{printf("gpio key led test!\n");//查找器件的配置信息ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);//初始化GPIO的驱动XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);//设置LED的GPIO方向为输出XGpioPs_SetDirectionPin(&Gpio, Output_Pin0, 1);  //0-input,1-outputXGpioPs_SetDirectionPin(&Gpio, Output_Pin13, 1);//设置KEY的GPIO方向为输入XGpioPs_SetDirectionPin(&Gpio, Input_Pin50, 0);  //0-input,1-outputXGpioPs_SetDirectionPin(&Gpio, Input_Pin54, 0);//设置输出使能XGpioPs_SetOutputEnablePin(&Gpio, Output_Pin0, 1);  //0-disable,1-enableXGpioPs_SetOutputEnablePin(&Gpio, Output_Pin13, 1);while(1){//从KEY读数据key_value1 = XGpioPs_ReadPin(&Gpio, Input_Pin50);key_value2 = XGpioPs_ReadPin(&Gpio, Input_Pin54);//写数据到GPIO输出引脚XGpioPs_WritePin(&Gpio, Output_Pin0, key_value1);   //从KEY1读入的值写入LED1XGpioPs_WritePin(&Gpio, Output_Pin13, key_value2);  //从KEY2读入的值写入LED2}return 0;
}

代码编写成功后,还不能像之前那样直接下载到开发板,因为用到了PL端的资源,因此需要点击菜单栏Xilinx—>Program FPGA进行FPGA的编程,如下图所示。
在这里插入图片描述
编程完毕之后,就可以在开发板上下载程序运行了,实验结果如下图所示,成功用PL端的KEY1控制了PS端的LED2。
在这里插入图片描述


通过EMIO复用多个PL端的GPIO

本实验将通过EMIO复用8个PL端的GPIO,包括4个按键和4个LED,具体的实验结果是,PS端的两个按键分别控制PS端的两个LED,PL端的四个按键分别控制PL端的四个LED。
首先在IP核配置的时候,选择EMIO GPIO的宽度为8。
在这里插入图片描述
更新之后,IP核图示这里的GPIO显示也是8位的。
在这里插入图片描述
在原理图中找到PL端LED的引脚,再到原理图中找到其连接的位置,前面的BANK35中就有。
在这里插入图片描述
将本实验用到的8个引脚分配汇总如下表所示。

名称LED1LED2LED3LED4KEY1KEY2KEY3KEY4
引脚M14M15K16J16N15N16T17R17

电压都是3.3V,在Vivado中打开引脚配置,按照上表进行管脚分配,分配完成后如下图所示。
在这里插入图片描述
配置引脚完成后进行保存,生成比特流文件,导出到硬件,启动SDK,然后在里面修改C代码如下。

#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"#define GPIO_DEVICE_ID  	XPAR_XGPIOPS_0_DEVICE_ID
XGpioPs_Config *ConfigPtr;  //结构体类型,成员有设备ID和寄存器地址
XGpioPs Gpio;  //结构体类型,GPIO操作实例
static u32 PS_LED1 = 0;  //PS端LED1连接的输出引脚是0号
static u32 PS_LED2 = 13;  //PS端LED2连接的输出引脚是13号
static u32 PS_KEY1 = 50;  //PS端KEY1连接的输入引脚是50号
static u32 PS_KEY2 = 51;  //PS端KEY2连接的输入引脚是51号
static u32 ps_key_value1,ps_key_value2;static u32 PL_KEY1 = 54;  //PL端KEY的引脚,根据引脚[0:7]的顺序
static u32 PL_KEY2 = 55;
static u32 PL_KEY3 = 56;
static u32 PL_KEY4 = 57;
static u32 PL_LED1 = 58;
static u32 PL_LED2 = 59;
static u32 PL_LED3 = 60;
static u32 PL_LED4 = 61;
static u32 pl_key_value1,pl_key_value2,pl_key_value3,pl_key_value4;int main()
{printf("gpio emio test!\n");//查找器件的配置信息ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);//初始化GPIO的驱动XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);//设置PS LED的GPIO方向为输出XGpioPs_SetDirectionPin(&Gpio, PS_LED1, 1);  //0-input,1-outputXGpioPs_SetDirectionPin(&Gpio, PS_LED2, 1);//设置PS KEY的GPIO方向为输入XGpioPs_SetDirectionPin(&Gpio, PS_KEY1, 0);  //0-input,1-outputXGpioPs_SetDirectionPin(&Gpio, PS_KEY2, 0);//设置PS输出使能XGpioPs_SetOutputEnablePin(&Gpio, PS_LED1, 1);  //0-disable,1-enableXGpioPs_SetOutputEnablePin(&Gpio, PS_LED2, 1);//设置PL LED的GPIO方向为输出XGpioPs_SetDirectionPin(&Gpio, PL_LED1, 1);  //0-input,1-outputXGpioPs_SetDirectionPin(&Gpio, PL_LED2, 1);XGpioPs_SetDirectionPin(&Gpio, PL_LED3, 1);XGpioPs_SetDirectionPin(&Gpio, PL_LED4, 1);//设置PL KEY的GPIO方向为输入XGpioPs_SetDirectionPin(&Gpio, PL_KEY1, 0);  //0-input,1-outputXGpioPs_SetDirectionPin(&Gpio, PL_KEY2, 0);XGpioPs_SetDirectionPin(&Gpio, PL_KEY3, 0);XGpioPs_SetDirectionPin(&Gpio, PL_KEY4, 0);//设置PL输出使能XGpioPs_SetOutputEnablePin(&Gpio, PL_LED1, 1);  //0-disable,1-enableXGpioPs_SetOutputEnablePin(&Gpio, PL_LED2, 1);XGpioPs_SetOutputEnablePin(&Gpio, PL_LED3, 1);XGpioPs_SetOutputEnablePin(&Gpio, PL_LED4, 1);while(1){//从PS KEY读数据ps_key_value1 = XGpioPs_ReadPin(&Gpio, PS_KEY1);ps_key_value2 = XGpioPs_ReadPin(&Gpio, PS_KEY2);//写数据到PS LEDXGpioPs_WritePin(&Gpio, PS_LED1, ps_key_value1);   //从PS KEY1读入的值写入PS LED1XGpioPs_WritePin(&Gpio, PS_LED2, ps_key_value2);  //从PS KEY2读入的值写入PS LED2//从PL KEY读数据pl_key_value1 = XGpioPs_ReadPin(&Gpio, PL_KEY1);pl_key_value2 = XGpioPs_ReadPin(&Gpio, PL_KEY2);pl_key_value3 = XGpioPs_ReadPin(&Gpio, PL_KEY3);pl_key_value4 = XGpioPs_ReadPin(&Gpio, PL_KEY4);//写数据到PL LEDXGpioPs_WritePin(&Gpio, PL_LED1, pl_key_value1);   //从PL KEY1读入的值写入PL LED1XGpioPs_WritePin(&Gpio, PL_LED2, pl_key_value2);   //从PL KEY2读入的值写入PL LED2XGpioPs_WritePin(&Gpio, PL_LED3, pl_key_value3);   //从PL KEY3读入的值写入PL LED3XGpioPs_WritePin(&Gpio, PL_LED4, pl_key_value4);   //从PL KEY4读入的值写入PL LED4}return 0;
}

点击菜单栏Xilinx—>Program FPGA进行FPGA的编程,随后在开发板上运行程序,实验结果如下动图所示。
请添加图片描述


参考视频:
正点原子手把手教你学ZYNQ之嵌入式开发

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis-plus与mybatis同时使用别名问题

在整合mybatis和mybatis-plus的时候发现一个小坑&#xff0c;单独使用mybatis&#xff0c;配置别名如下&#xff1a; #配置映射文件中指定的实体类的别名 mybatis.type-aliases-packagecom.jk.entity XML映射文件如下&#xff1a; <update id"update" paramete…

X服务器远程连接问题解决:Bad displayname ““‘或Missing X server or $DISPLAY

X服务器远程连接问题 报错1 ImportError: this platform is not supported: (failed to acquire X connection: Bad displayname "", DisplayNameError()) Try one of the following resolutions: * Please make surethat you have an X server running, and that …

Vue2 —— 学习(四)

一、收集表单数据 &#xff08;一&#xff09;介绍 前面其实已经 学过了 v-model 双向绑定事件&#xff0c;能获取到表单中的内容到 vm 实例对象中 但是前面只是收集文本框&#xff0c;下面学习一下 各种类型表单数据收集 &#xff08;单/多 选&#xff0c;下拉框&#xff0…

第十届蓝桥杯大赛个人赛省赛(软件类) CC++ 研究生组-RSA解密

先把p&#xff0c;q求出来 #include<iostream> #include<cmath> using namespace std; typedef long long ll; int main(){ll n 1001733993063167141LL, sqr sqrt(n);for(ll i 2; i < sqr; i){if(n % i 0){printf("%lld ", i);if(i * i ! n) pri…

Linux_应用篇(03) 文件 I/O 加强

经过上一章内容的学习&#xff0c;相信各位读者对 Linux 系统应用编程中的基础文件 I/O 操作有了一定的认识和理解了&#xff0c;能够独立完成一些简单地文件 I/O 编程问题&#xff0c; 如果你的工作中仅仅只是涉及到一些简单文件读写操作相关的问题&#xff0c;其实上一章的知…

玩转儿童数码摄影,儿童人像摄影指南

一、资料前言 本套儿童人像摄影&#xff0c;大小250.91M&#xff0c;共有8个文件。 二、资料目录 《爱孩子爱摄影》.pdf 《六招拍儿童》.pdf 《数码摄影工坊-儿童摄影》.pdf 《专业儿童人像摄影指南》.pdf 宝贝看镜头.pdf 儿童摄影手册.pdf 儿童摄影艺术.pdf 玩转儿童…

RUST语言值所有权之内存复制与移动

1.RUST中每个值都有一个所有者,每次只能有一个所有者 String::from函数会为字符串hello分配一块内存 内存示例如下: 在内存分配前调用s1正常输出 在分配s1给s2后调用报错 因为s1分配给s2后,s1的指向自动失效 s1被move到s2 s1自动释放 字符串克隆使用 所有整数类型,布尔类型 …

git submodule---同步最新的内容

0 Preface/Foreword 1 同步最新submodule内容到repo中 项目的repo包含了一个子模块&#xff0c;在开发过程中&#xff0c;经常需要同步子模块最新的commit到repo中。该如何操作呢&#xff1f; 本地在克隆时候&#xff0c;已经同步把子模块中的内容克隆下来了&#xff0c;但是…

第十三篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python自动化操作PPT

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、 Python自动化操作PPT能力介绍二、常用库介绍三、创建新PPT示例代码四、编辑现有PPT示例代码五、批量处理示例代码六、数据驱动生成示例代码七、合并与拆分示例代码八、母版和版式操作示…

SpringBoot整合RabbitMQ,三种交换机类型示例

SpringBoot整合RabbitMQ&#xff0c;三种交换机类型示例 1、流程概括 2、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>3、配置RabbitMQ连接 在a…

FreeGPT3.5 开源软件

GPT-3.5不需要付费&#xff0c;也不需要注册用户&#xff0c;可以直接使用了&#xff0c;官方彻底开放了API接口。 该API政策一放开&#xff0c;GitHub很快就已经出现了一个开源项目FreeGPT35&#xff0c;可以自动生成key调用GPT3.5的API接口&#xff0c;再也用不着注册账号和申…

【服务器部署篇】Linux下安装Docker容器

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

MySQL学习笔记------多表查询

目录 多表关系 一对多 多对多 一对一 多表查询 概述 分类 内连接&#xff08;交集&#xff09; 隐式内连接 显式内连接 ​编辑 外连接&#xff08;from后为左表&#xff0c;join后为右表&#xff09; 左外连接 右外连接 自连接 联合查询&#xff08;union&#…

经典机器学习模型(八)梯度提升树GBDT详解

经典机器学习模型(八)梯度提升树GBDT详解 Boosting、Bagging和Stacking是集成学习(Ensemble Learning)的三种主要方法。 Boosting是一族可将弱学习器提升为强学习器的算法&#xff0c;不同于Bagging、Stacking方法&#xff0c;Boosting训练过程为串联方式&#xff0c;弱学习器…

Linux 学习之路 - 进程篇 - PCB介绍1-标识符

目录 一、基础的命令 <1> ps axj 命令 <2> top 命令 <3> proc 目录 二、进程的标识符 <1>范围 <2>如何获取标识符 <3>bash进程 三、创建进程 一、基础的命令 前面介绍了那么多&#xff0c;但是我们没有观察到进程相关状态&#x…

GitHub 仓库 (repository) Pulse - Contributors - Network

GitHub 仓库 [repository] Pulse - Contributors - Network 1. Pulse2. Contributors3. NetworkReferences 1. Pulse 显示该仓库最近的活动信息。该仓库中的软件是无人问津&#xff0c;还是在火热地开发之中&#xff0c;从这里可以一目了然。 2. Contributors 显示对该仓库进…

hadoop:案例:将顾客在京东、淘宝、多点三家平台的消费金额汇总,然后先按京东消费额排序,再按淘宝消费额排序

一、原始消费数据buy.txt zhangsan 5676 2765 887 lisi 6754 3234 1232 wangwu 3214 6654 388 lisi 1123 4534 2121 zhangsan 982 3421 5566 zhangsan 1219 36 45二、实现思路&#xff1a;先通过一个MapReduce将顾客的消费金额进行汇总&#xff0c;再通过一个MapReduce来根据金…

优思学院|如何利用Minitab进行满意度分析?常犯错误不可不知!

有网友提问如何运用Minitab进行满意度分析&#xff1f;他提出了一个企业培训的例子&#xff0c;如下图所示。 就他所展示的满意度调查表格&#xff0c;他只需要就你的数据进行描述性的统计分析&#xff0c;因为数据中没有包含比较或者对比&#xff08;例如&#xff0c;满意度调…

交换机与队列的介绍

1.流程 首先先介绍一个简单的一个消息推送到接收的流程&#xff0c;提供一个简单的图 黄色的圈圈就是我们的消息推送服务&#xff0c;将消息推送到 中间方框里面也就是 rabbitMq的服务器&#xff0c;然后经过服务器里面的交换机、队列等各种关系&#xff08;后面会详细讲&…

将扁平数据转换为树形数据的方法

当遇到了好多扁平数据我们都无从下手&#xff1f;不知道如何处理&#xff1f; 家人们 无脑调用这个函数就好了 接口请求回来以后 调用这个函数传入实参就可以用啦~ // 树形菜单函数 function GetTreeData(data) {let TreeData [];let map new Map(); //存在id,对应所在的内…