基于ESP32的桌面小屏幕实战[6]:环境搭建和软件基础

摘要

本文分为两部分:Linux开发环境搭建和软件基础。Linux开发环境搭建介绍了Ubuntu虚拟机安装及SSH、Samba配置,可以实现用VSCode操作虚拟机。为了后续工作,搭建了乐鑫ESP32 SDK环境。软件基础介绍了Linux开发常用的软件基础,包括Linux指令、Git、Makefile、裸机和RTOS。

环境搭建

ESP32学习方法:主要看API手册和历程

API和寄存器的关系:因为寄存器的操作太复杂了,所以原厂工程师把寄存器的操作封装成API

1. UI交互图和程序流程图

在设计软件之前,要先画UI交互图和程序流程图

img

img

2. Ubuntu虚拟机安装及SSH、Samba配置

2.1 安装虚拟机

安装VMware Workstation,我安装的版本是17.6。VMware17.6 软件安装包下载及安装教程

2.2 安装Ubuntu

官网:https://ubuntu.com/download/desktop

实测不用“科学方法”下载速度较慢。我下载的是Ubuntu 24.04.1 LTS

img

参考Ubuntu 20.04 LTS安装教程:超详细VMware安装Ubuntu虚拟机步骤
顺序略有不同,但大体一致。

2.3 在虚拟机中安装SSH

打开Ubuntu的终端,输入

sudo apt-get install openssh-server
sudo /etc/init.d/ssh start
ps -e|grep ssh

2.4 Samba服务器搭建

Samba 允许不同操作系统(如 Windows、Linux 或 macOS)的设备访问和管理该文件夹中的内容。通过 Samba 共享的文件夹可以在网络上的其他设备之间共享文件。

在Ubuntu的终端中,输入

sudo apt-get update
sudo apt-get install samba
sudo apt-get install gedit
sudo gedit /etc/samba/smb.conf

会弹出一个文档,在文档底部加入下面配置。其中share是共享文件夹的名称,可以改为别的。

[share]valid user = xzhpath = /home/xzh/sharepublic = yeswritable = yescreate mask = 0644force create mode = 0644directory mask = 0755force directory mode = 0755available = yes

改完之后保存

在Ubuntu终端中继续输入下面命令重启Samba服务:

sudo service smbd restart
sudo ufw allow samba

输入sudo smbpasswd -a xzh创建Samba用户名,我取名为xzh,然后根据提示设置密码。

img

重启下一Samba:

sudo /etc/init.d/smbd  restart

在Ubuntu终端中输入ip addr show查询Samba的IP地址

img

Interface ens33 表示我的网络接口,通常表示有线网络连接。
inet 192.168.62.128/24 是我当前机器的 IPv4 地址,即 192.168.62.128。这就是其他设备用来连接到我 Samba 服务器的 IP 地址。
inet6 fe80::20c:29ff:fe2c/64 是我机器的 IPv6 地址,但通常局域网内共享文件更多使用 IPv4 地址。

在Windows系统上按下“Windows键+R”,输入\\192.168.62.128,点击确定。

img

Windows安全中心会出现弹窗“输入网络凭据”,输入刚刚创建的Samba用户名和密码,然后点击确定就可以进入共享文件夹了。

img

2.5 在Window的VSCode中通过SSH命令行方式访问Ubuntu

在Windows中打开VSCode,安装C/C++和SSH插件

img
img

配置连接Ubuntu

img

添加配置信息:

Host ubuntuHostName 192.168.62.128User xzh

192.168.62.128为Ubuntu的IP,xzh为我Ubuntu的用户名。

保存之后刷新一下,出现ubuntu。

img

选择linux

img

选择continue

img

输入密码,按回车

img

成功连接

img

3. 乐鑫ESP32 SDK环境搭建

3.1 安装环境依赖工具

在VSCode的终端中输入

sudo apt-get update
sudo apt-get install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0

3.2 下载源码

在终端中输入:

mkdir esp
cd ~/esp
git clone -b release/v4.4 --recursive https://github.com/espressif/esp-idf.git

在git clone时遇到了这个问题:

error: RPC failed; curl 92 HTTP/2 stream 5 was not closed cleanly: CANCEL (err 8)
error: 780 bytes of body are still expected
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: fetch-pack: invalid index-pack output
fatal: clone of 'https://github.com/espressif/esp32-wifi-lib.git' into submodule path '/home/xzh/esp/esp-idf/components/esp_wifi/lib' failed
Failed to clone 'components/esp_wifi/lib' a second time, aborting

error: RPC failed; curl 92 HTTP/2 stream 5 was not closed cleanly: CANCEL (err 8)这是由于在使用 HTTP/2 协议通过 curl 下载时,网络连接中断或被取消。可能是因为网络不稳定或远程服务器的问题。

error: 780 bytes of body are still expectedGit 期望从服务器接收到更多数据,但数据传输中途中断了。

fetch-pack: unexpected disconnect while reading sideband packet在 Git 从服务器读取数据时连接被意外断开。

fatal: early EOFfatal: fetch-pack: invalid index-pack outputGit 收到了一个不完整的包,导致它在处理包时失败。EOF 表示文件或数据流提前结束。

fatal: clone of 'https://github.com/espressif/esp32-wifi-lib.git' into submodule path '/home/xzh/esp/esp-idf/components/esp_wifi/lib' failed
Git 无法完成克隆操作,因此将子模块克隆到指定路径失败。

Failed to clone 'components/esp_wifi/lib' a second time, aborting
Git 尝试重新克隆,但再次失败,因此操作中止。

解决办法

进入esp_idf文件夹内

cd /home/xzh/esp/esp-idf/components/esp_wifi/lib

单独更新子模块

git submodule update --init --recursive

3.3 安装编译链

进入到解压的esp-idf文件中,安装编译代码需要的工具链

cd ~/esp/esp-idf
export IDF_GITHUB_ASSETS="dl.espressif.com/github_assets"
./install.sh

出现报错:

pip 24.0 from /usr/lib/python3/dist-packages/pip (python 3.12)
Installing virtualenv
error: externally-managed-environment× This environment is externally managed
╰─> To install Python packages system-wide, try apt installpython3-xyz, where xyz is the package you are trying toinstall.If you wish to install a non-Debian-packaged Python package,create a virtual environment using python3 -m venv path/to/venv.Then use path/to/venv/bin/python and path/to/venv/bin/pip. Makesure you have python3-full installed.If you wish to install a non-Debian packaged Python application,it may be easiest to use pipx install xyz, which will manage avirtual environment for you. Make sure you have pipx installed.See /usr/share/doc/python3.12/README.venv for more information.note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
Traceback (most recent call last):File "/home/xzh/esp/esp-idf/tools/idf_tools.py", line 1587, in action_install_python_envimport virtualenv  # noqa: F401^^^^^^^^^^^^^^^^^
ModuleNotFoundError: No module named 'virtualenv'During handling of the above exception, another exception occurred:Traceback (most recent call last):File "/home/xzh/esp/esp-idf/tools/idf_tools.py", line 1996, in <module>main(sys.argv[1:])File "/home/xzh/esp/esp-idf/tools/idf_tools.py", line 1992, in mainaction_func(args)File "/home/xzh/esp/esp-idf/tools/idf_tools.py", line 1590, in action_install_python_envsubprocess.check_call([sys.executable, '-m', 'pip', 'install', '--user', 'virtualenv'],File "/usr/lib/python3.12/subprocess.py", line 413, in check_callraise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/usr/bin/python3', '-m', 'pip', 'install', '--user', 'virtualenv']' returned non-zero exit status 1.

分析

error: externally-managed-environment
这条错误提示表明你的 Python 环境受到了外部管理(即,操作系统的包管理系统控制了这个环境),而不允许通过 pip 在全局安装 Python 包。这是为了保护系统环境不被破坏,因为不同的包管理系统之间可能会发生冲突。

This environment is externally managed
你的操作系统(例如,Ubuntu 或 Debian)将 Python 环境标记为外部管理,阻止 pip 在全局环境中安装包,以避免系统依赖关系被破坏。

ModuleNotFoundError: No module named 'virtualenv'
你尝试运行的 Python 脚本 idf_tools.py 需要使用 virtualenv 模块,但这个模块在系统中并未安装。

解决办法

使用 apt 安装系统范围的包

sudo apt install python3-virtualenv

3.4 设置环境

把esp-idf路径设为本地路径,在终端执行:

. /home/xzh/esp/esp-idf/export.sh

3.5 判断是否搭建成功

通过idf.py --version查看 ESP-IDF 版本
得到输出:
img

通过 git log 查看当前代码状态
得到输出:
img

提交历史和 Git 标签都表明我的代码库已经成功同步到最新版本,克隆没有问题,ESP-IDF 环境应该已经搭建完成。


软件基础

4. Linux 指令

4.1 cd (Change Directory)

cd 命令用于在目录之间切换或更改当前的工作目录。

  • cd <目录路径>: 切换到指定的目录。
  • cd ..: 切换到上一级目录。
    示例:如果当前在 /home/user/Documents,执行 cd .. 将切换到 /home/user。
  • cd ~: 切换到当前用户的主目录。
    示例:cd ~ 将切换到类似 /home/username 的路径。
  • cd -: 切换到上一个工作目录。
    示例:如果你从 /home/user 切换到 /var/log,执行 cd - 将回到 /home/user。

4.2 ls (List Directory Contents)

ls 命令用于显示当前目录或指定目录中的文件和子目录的列表。

  • ls: 显示当前目录中的文件和子目录。
  • ls <目录路径>: 显示指定目录中的文件和子目录。

4.3 mkdir (Make Directory)

mkdir 命令用于创建新的目录。

  • mkdir <目录名>: 创建一个新的目录。
    示例:mkdir my_folder 会在当前目录下创建一个名为 my_folder 的目录。
  • mkdir -p <路径>: 创建目录及其父目录(如果不存在)。
    示例:mkdir -p /home/user/docs/project 如果 docs 或 project 目录不存在,它们都会被创建。

4.4 rm (Remove)

rm 命令用于删除文件或目录。

  • rm <文件名>: 删除指定文件。
  • rm -r <目录名>: 递归删除目录及其内部所有内容。

4.5 cp (Copy)

cp 命令用于复制文件或目录。

  • cp <源文件> <目标路径>: 复制文件到目标路径。
    示例:cp file.txt /home/user/Documents/ 将 file.txt 复制到 /home/user/Documents/ 目录。
  • cp <源文件> <目标文件>: 复制文件并重命名。
    示例:cp file.txt newfile.txt 将 file.txt 复制为 newfile.txt。
  • cp -r <源目录> <目标路径>: 递归复制目录及其内容。
    示例:cp -r my_folder /home/user/backup/ 将整个 my_folder 目录及其所有内容复制到 /home/user/backup/ 目录。

4.6 mv (Move)

mv 命令用于移动或重命名文件或目录。它将文件从一个位置移动到另一个位置,或者将文件/目录重命名。

  • mv <源文件> <目标路径>: 移动文件到目标路径。
    示例:mv file.txt /home/user/Documents/ 将 file.txt 移动到 /home/user/Documents/ 目录。
  • mv <源文件> <新文件名>: 重命名文件。
    示例:mv oldname.txt newname.txt 将 oldname.txt 重命名为 newname.txt。
  • mv <源目录> <目标路径>: 移动整个目录到目标路径。
    示例:mv my_folder /home/user/backup/ 将 my_folder 目录移动到 /home/user/backup/。

5. Git 使用

Git是一个版本管理工具。

5.1 编辑文件

cd share
mkdir esp_demo1
cd esp_demo1
vim test.c

新建了一个test.c文件,随便输入点啥,按Esc+:+w+q保存该文件。输入ls命令,可以看到输出test.c。

用git init创建本地仓库
然后设置用户名和邮箱
img

git status查看当前状态。输出显示test.c是新添加的文件
img

git add *把当前路径下所有文件都添加进本地仓库。

git commit -m "标签名"去打标签
img

git log看一下日志
img

如果需要修改test.c文件,用vim test.c进入文件,保存完之后,再用git add *指令添加一下。然后打个标签git commit -m "fix xxx function"
img

git log可以看到修改记录
img

git show <哈希值>可以看到,某一次修改的内容
img

img

再用vim test.c加点东西,然后用git diff查看区别
img

5.2 添加分支

分支(branch)允许你在不同的开发线上工作,避免干扰主项目的稳定版本,并为不同的功能、修复或实验提供独立的空间。

git checkout -b dev添加分支,用git branch -a查看本地仓库有哪些分支。
img

vim test.c修改文件。用git add *添加,用git commit -m 打标签。用git log
img

git checkout main回到主分支,用git log查看日志,发现主分支的日志没被污染。
img

5.3 结束打标签

在软件发布时一般用git tag -a v1.0 -m "v1.0 version"打标签。输入git tag -l查看,输出显示:
img

6. Makefile

Makefile 是由 GNU Make 工具使用的文件,定义了项目的编译规则。它描述了如何从源代码生成可执行文件或其他目标文件,主要通过一系列的规则、依赖关系和命令来完成。

CMake 是一个跨平台的构建系统工具,比 Makefile 更高级,适合管理更复杂的项目。CMake 的主要作用是生成平台特定的构建文件(如 Makefile 或 Visual Studio 工程文件),简化跨平台构建流程。CMake 使用 CMakeLists.txt 文件来定义项目的构建规则。CMake 通过解析这个文件,根据目标平台生成相应的构建文件。

  • Makefile:较为基础,适用于单一平台和相对简单的项目,依赖于开发者自己定义的规则和依赖关系。
  • CMake:跨平台,适用于大型和复杂项目,自动处理依赖并生成平台特定的构建文件。

7. “裸机”和实时操作系统(RTOS)

在嵌入式系统开发中,"裸机"和"实时操作系统(RTOS)"是两种常见的编程模式。它们在资源管理、任务调度和系统复杂性等方面有显著的区别。

7.1 裸机编程

裸机编程(Bare Metal Programming)指的是直接在硬件上运行代码,不依赖任何操作系统。所有的系统资源、外设和任务调度由程序员手动管理。这种编程方式通常用于资源受限、系统简单且对实时性要求不高的嵌入式设备。

7.2 实时操作系统(RTOS)

实时操作系统(RTOS)是一类专门为实时应用设计的操作系统,能够提供确定性的任务调度,保证任务在严格的时间限制内完成。RTOS通过内核来管理任务调度、中断处理、资源共享等功能。

推荐链接

  • ESP-IDF 编程指南 release-v4.4
  • ESP-IDF 编程指南 版本 v5.3.1
  • DesktopScreen 1 环境搭建

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

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

相关文章

FreeRtos的使用教程

定义&#xff1a; RTOS实时操作系统, (Real Time Operating System), 指的是当外界事件发生时, 能够有够快的响应速度,调度一切可利用的资源, 控制实时任务协调一致的运行。 特点&#xff1a; 支持多任务管理&#xff0c; 处理多个事件&#xff0c; 实现更复杂的逻辑。 与计算…

【精选】基于数据挖掘的招聘信息分析与市场需求预测系统 职位分析、求职者趋势分析 职位匹配、人才趋势、市场需求分析数据挖掘技术 职位需求分析、人才市场趋势预测

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Go中的三种锁

Go 中的锁 Go 语言提供了多种锁机制&#xff0c;用于在并发编程中保护共享资源。常见的锁包括 互斥锁、读写锁 和 sync.Map 的安全锁。 1. 互斥锁&#xff08;Mutex&#xff09; 原理 互斥锁&#xff08;sync.Mutex&#xff09;是一种最简单的锁机制&#xff0c;用于保护共…

2025美赛数学建模C题:奥运金牌榜,完整论文代码模型目前已经更新

2025美赛数学建模C题&#xff1a;奥运金牌榜&#xff0c;完整论文代码模型目前已经更新&#xff0c;获取见文末名片

【数据结构】深入解析:构建父子节点树形数据结构并返回前端

树形数据结构列表 一、前言二、测试数据生成三、树形代码3.1、获取根节点3.2、遍历根节点&#xff0c;递归获取所有子节点3.3、排序3.4、完整代码 一、前言 返回前端VO对象中&#xff0c;有列情况列表展示需要带树形结构&#xff0c;例如基于RBAC权限模型中的菜单返回&#xf…

Docker快速部署高效照片管理系统LibrePhotos搭建私有云相册

文章目录 前言1.关于LibrePhotos2.本地部署LibrePhotos3.LibrePhotos简单使用4. 安装内网穿透5.配置LibrePhotos公网地址6. 配置固定公网地址 前言 想象一下这样的场景&#xff1a;你有一大堆珍贵的回忆照片&#xff0c;但又不想使用各种网盘来管理。怎么办&#xff1f;别担心…

【开源免费】基于Vue和SpringBoot的医院资源管理系统(附论文)

本文项目编号 T 161 &#xff0c;文末自助获取源码 \color{red}{T161&#xff0c;文末自助获取源码} T161&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

被占用的电脑文件推沟里

在使用电脑的过程中&#xff0c;你是否遇到过这种情况&#xff1a;想删除、移动或重命名一个文件&#xff0c;结果系统无情地告诉你——“文件被占用&#xff0c;无法操作&#xff01;”这时候&#xff0c;IObit Unlocker 就该闪亮登场了&#xff01;这款免费的文件解锁工具&am…

Coze插件开发之基于已有服务创建并上架到扣子商店

Coze插件开发之基于已有服务创建并上架到扣子商店 在应用开发中&#xff0c;需要调用各种插件&#xff0c;以快速进行开发。但有时需要调用的插件在扣子商店里没有&#xff0c;那怎么办呢&#xff1f; 今天就来带大家快速基于已有服务创建一个新的插件 简单来讲&#xff0c;就是…

微信小程序-点餐(美食屋)02开发实践

目录 概要 整体架构流程 &#xff08;一&#xff09;用户注册与登录 &#xff08;二&#xff09;菜品浏览与点餐 &#xff08;三&#xff09;订单管理 &#xff08;四&#xff09;后台管理 部分代码展示 1.index.wxml 2.list.wxml 3.checkout.wxml 4.detail.wxml 小结优点 概要…

[Dialog屏幕开发] 屏幕绘制(下拉菜单)

阅读该篇文章之前&#xff0c;可先阅读下述资料 [Dialog屏幕开发] Table Control 列数据操作https://blog.csdn.net/Hudas/article/details/145343731?spm1001.2014.3001.5501上篇文章我们的屏幕已实现了如下功能 我们已经设置了按钮对Table Control 列的数据进行了操作 接下…

类与对象(下)

再谈构造函数 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值 class Date { public: Date(int year, int month, int day){_year year;_month month;_day day;} private: int _year; int _month; int _d…

【机器学习】深入探索SVM:支持向量机的原理与应用

目录 &#x1f354; SVM引入 1.1什么是SVM? 1.2支持向量机分类 1.3 线性可分、线性和非线性的区分 &#x1f354; 小结 学习目标 知道SVM的概念 &#x1f354; SVM引入 1.1什么是SVM? 看一个故事&#xff0c;故事是这样子的&#xff1a; 在很久以前的情人节&#xf…

Dev-C++分辨率低-解决办法

目录 【工具】Dev-C分辨率低-解决办法问题背景完整操作指南第一步&#xff1a;打开属性设置 【工具】Dev-C分辨率低-解决办法 问题背景 Dev-C因版本老旧&#xff08;长期未更新&#xff09;&#xff0c;在高分辨率显示器上存在界面模糊问题。通过修改Windows兼容性设置可优化…

[VSCode] vscode下载安装及安装中文插件详解(附下载链接)

VSCode 是一款由微软开发且跨平台的免费源代码编辑器&#xff1b;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和Git版本控制系统。 下载链接&#xff1a;https://pan.quark.cn/s/3a90aef4b645 提取码&#xff1a;NFy5 通过上面…

javascript-es6 (一)

作用域&#xff08;scope&#xff09; 规定了变量能够被访问的“范围”&#xff0c;离开了这个“范围”变量便不能被访问 局部作用域 函数作用域&#xff1a; 在函数内部声明的变量只能在函数内部被访问&#xff0c;外部无法直接访问 function getSum(){ //函数内部是函数作用…

c语言中的数组(上)

数组的概念 数组是⼀组相同类型元素的集合&#xff1b; 数组中存放的是1个或者多个数据&#xff0c;但是数组元素个数不能为0。 数组中存放的多个数据&#xff0c;类型是相同的。 数组分为⼀维数组和多维数组&#xff0c;多维数组⼀般⽐较多⻅的是⼆维数组。 数组创建 在C语言…

C#,入门教程(05)——Visual Studio 2022源程序(源代码)自动排版的功能动画图示

上一篇&#xff1a; C#&#xff0c;入门教程(04)——Visual Studio 2022 数据编程实例&#xff1a;随机数与组合https://blog.csdn.net/beijinghorn/article/details/123533838https://blog.csdn.net/beijinghorn/article/details/123533838 新来的徒弟们交上来的C#代码&#…

用Python和PyQt5打造一个股票涨幅统计工具

在当今的金融市场中&#xff0c;股票数据的实时获取和分析是投资者和金融从业者的核心需求之一。无论是个人投资者还是专业机构&#xff0c;都需要一个高效的工具来帮助他们快速获取股票数据并进行分析。本文将带你一步步用Python和PyQt5打造一个股票涨幅统计工具&#xff0c;不…

为什么IDEA提示不推荐@Autowired❓️如果使用@Resource呢❓️

前言 在使用 Spring 框架时&#xff0c;依赖注入&#xff08;DI&#xff09;是一个非常重要的概念。通过注解&#xff0c;我们可以方便地将类的实例注入到其他类中&#xff0c;提升开发效率。Autowired又是被大家最为熟知的方式&#xff0c;但很多开发者在使用 IntelliJ IDEA …