QtCreator学习(二).在stm32mp1中使用

0.配置编译环境

  1. 复制【正点原子】STM32MP157开发板(A盘)-基础资料\05、开发工具\01、交叉编译器st-example-image-qtwayland-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-snapshot.sh到虚拟机
  2. chmod添加可执行文件,./st*运行,选择安装目录在/opt/st/stm32mp1/qt_crossCompile/中

编译

  1. source /opt/st/stm32mp1/qt_crossCompile/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi设置环境变量
  2. 进入pro文件所在目录命令:qmake生成makefile
  3. make -j 8开始编译生成可执行文件复制到开发板运行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

15.led控制

项目简介:设置一个按钮,点击即可控制 LED 状态反转(点亮或者熄灭 LED)。项目看来很起来很简单,实际上有些需要注意的地方,我们在改变 LED 的状态时,需要先去读取 LED的状态,防止外界(外面应用程序)将 LED 的状态改变了。否则我们反转操作将不成立。在
C++里一般使用 get()和 set()方法来获取和设置。我们的 LED 程序里也有这种方法。所以需要写好一个让人看得懂的程序是有“方法”的。不能将程序功能写在一堆,最好是分开写,留有接口。让后面的人看懂!
例 01_led,控制 LED

  1. windows.h
/******************************************************************
Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
* @projectName   01_led
* @brief         mainwindow.h
* @author        Deng Zhimao
* @email         1252699831@qq.com
* @net           www.openedv.com
* @date          2021-03-08
*******************************************************************/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QPushButton>
#include <QFile>class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:/* 按钮 */QPushButton *pushButton;/* 文件 */QFile file;/* 设置lED的状态 */void setLedState();/* 获取lED的状态 */bool getLedState();private slots:void pushButtonClicked();
};
#endif // MAINWINDOW_H
  1. windows.cpp
/******************************************************************
Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
* @projectName   01_led
* @brief         mainwindow.cpp
* @author        Deng Zhimao
* @email         1252699831@qq.com
* @net           www.openedv.com
* @date          2021-03-08
*******************************************************************/
#include "mainwindow.h"
#include <QDebug>
#include <QGuiApplication>
#include <QScreen>
#include <QRect>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{/* 获取屏幕的分辨率,Qt官方建议使用这* 种方法获取屏幕分辨率,防上多屏设备导致对应不上* 注意,这是获取整个桌面系统的分辨率*/QList <QScreen *> list_screen =  QGuiApplication::screens();/* 如果是ARM平台,直接设置大小为屏幕的大小 */
#if __arm__/* 重设大小 */this->resize(list_screen.at(0)->geometry().width(),list_screen.at(0)->geometry().height());/* 默认是出厂系统的LED心跳的触发方式,想要控制LED,* 需要改变LED的触发方式,改为none,即无 */system("echo none > /sys/class/leds/sys-led/trigger");
#else/* 否则则设置主窗体大小为800x480 */this->resize(800, 480);
#endifpushButton = new QPushButton(this);/* 居中显示 */pushButton->setMinimumSize(200, 50);pushButton->setGeometry((this->width() - pushButton->width()) /2 ,(this->height() - pushButton->height()) /2,pushButton->width(),pushButton->height());/* 开发板的LED控制接口 */file.setFileName("/sys/devices/platform/leds/leds/sys-led/brightness");if (!file.exists())/* 设置按钮的初始化文本 */pushButton->setText("未获取到LED设备!");/* 获取LED的状态 */getLedState();/* 信号槽连接 */connect(pushButton, SIGNAL(clicked()),this, SLOT(pushButtonClicked()));
}MainWindow::~MainWindow()
{
}void MainWindow::setLedState()
{/* 在设置LED状态时先读取 */bool state = getLedState();/* 如果文件不存在,则返回 */if (!file.exists())return;if(!file.open(QIODevice::ReadWrite))qDebug()<<file.errorString();QByteArray buf[2] = {"0", "1"};/* 写0或1 */if (state)file.write(buf[0]);elsefile.write(buf[1]);/* 关闭文件 */file.close();/*重新获取LED的状态 */getLedState();
}bool MainWindow::getLedState()
{/* 如果文件不存在,则返回 */if (!file.exists())return false;if(!file.open(QIODevice::ReadWrite))qDebug()<<file.errorString();QTextStream in(&file);/* 读取文件所有数据 */QString buf = in.readLine();/* 打印出读出的值 */qDebug()<<"buf: "<<buf<<endl;file.close();if (buf == "1") {pushButton->setText("LED点亮");return true;} else {pushButton->setText("LED熄灭");return false;}
}void MainWindow::pushButtonClicked()
{/* 设置LED的状态 */setLedState();
}
  1. 运行,下面为 Ubuntu 上仿真界面的效果,由于 Ubuntu 不是“开发板”,所以在读取 LED 设备时会读取失败。实际在板上运行图略。交叉编译程序到正点原子 STM32MP157 开发板上运行即可控制 LED 的状态。
    在这里插入图片描述

16.控制beep

想要控制这个蜂鸣器(BEEP),首先正点原子的出厂内核已经默认将这个 LED 注册成了 gpio-leds 类型设备。所以实例与上一小节 LED 实例是一样的。项目简介:设置一个按钮,点击即可控制 BEEP 状态反转(打开蜂鸣器或者关闭蜂鸣器)。
例 02_beep,控制 BEEP

  1. windows.h
/******************************************************************
Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
* @projectName   02_beep
* @brief         mainwindow.h
* @author        Deng Zhimao
* @email         1252699831@qq.com
* @net           www.openedv.com
* @date          2021-03-11
*******************************************************************/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QPushButton>
#include <QFile>class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:/* 按钮 */QPushButton *pushButton;/* 文件 */QFile file;/* 设置BEEP的状态 */void setBeepState();/* 获取BEEP的状态 */bool getBeepState();private slots:/* 槽函数 */void pushButtonClicked();
};
#endif // MAINWINDOW_H
  1. windows.cpp
/******************************************************************
Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
* @projectName   02_beep
* @brief         mainwindow.cpp
* @author        Deng Zhimao
* @email         1252699831@qq.com
* @net           www.openedv.com
* @date          2021-03-11
*******************************************************************/
#include "mainwindow.h"
#include <QDebug>
#include <QGuiApplication>
#include <QScreen>
#include <QRect>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{/* 获取屏幕的分辨率,Qt官方建议使用这* 种方法获取屏幕分辨率,防上多屏设备导致对应不上* 注意,这是获取整个桌面系统的分辨率*/QList <QScreen *> list_screen =  QGuiApplication::screens();/* 如果是ARM平台,直接设置大小为屏幕的大小 */
#if __arm__/* 重设大小 */this->resize(list_screen.at(0)->geometry().width(),list_screen.at(0)->geometry().height());
#else/* 否则则设置主窗体大小为800x480 */this->resize(800, 480);
#endifpushButton = new QPushButton(this);/* 居中显示 */pushButton->setMinimumSize(200, 50);pushButton->setGeometry((this->width() - pushButton->width()) /2 ,(this->height() - pushButton->height()) /2,pushButton->width(),pushButton->height());/* 开发板的蜂鸣器控制接口 */file.setFileName("/sys/devices/platform/leds/leds/beep/brightness");if (!file.exists())/* 设置按钮的初始化文本 */pushButton->setText("未获取到BEEP设备!");/* 获取BEEP的状态 */getBeepState();/* 信号槽连接 */connect(pushButton, SIGNAL(clicked()),this, SLOT(pushButtonClicked()));
}MainWindow::~MainWindow()
{
}void MainWindow::setBeepState()
{/* 在设置BEEP状态时先读取 */bool state = getBeepState();/* 如果文件不存在,则返回 */if (!file.exists())return;if(!file.open(QIODevice::ReadWrite))qDebug()<<file.errorString();QByteArray buf[2] = {"0", "1"};if (state)file.write(buf[0]);elsefile.write(buf[1]);file.close();getBeepState();
}bool MainWindow::getBeepState()
{/* 如果文件不存在,则返回 */if (!file.exists())return false;if(!file.open(QIODevice::ReadWrite))qDebug()<<file.errorString();QTextStream in(&file);/* 读取文件所有数据 */QString buf = in.readLine();/* 打印出读出的值 */qDebug()<<"buf: "<<buf<<endl;file.close();if (buf == "1") {pushButton->setText("BEEP开");return true;} else {pushButton->setText("BEEP关");return false;}
}void MainWindow::pushButtonClicked()
{/* 设置蜂鸣器的状态 */setBeepState();
}
  1. 运行,下面为 Ubuntu 上仿真界面的效果,由于 Ubuntu 不是“开发板”,所以在读取 BEEP 设备时会读取失败。实际在板上运行图略。交叉编译程序到正点原子 STM32MP157 开发板上运行即可控制蜂鸣器的状态。
    在这里插入图片描述

17.串口series port

在正点原子的 STM32MP157 开发板的出厂系统里,默认已经配置了三路串口可用。一路是调试串口 UART4(对应系统里的节点/dev/ttySTM0),一路是 UART3(对应系统里的节点/dev/ttySTM1),另一路是 UART5(对应系统里的节点/dev/ ttySTM2),由于 UART4 已经作为调试串口被使用。所以我们只能对 UART5/UART3 编程
例 03_serialport,Qt 串口编程(难度:一般)。在 03_serialport.pro 里,我们需要使用串口,需要在 pro 项目文件中添加串口模块的支持QT += core gui serialport

  1. windows.h
/******************************************************************
Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
* @projectName   03_serialport
* @brief         mainwindow.h
* @author        Deng Zhimao
* @email         1252699831@qq.com
* @net           www.openedv.com
* @date          2021-03-12
*******************************************************************/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QPushButton>
#include <QTextBrowser>
#include <QTextEdit>
#include <QVBoxLayout>
#include <QLabel>
#include <QComboBox>
#include <QGridLayout>
#include <QMessageBox>
#include <QDebug>class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:/* 串口对象 */QSerialPort *serialPort;/* 用作接收数据 */QTextBrowser *textBrowser;/* 用作发送数据 */QTextEdit *textEdit;/* 按钮 */QPushButton *pushButton[2];/* 下拉选择盒子 */QComboBox *comboBox[5];/* 标签 */QLabel *label[5];/* 垂直布局 */QVBoxLayout *vboxLayout;/* 网络布局 */QGridLayout *gridLayout;/* 主布局 */QWidget *mainWidget;/* 设置功能区域 */QWidget *funcWidget;/* 布局初始化 */void layoutInit();/* 扫描系统可用串口 */void scanSerialPort();/* 波特率项初始化 */void baudRateItemInit();/* 数据位项初始化 */void dataBitsItemInit();/* 检验位项初始化 */void parityItemInit();/* 停止位项初始化 */void stopBitsItemInit();private slots:void sendPushButtonClicked();void openSerialPortPushButtonClicked();void serialPortReadyRead();
};
#endif // MAINWINDOW_H
  1. windows.cpp
/******************************************************************
Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
* @projectName   03_serialport
* @brief         mainwindow.cpp
* @author        Deng Zhimao
* @email         1252699831@qq.com
* @net           www.openedv.com
* @date          2021-03-12
*******************************************************************/
#include "mainwindow.h"
#include <QDebug>
#include <QGuiApplication>
#include <QScreen>
#include <QRect>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{/* 布局初始化 */layoutInit();/* 扫描系统的串口 */scanSerialPort();/* 波特率项初始化 */baudRateItemInit();/* 数据位项初始化 */dataBitsItemInit();/* 检验位项初始化 */parityItemInit();/* 停止位项初始化 */stopBitsItemInit();
}void MainWindow::layoutInit()
{/* 获取屏幕的分辨率,Qt官方建议使用这* 种方法获取屏幕分辨率,防上多屏设备导致对应不上* 注意,这是获取整个桌面系统的分辨率*/QList <QScreen *> list_screen =  QGuiApplication::screens();/* 如果是ARM平台,直接设置大小为屏幕的大小 */
#if __arm__/* 重设大小 */this->resize(list_screen.at(0)->geometry().width(),list_screen.at(0)->geometry().height());
#else/* 否则则设置主窗体大小为800x480 */this->resize(800, 480);
#endif/* 初始化 */serialPort = new QSerialPort(this);textBrowser = new QTextBrowser();textEdit = new QTextEdit();vboxLayout = new QVBoxLayout();funcWidget = new QWidget();mainWidget = new QWidget();gridLayout = new QGridLayout();/* QList链表,字符串类型 */QList <QString> list1;list1<<"串口号:"<<"波特率:"<<"数据位:"<<"检验位:"<<"停止位:";for (int i = 0; i < 5; i++) {label[i] = new QLabel(list1[i]);/* 设置最小宽度与高度 */label[i]->setMinimumSize(80, 30);/* 自动调整label的大小 */label[i]->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);/* 将label[i]添加至网格的坐标(0, i) */gridLayout->addWidget(label[i], 0, i);}for (int i = 0; i < 5; i++) {comboBox[i] = new QComboBox();comboBox[i]->setMinimumSize(80, 30);/* 自动调整label的大小 */comboBox[i]->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);/* 将comboBox[i]添加至网格的坐标(1, i) */gridLayout->addWidget(comboBox[i], 1, i);}/* QList链表,字符串类型 */QList <QString> list2;list2<<"发送"<<"打开串口";for (int i = 0; i < 2; i++) {pushButton[i] = new QPushButton(list2[i]);pushButton[i]->setMinimumSize(80, 30);/* 自动调整label的大小 */pushButton[i]->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);/* 将pushButton[0]添加至网格的坐标(i, 5) */gridLayout->addWidget(pushButton[i], i, 5);}pushButton[0]->setEnabled(false);/* 布局 */vboxLayout->addWidget(textBrowser);vboxLayout->addWidget(textEdit);funcWidget->setLayout(gridLayout);vboxLayout->addWidget(funcWidget);mainWidget->setLayout(vboxLayout);this->setCentralWidget(mainWidget);/* 占位文本 */textBrowser->setPlaceholderText("接收到的消息");textEdit->setText("www.openedv.com");/* 信号槽连接 */connect(pushButton[0], SIGNAL(clicked()),this, SLOT(sendPushButtonClicked()));connect(pushButton[1], SIGNAL(clicked()),this, SLOT(openSerialPortPushButtonClicked()));connect(serialPort, SIGNAL(readyRead()),this, SLOT(serialPortReadyRead()));
}void MainWindow::scanSerialPort()
{/* 查找可用串口 */foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) {comboBox[0]->addItem(info.portName());}
}void MainWindow::baudRateItemInit()
{/* QList链表,字符串类型 */QList <QString> list;list<<"1200"<<"2400"<<"4800"<<"9600"<<"19200"<<"38400"<<"57600"<<"115200"<<"230400"<<"460800"<<"921600";for (int i = 0; i < 11; i++) {comboBox[1]->addItem(list[i]);}comboBox[1]->setCurrentIndex(7);
}void MainWindow::dataBitsItemInit()
{/* QList链表,字符串类型 */QList <QString> list;list<<"5"<<"6"<<"7"<<"8";for (int i = 0; i < 4; i++) {comboBox[2]->addItem(list[i]);}comboBox[2]->setCurrentIndex(3);
}void MainWindow::parityItemInit()
{/* QList链表,字符串类型 */QList <QString> list;list<<"None"<<"Even"<<"Odd"<<"Space"<<"Mark";for (int i = 0; i < 5; i++) {comboBox[3]->addItem(list[i]);}comboBox[3]->setCurrentIndex(0);
}void MainWindow::stopBitsItemInit()
{/* QList链表,字符串类型 */QList <QString> list;list<<"1"<<"2";for (int i = 0; i < 2; i++) {comboBox[4]->addItem(list[i]);}comboBox[4]->setCurrentIndex(0);
}void MainWindow::sendPushButtonClicked()
{/* 获取textEdit数据,转换成utf8格式的字节流 */QByteArray data = textEdit->toPlainText().toUtf8();serialPort->write(data);
}void MainWindow::openSerialPortPushButtonClicked()
{if (pushButton[1]->text() == "打开串口") {/* 设置串口名 */serialPort->setPortName(comboBox[0]->currentText());/* 设置波特率 */serialPort->setBaudRate(comboBox[1]->currentText().toInt());/* 设置数据位数 */switch (comboBox[2]->currentText().toInt()) {case 5:serialPort->setDataBits(QSerialPort::Data5);break;case 6:serialPort->setDataBits(QSerialPort::Data6);break;case 7:serialPort->setDataBits(QSerialPort::Data7);break;case 8:serialPort->setDataBits(QSerialPort::Data8);break;default: break;}/* 设置奇偶校验 */switch (comboBox[3]->currentIndex()) {case 0:serialPort->setParity(QSerialPort::NoParity);break;case 1:serialPort->setParity(QSerialPort::EvenParity);break;case 2:serialPort->setParity(QSerialPort::OddParity);break;case 3:serialPort->setParity(QSerialPort::SpaceParity);break;case 4:serialPort->setParity(QSerialPort::MarkParity);break;default: break;}/* 设置停止位 */switch (comboBox[4]->currentText().toInt()) {case 1:serialPort->setStopBits(QSerialPort::OneStop);break;case 2:serialPort->setStopBits(QSerialPort::TwoStop);break;default: break;}/* 设置流控制 */serialPort->setFlowControl(QSerialPort::NoFlowControl);if (!serialPort->open(QIODevice::ReadWrite))QMessageBox::about(NULL, "错误","串口无法打开!可能串口已经被占用!");else {for (int i = 0; i < 5; i++)comboBox[i]->setEnabled(false);pushButton[1]->setText("关闭串口");pushButton[0]->setEnabled(true);}} else {serialPort->close();for (int i = 0; i < 5; i++)comboBox[i]->setEnabled(true);pushButton[1]->setText("打开串口");pushButton[0]->setEnabled(false);}
}void MainWindow::serialPortReadyRead()
{/* 接收缓冲区中读取数据 */QByteArray buf = serialPort->readAll();textBrowser->insertPlainText(QString(buf));
}
MainWindow::~MainWindow()
{
}
  1. 运行,下面为 Ubuntu 上仿真界面的效果,请将程序交叉编译后到 STM32MP157 开发板运行,用串口线连接开发板的 UART3/UART5 到电脑串口,在电脑用正点原子的 XCOM 上位机软件(或者本程序亦可当上位机软件),设置相同的串口参数,在 LCD 屏幕上选择串口号为ttySTM1/ttySTM2(注意 ttySTM0 已经作为调试串口被使用了!),点击打开串口就可以进行消息收发了。默认参数为波特率为 115200,数据位为 8,校验为 None,停止位为 1,流控为关闭。
    在这里插入图片描述
    在这里插入图片描述
    k可使用usb转rs232线连接测试
    在这里插入图片描述

  1. windows.h

  1. windows.cpp

  1. 运行

  1. windows.h

  1. windows.cpp

  1. 运行

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

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

相关文章

【JAVA】Tomcat性能优化、安全配置、资源控制以及运行模式超详细

文章目录 一、Tomcat性能优化application.yml配置maxThreads 连接数限制压缩传输AJP禁用 二、JVM方向优化设置并行垃圾回收器查看gc日志文件 三、Tomcat安全配置入侵防范禁用非法HTTP请求方法禁止目录列出防止恶意关闭服务配置HTTPS加密协议HttpOnly标记安全头配置 四、Tomcat资…

【鸿蒙】HarmonyOS NEXT星河入门到实战8-自定义组件-组件通信

目录 1、模块化语法 1.1 模块化基本认知 1.2 默认导出和导入 1.3 按需导出和导入 1.4 全部导入 2、自定义组件 -基础 2.1 自定义组件 - 基本使用 2.2 自定义组件 -通用样式 2.3 自定义组件 -成员函数变量 3、 状态管理 3.1 状态管理概述 3.2 State 自己的状态 3.3…

硬盘格式化后能恢复数据吗?教你如何恢复硬盘数据

在数字时代&#xff0c;硬盘作为存储数据的重要设备&#xff0c;承载着人们大量的工作文件、珍贵照片、重要视频等。然而&#xff0c;由于误操作、病毒感染或系统升级等原因&#xff0c;有时我们不得不对硬盘进行格式化。那么&#xff0c;硬盘格式化后&#xff0c;里面的数据还…

spring综合性利用工具-SpringBootVul-GUI(五)

项目地址 https://github.com/wh1t3zer/SpringBootVul-GUI 0x01简介 本着简单到极致的原则&#xff0c;开发了这么一款半自动化工具&#xff08;PS&#xff1a;这个工具所包含了20个漏洞&#xff0c;开发不易&#xff0c;有任何问题可提issue&#xff09; 尽管是一个为懒人量…

【免费刷题】实验室安全第一知识题库分享

道路千万条&#xff0c;实验安全第一条。 嘿&#xff0c;实验室的小伙伴们&#xff01;是不是还在为实验室安全考试而烦恼&#xff1f;别担心&#xff0c;今天就让我来分享一些实用的题库&#xff0c;帮助你轻松应对考试&#xff0c;同时也更好地保护自己和实验室的安全。 一、…

petalinux开发 添加iperf

如何把iperf编译到petalinux工程中去 目录&#xff1a; /home/xxx/7z020/project-spec/meta-user/conf 里面有一个user-rootfsconfig文件 它默认里面有 CONFIG_gpio-demo CONFIG_peekpoke 把iperf添加进去 #Note: Mention Each package in individual line #These packages w…

网络安全实训八(y0usef靶机渗透实例)

1 信息收集 1.1 扫描靶机IP 1.2 收集靶机的端口开放情况 1.3 探测靶机网站的目录 1.4 发现可疑网站 1.5 打开可疑网站 2 渗透 2.1 使用BP获取请求 2.2 使用工具403bypasser.py探测可疑网页 2.3 显示可以添加头信息X-Forwarded-For:localhost来访问 2.4 添加之后转发&#xff…

如何在Django中创建新的模型实例

在 Django 中&#xff0c;创建新的模型实例可以通过以下几个步骤进行&#xff0c;通常包括定义模型、创建模型实例、保存数据到数据库&#xff0c;以及访问和操作这些实例。 1、问题背景 在 Django 中&#xff0c;可以使用 models.Model 类来创建模型&#xff0c;并使用 creat…

sqlguna靶场get shell

一、打开靶场&#xff0c;发现一个搜索框&#xff0c;尝试sql注入&#xff0c;发现可以注入&#xff0c;爆破数据库&#xff0c;表名&#xff0c;字段名以及 用户名密码 二、发现密码被MD5&#xff0c;解密后得到密码 三、进入后台界面登陆查看 四、发现添加新闻出可以上传图片…

前端开发macbook——NVM环境配置以及git配置流程

本文主要针对前端使用mac电脑时需要安装nvm对应环境&#xff0c;一文解决环境安装问题 主要步骤如下&#xff1a; 安装homebrew 安装nvm 安装git 第一步&#xff1a;安装homebrew /bin/bash -c "$(curl -fsSL https:/raw.githubusercontent.com/Homebrew/install/HE…

Redis 篇-深入了解分布式锁 Redisson 原理(可重入原理、可重试原理、主从一致性原理、解决超时锁失效)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 本章目录 1.0 基于 Redis 实现的分布式锁存在的问题 2.0 Redisson 功能概述 3.0 Redisson 具体使用 4.0 Redisson 可重入锁原理 5.0 Redisson 锁重试原理 6.0 Redisson WatchDo…

第7篇:【系统分析师】计算机网络

考点汇总 考点详情 1网络模型和协议&#xff1a;OSI/RM七层模型&#xff0c;网络标准和协议&#xff0c;TCP/IP协议族&#xff0c;端口 七层&#xff1a;应用层&#xff0c;表示层&#xff0c;会话层&#xff0c;传输层&#xff0c;网络层&#xff0c;数据链路层&#xff0c;…

如何为Google RSA安排广告定制器 [2024]

近年来&#xff0c;响应式搜索广告&#xff08;RSA&#xff09;的人气稳步上升&#xff0c;这也就不足为奇了。通过谷歌的机器学习能力&#xff0c;RSA 提供了一种强大的方式来自动测试多个标题和描述&#xff0c;以确保更接近用户的意图。其好处显而易见&#xff1a;RSA 意味着…

Docker容器技术1——docker基本操作

Docker容器技术 随着云计算和微服务架构的普及&#xff0c;容器技术成为了软件开发、测试和部署过程中的重要组成部分。其中&#xff0c;Docker作为容器技术的代表之一&#xff0c;以其简便易用的特点赢得了广大开发者的青睐。 Docker允许开发者在轻量级、可移植的容器中打包和…

通信工程学习:什么是GFP通用成帧规范

GFP&#xff1a;通用成帧规范 GFP通用成帧规范&#xff08;Generic Framing Procedure&#xff09;是一种先进的数据业务适配的通用协议和映射技术&#xff0c;由国际电联ITU-T的G.7041标准定义。该技术旨在透明地将各种不同物理层或逻辑链路层信号适配进入SDH&#xff08;同步…

Unity UI 系统:Unity UI package (uGUI) 使用说明

卡牌游戏 UI 系统 Unity UI 基础概念 布局&#xff08;Layout&#xff09; Unity 的屏幕坐标定义为左下角为 (0, 0)&#xff0c;右上角为 (1, 1) 。 锚点&#xff08;Anchor&#xff09; 锚点控制 子矩形UI的边 相对 父矩形对应坐标轴的指定比例边 的 距离 保持不变。 Anc…

s3c2440---中断控制器

一、概述 S3C2440A 中的中断控制器接受来自 60 个中断源的请求。提供这些中断源的是内部外设&#xff0c;如 DMA 控制器、 UART、IIC 等等。 在这些中断源中&#xff0c;UARTn、AC97 和 EINTn 中断对于中断控制器而言是“或”关系。 当从内部外设和外部中断请求引脚收到多个中…

区间的合并

给定 n个区间 [,]&#xff0c;要求合并所有有交集的区间。 注意如果在端点处相交&#xff0c;也算有交集。 输出合并完成后的区间个数。 例如&#xff1a;[1,3]和 [2,6]可以合并为一个区间 [1,6]。 输入格式 第一行包含整数 n。 接下来 n行&#xff0c;每行包含两个整数 …

解决python-docx设置字体为宋体无效

环境&#xff1a;python3.12 python-docx 1.1.2 最初使用的设置字体的代码&#xff1a; from docx import Documentfrom docx.oxml.ns import qndoc Document()style doc.styles[Title]style.font.name Times New Roman # 设置西文字体style._element.rPr.rFonts.set(qn(w:e…