news 2026/10/23 12:18:16

BeagleY-AI 实战:Python 控制 GPIO 与本地 AI 推理入门

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
BeagleY-AI 实战:Python 控制 GPIO 与本地 AI 推理入门

1. 拿到 BeagleY-AI 之后,先搞清楚它到底适合做什么

BeagleY-AI 这块板子最近在嵌入式圈子里讨论度不低,但很多人拿到手之后第一反应是懵的——它长得像树莓派,跑的是 Linux,能跑 Python,还带了个 AI 加速器,那它到底跟树莓派有什么区别?我该拿它做什么项目?如果你脑子里是这些问题,那这篇内容就是写给你的。

先说结论:BeagleY-AI 的核心定位是带 AI 推理能力的单板计算机,它不是为了替代你的桌面电脑,也不是为了做那种超低功耗的传感器节点。它最适合的场景是:你需要在一个 Linux 环境里跑 Python 脚本,同时又要跟真实的硬件打交道(读传感器、控电机、点灯、跑摄像头),并且偶尔还需要跑一个轻量级的神经网络推理。比如做一个智能门禁的人脸识别终端、一个带目标检测的巡逻小车、或者一个本地的语音唤醒设备。

这块板子的关键参数我列一下,方便你对照自己的需求:

项目规格
处理器四核 ARM Cortex-A53
AI 加速器支持 INT8 推理,算力约 4 TOPS
内存4GB LPDDR4
存储microSD 卡启动
GPIO40 针排针,兼容常见 HAT 扩展板
视频输出micro-HDMI
网络千兆以太网、Wi-Fi、蓝牙
USBUSB 3.0 Type-A ×1、USB 2.0 Type-C ×1

从这张表你能看出来,它的 GPIO 排针布局跟树莓派是兼容的,这意味着市面上大量的传感器模块、继电器板、显示屏扩展板都可以直接插上去用。这一点非常重要,因为它直接决定了你学习硬件的成本——你不需要去买专用的转接板,淘宝上几块钱的杜邦线加传感器模块就能开始折腾。

但这里有个坑我得提前说:GPIO 的编号方式跟树莓派不一样。树莓派用的是 BCM 编号,BeagleY-AI 用的是 Linux 内核的 gpiochip 编号体系。你在网上搜到的树莓派 Python 代码,直接拿过来跑大概率会报错,因为引脚号对不上。这个后面我会专门讲怎么处理。

那什么人适合看这篇内容?如果你满足以下任意一条,就可以继续往下读:

  • 你有 Python 基础,想学怎么用 Python 控制硬件
  • 你玩过树莓派或 Arduino,想试试带 AI 加速的板子
  • 你想做一个结合了硬件控制和 AI 推理的小项目
  • 你需要在 Linux 环境下调试 GPIO,但不确定从哪下手

如果你完全没有编程基础,连 Python 都没装过,那建议先花两天把 Python 基础语法过一遍,不然接下来很多操作你会卡在环境配置上。

2. 系统烧录与首次启动:那些说明书不会告诉你的细节

2.1 镜像选择与烧录工具的实际取舍

BeagleY-AI 官方推荐使用 Debian 镜像,下载页面会提供多个版本。我建议你选带桌面环境的完整版,不要选 Lite 版。原因很简单:你刚开始折腾的时候,桌面环境能帮你快速确认板子是不是正常启动了,网络是不是通了,省去很多用串口调试的麻烦。等你熟悉了之后,再换 Lite 版做产品化部署也不迟。

烧录工具方面,Balena Etcher 是最省心的选择,图形界面,选镜像、选 SD 卡、点烧录,三步搞定。但这里有个细节:烧录完成后,Windows 会弹出好几个"是否格式化"的提示框,全部点取消。这是因为 Linux 镜像的分区格式 Windows 不认识,如果你手滑点了格式化,那就白烧了,得重来。

如果你用的是 Linux 或 macOS,也可以用dd命令烧录,效率更高:

# 先确认 SD 卡的设备名,千万别搞错 lsblk # 假设 SD 卡是 /dev/sdb,镜像文件是 beagley-ai-debian.img sudo dd if=beagley-ai-debian.img of=/dev/sdb bs=4M status=progress sync

注意:dd命令的of=参数一定要确认清楚,写错了盘会把你的硬盘数据全抹掉。我见过不止一个人把/dev/sda当成 SD 卡,结果系统盘被覆盖了。

2.2 首次上电:别急着插电源,先做这三件事

很多人拿到板子第一件事就是插电,然后盯着屏幕等它启动。但如果你提前做了下面三件事,能省掉至少半小时的排查时间。

第一,检查 SD 卡是否插紧。BeagleY-AI 的卡槽是推入式的,听到"咔"一声才算到位。我有一次没插紧,板子通电后电源灯亮了但 HDMI 没输出,排查了半天以为是镜像问题,结果就是卡没插好。

第二,确认电源适配器的电流足够。BeagleY-AI 推荐 5V/3A 的电源,如果你用一个 5V/1A 的手机充电器,板子可能在启动过程中因为供电不足而反复重启。表现就是电源灯一闪一闪的,HDMI 断断续续有信号。这个坑很隐蔽,因为很多人觉得"能亮灯就是通电了",但实际上电流不够的时候板子根本跑不起来。

第三,准备好网线。虽然它支持 Wi-Fi,但首次启动时 Wi-Fi 配置需要你先进系统才能设置。如果你没有 HDMI 显示器,最省事的方案就是插网线,然后从路由器的管理界面找到它的 IP 地址,直接用 SSH 连上去。

2.3 第一次登录与基础环境确认

系统启动后,默认用户名和密码通常在官方文档里有说明(一般是beagle/temppwd)。登录之后,先跑几个命令确认环境:

# 确认系统版本 cat /etc/os-release # 确认内核版本 uname -a # 确认 Python 版本 python3 --version # 确认 GPIO 芯片信息 gpiodetect

gpiodetect这个命令特别重要,它会列出系统里所有的 gpiochip 设备。BeagleY-AI 上通常会有多个 gpiochip,你需要记住哪个 chip 对应 40 针排针。一般来说,排针上的 GPIO 会集中在某个特定的 gpiochip 上,具体是哪个需要你根据输出判断。

如果gpiodetect提示找不到命令,说明gpiod工具包没装,用sudo apt install gpiod装一下就行。

3. GPIO 操作的核心逻辑:从 sysfs 到 libgpiod 的演进

3.1 为什么老教程里的 sysfs 方法不推荐用了

如果你在网上搜"Linux GPIO 操作",大概率会看到这样的代码:

echo 17 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio17/direction echo 1 > /sys/class/gpio/gpio17/value

这是经典的 sysfs 接口,在早期的树莓派和 BeagleBone 上大量使用。但从 Linux 内核 4.8 开始,GPIO 的 sysfs 接口就被标记为deprecated(已弃用),新内核虽然还保留着,但随时可能移除。而且 sysfs 方式有几个硬伤:没有权限管理、不能原子操作多个引脚、中断处理很别扭。

BeagleY-AI 跑的是比较新的内核,我强烈建议你直接学 libgpiod 这套新接口,不要再去抄那些老教程里的 sysfs 代码。libgpiod 提供了命令行工具和 C/Python 库,是当前 Linux 下操作 GPIO 的标准方式。

3.2 gpiod 命令行工具:不写代码也能点灯

在装好gpiod之后,你可以直接用命令行控制引脚。先看某个 gpiochip 上有哪些引脚:

# 查看第一个 gpiochip 的引脚信息 gpioinfo gpiochip0

输出会列出每一行的引脚编号、名称、方向、当前状态。找到你想用的那个引脚对应的 offset 号,然后就可以操作了:

# 设置 gpiochip0 的第 17 号引脚为输出,并输出高电平 gpioset gpiochip0 17=1 # 输出低电平 gpioset gpiochip0 17=0 # 读取引脚状态 gpioget gpiochip0 17

这里有个容易混淆的地方:gpiochip 的 offset 号不等于物理排针的针脚号。比如物理排针上的第 11 脚(GPIO17),在 gpiochip 里可能是 offset 17,也可能是别的数字,取决于板子的引脚映射。你需要查 BeagleY-AI 的引脚映射表来确认对应关系。

我建议你做一个简单的对照表贴在桌上:

物理针脚功能gpiochipoffset
11GPIOgpiochip0待确认
12GPIOgpiochip0待确认
13GPIOgpiochip0待确认

具体的映射关系,你可以通过gpioinfo的输出结合官方引脚图来确认。这一步花十分钟做好,后面能省你很多事。

3.3 Python 操作 GPIO:gpiod 库的安装与基本用法

命令行点灯只是验证,真正做项目还是要用 Python。libgpiod 提供了 Python 绑定,安装方式:

sudo apt install python3-libgpiod

装好之后,一个最简单的点灯脚本长这样:

import gpiod import time # 打开 gpiochip0 chip = gpiod.Chip('gpiochip0') # 获取第 17 号引脚 line = chip.get_line(17) # 请求引脚为输出模式,初始低电平 line.request(consumer='led_test', type=gpiod.LINE_REQ_DIR_OUT, default_vals=[0]) # 闪烁 5 次 for i in range(5): line.set_value(1) time.sleep(0.5) line.set_value(0) time.sleep(0.5) # 释放引脚 line.release()

这段代码里有个关键点:consumer参数。它相当于给这个引脚的使用者起个名字,当多个程序同时想操作同一个引脚时,系统会告诉你这个引脚被谁占用了。养成好习惯,每次请求引脚都写一个有意义的 consumer 名字,比如led_test、button_read,调试的时候能帮你快速定位问题。

注意:不同版本的 libgpiod Python 库 API 有差异。1.x 版本用的是chip.get_line(),2.x 版本改成了chip.request_lines()。如果你跑上面的代码报AttributeError,先用pip show libgpiod或apt list --installed | grep gpiod确认版本,然后对照官方文档调整 API 调用方式。

4. 硬件调试实战:从点灯到读传感器

4.1 LED 点灯:最基础但最容易翻车的实验

点灯是硬件界的 Hello World,但就是这么简单的实验,新手也能踩出一堆坑。我按顺序把常见问题列一下。

第一个坑:LED 没加限流电阻。直接把 LED 接在 GPIO 和 GND 之间,如果 GPIO 输出高电平是 3.3V,LED 正向压降约 2V,那剩下的 1.3V 全加在引脚的内阻上。虽然 BeagleY-AI 的 GPIO 引脚有一定保护,但长期这样用会缩短寿命。正确的做法是串一个 220Ω 到 1kΩ 的电阻。我一般用 330Ω,亮度够用,电流大概在 4mA 左右,很安全。

第二个坑:搞不清灌电流和拉电流。GPIO 输出高电平时,电流从引脚流向 LED 再到 GND,这叫拉电流(source current)。输出低电平时,电流从 VCC 经过 LED 流入引脚再到 GND,这叫灌电流(sink current)。大多数芯片的灌电流能力比拉电流强,所以如果你发现 LED 接高电平时很暗,可以试试改成低电平驱动,把 LED 的另一端接 3.3V。

第三个坑:引脚号搞错。前面说过,物理针脚号和 gpiochip offset 不是一回事。我的建议是先用万用表确认:把 GPIO 设为输出高电平,然后用万用表量物理针脚的电压,看是不是 3.3V。这样能百分百确认你操作的引脚和实际针脚的对应关系。

4.2 按键输入:上拉电阻与消抖处理

按键比 LED 稍微复杂一点,因为涉及到输入模式和电平判断。最基本的接法是:按键一端接 GPIO,另一端接 GND,同时 GPIO 需要启用内部上拉电阻。这样按键没按下时,引脚被上拉到高电平;按下时,引脚被拉到 GND,读到低电平。

import gpiod chip = gpiod.Chip('gpiochip0') line = chip.get_line(18) # 请求为输入模式,启用内部上拉 line.request(consumer='button_test', type=gpiod.LINE_REQ_DIR_IN, flags=gpiod.LINE_REQ_FLAG_BIAS_PULL_UP) while True: value = line.get_value() if value == 0: print("按键按下") break

但实际跑起来你会发现,按一次键可能打印好几行"按键按下"。这就是机械抖动——按键内部的金属触点在闭合瞬间会弹跳几次,导致电平快速变化。解决方法有两种:硬件上并在按键两端加一个 0.1uF 电容,软件上做延时确认。

软件消抖的简单实现:

import gpiod import time chip = gpiod.Chip('gpiochip0') line = chip.get_line(18) line.request(consumer='button_test', type=gpiod.LINE_REQ_DIR_IN, flags=gpiod.LINE_REQ_FLAG_BIAS_PULL_UP) last_state = 1 while True: current = line.get_value() if current == 0 and last_state == 1: time.sleep(0.02) # 等 20ms 再确认 if line.get_value() == 0: print("按键确认按下") last_state = current time.sleep(0.005)

20ms 是个经验值,大多数机械按键的抖动时间在 5ms 到 15ms 之间,20ms 足够覆盖。如果你觉得响应有点迟钝,可以降到 10ms 试试。

4.3 I2C 传感器读取:以温湿度传感器为例

GPIO 只能读高低电平,要读温湿度、气压、加速度这些模拟量,就得用 I2C 或 SPI 接口。BeagleY-AI 的 40 针排针上有 I2C 引脚,接一个常见的温湿度传感器(比如 SHT30 或 AHT20)就能读数据。

先确认 I2C 总线是否启用:

# 查看 I2C 设备 ls /dev/i2c-* # 扫描 I2C 总线上的设备 sudo apt install i2c-tools i2cdetect -y 1

i2cdetect会输出一个表格,显示总线上哪些地址有设备响应。比如 SHT30 的默认地址是 0x44,如果表格里 0x44 位置显示44,说明传感器被识别到了。

Python 读取 I2C 传感器一般用smbus2库:

pip install smbus2
from smbus2 import SMBus import time bus = SMBus(1) address = 0x44 # 发送测量命令(SHT30 的高重复性测量命令) bus.write_i2c_block_data(address, 0x2C, [0x06]) time.sleep(0.5) # 读取 6 个字节的数据 data = bus.read_i2c_block_data(address, 0x00, 6) # 转换温度值 temp_raw = (data[0] << 8) | data[1] temperature = -45 + 175 * (temp_raw / 65535.0) # 转换湿度值 humi_raw = (data[3] << 8) | data[4] humidity = 100 * (humi_raw / 65535.0) print(f"温度: {temperature:.2f} °C, 湿度: {humidity:.2f} %")

这里的关键是理解传感器的数据手册。不同传感器的命令字、数据格式、转换公式都不一样,你必须对着手册来写。我见过有人直接把别人的代码复制过来,结果传感器型号不对,读出来的数据完全离谱。

提示:I2C 总线上如果接了多个设备,每个设备的地址必须不同。有些传感器可以通过跳线或寄存器修改地址,接线前先确认清楚,避免地址冲突。

5. 当 Python 遇上 AI:在 BeagleY-AI 上跑推理的可行路径

5.1 先想清楚:你真的需要在这块板子上跑 AI 吗

BeagleY-AI 带了一个 4 TOPS 的 AI 加速器,听起来很厉害,但你要先问自己一个问题:我的项目真的需要本地推理吗?如果你的场景是"拍一张照片传到服务器识别",那用 ESP32 加 Wi-Fi 就够了,没必要上这块板子。但如果你需要实时处理(比如 30fps 的目标检测)、数据隐私(图像不出本地)、或者离线运行(没有网络的环境),那本地 AI 推理就是刚需。

我个人的经验是,BeagleY-AI 的 AI 加速器最适合跑这几类模型:

  • 轻量级图像分类(MobileNet、EfficientNet-Lite)
  • 目标检测(YOLOv5n、YOLOv8n 这类 nano 版本)
  • 关键词唤醒(Google Speech Commands 那类小模型)
  • 姿态估计(MoveNet 这类轻量模型)

如果你要跑大语言模型或者 Stable Diffusion,那还是算了,4 TOPS 的算力不够看,内存也吃紧。

5.2 模型转换与部署的基本流程

在 BeagleY-AI 上跑 AI 模型,一般流程是这样的:

  1. 在 PC 上训练或下载预训练模型(通常是 PyTorch 或 TensorFlow 格式)
  2. 把模型转换成 ONNX 格式
  3. 用厂商提供的工具链把 ONNX 转成板子能加速的格式
  4. 在板子上用对应的推理运行时加载模型

第三步是最容易卡住的环节,因为不同厂商的工具链差异很大。BeagleY-AI 的 AI 加速器通常需要把模型量化成 INT8 格式,这个过程中可能会遇到算子不支持、精度下降等问题。

一个实用的建议:先用 CPU 跑通整个流程,再切换到加速器。也就是说,你先用 ONNX Runtime 的 CPU 版本在板子上跑推理,确认输入输出都正确,然后再换成加速器版本。这样如果出问题,你能快速定位是模型转换的问题还是推理代码的问题。

import onnxruntime as ort import numpy as np # 加载 ONNX 模型(CPU 版本) session = ort.InferenceSession("model.onnx", providers=['CPUExecutionProvider']) # 准备输入数据 input_name = session.get_inputs()[0].name input_data = np.random.randn(1, 3, 224, 224).astype(np.float32) # 推理 outputs = session.run(None, {input_name: input_data}) print(outputs[0].shape)

这段代码在 PC 和 BeagleY-AI 上都能跑,区别只是速度。在 PC 上可能几毫秒就出结果,在板子上可能要几百毫秒。等你确认流程没问题了,再把providers换成加速器的 provider。

5.3 摄像头接入与实时推理的注意事项

做视觉 AI 项目,摄像头是绕不开的。BeagleY-AI 支持 USB 摄像头,插上之后用ls /dev/video*确认设备节点。Python 里用 OpenCV 读取:

import cv2 cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) while True: ret, frame = cap.read() if not ret: break # 在这里做推理 cv2.imshow('frame', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()

但如果你是在 SSH 里跑这段代码,cv2.imshow会报错,因为没有图形界面。解决办法是用cv2.imwrite把帧存成图片,或者用 Flask 搭一个简单的 MJPEG 流服务,在浏览器里看画面。

实时推理的性能优化有几个方向:降低输入分辨率(从 640×480 降到 320×240)、跳帧处理(每两帧处理一帧)、用多线程把图像采集和推理分开。我实测下来,在 BeagleY-AI 上跑 YOLOv5n,输入 320×240,大概能到 15-20fps,做简单的目标检测够用了。

6. 调试过程中最容易卡住的几个问题

6.1 权限问题:为什么我的 Python 脚本报 Permission denied

Linux 下操作 GPIO 和 I2C 需要权限。如果你用普通用户跑脚本,大概率会遇到Permission denied。最粗暴的解决方法是sudo,但每次都要输密码很烦,而且用 root 跑 Python 脚本有安全风险。

更好的做法是把用户加到对应的用户组:

# 把当前用户加到 gpio 和 i2c 组 sudo usermod -aG gpio,i2c $USER # 重新登录使组权限生效

如果系统里没有gpio组,你可以手动创建一个 udev 规则:

# 创建规则文件 sudo nano /etc/udev/rules.d/99-gpio.rules # 写入以下内容 SUBSYSTEM=="gpio", GROUP="gpio", MODE="0660" SUBSYSTEM=="i2c-dev", GROUP="i2c", MODE="0660"

保存后重启 udev 服务或直接重启板子。

6.2 引脚被占用:Device or resource busy 的排查思路

当你看到Device or resource busy这个错误时,说明你想操作的引脚已经被别的程序占用了。排查步骤:

# 查看所有被占用的 GPIO 引脚 sudo gpioinfo | grep -v "unused" # 或者用 lsof 查看哪个进程打开了 gpio 设备 sudo lsof /dev/gpiochip0

常见的原因是之前跑的脚本没有正常释放引脚就退出了。libgpiod 在程序正常退出时会自动释放,但如果程序崩溃或被kill -9强制杀死,引脚可能还处于占用状态。解决办法是找到占用进程并结束它,或者重启板子。

养成好习惯:在 Python 脚本里用try...finally确保引脚被释放:

import gpiod chip = gpiod.Chip('gpiochip0') line = chip.get_line(17) line.request(consumer='led_test', type=gpiod.LINE_REQ_DIR_OUT) try: # 你的操作代码 line.set_value(1) finally: line.release() chip.close()

6.3 系统日志:遇到硬件问题时先看这里

BeagleY-AI 跑的是 Linux,任何硬件相关的问题都会在系统日志里留下痕迹。遇到问题先看日志,比盲目搜索效率高得多:

# 查看内核日志(硬件相关) dmesg | tail -50 # 查看系统日志 journalctl -xe | tail -50 # 实时查看日志(调试时很有用) journalctl -f

比如你插了一个 USB 摄像头但/dev/video0没出现,dmesg里会有 USB 设备枚举的信息,能告诉你摄像头是被识别了但驱动没加载,还是根本没识别到。再比如 I2C 设备读不到数据,dmesg里可能会有 I2C 通信超时的报错。

我个人的习惯是:每次接新硬件之前,先开一个终端跑journalctl -f,然后插上硬件,观察日志输出。这样能第一时间看到系统对硬件的反应,比事后排查快得多。

7. 从这块板子出发,还能往哪些方向延伸

BeagleY-AI 的定位决定了它的项目方向比较明确:硬件交互 + 本地 AI。如果你已经跑通了点灯、读传感器、摄像头推理这几个基础实验,接下来可以尝试的方向有:

智能门禁终端:用摄像头做人脸检测,检测到人脸后触发继电器开门,同时把记录写到本地数据库。这个项目能把 GPIO 控制、摄像头读取、AI 推理、数据存储串起来,是一个很完整的练手项目。

垃圾分类助手:用摄像头拍垃圾,跑一个图像分类模型判断类别,然后用舵机把垃圾推到对应的桶里。这个项目涉及到舵机控制(PWM 信号),是 GPIO 的进阶用法。

语音唤醒灯控:用麦克风采集音频,跑一个关键词唤醒模型,检测到特定词就控制 LED 开关。这个项目的难点在音频采集和实时推理的配合。

环境监测站:接温湿度、气压、空气质量传感器,定时读取数据并上传到本地服务器,用网页展示历史曲线。这个项目偏数据采集,AI 成分少,但很适合练手 I2C 和数据库操作。

每个方向都可以从最简单的版本开始做,比如智能门禁先只做"检测到人脸就点亮 LED",跑通了再加继电器和数据库。硬件项目最忌讳一上来就搭一个大而全的框架,很容易卡在某个细节上失去信心。小步快跑,每完成一个功能就验证一次,这才是正确的节奏。

我在实际使用 BeagleY-AI 的过程中最大的体会是:它的价值不在于性能有多强,而在于它把 Linux、Python、GPIO 和 AI 加速器整合在了一块信用卡大小的板子上。你不需要在多个设备之间来回切换,一个 Python 脚本就能同时处理硬件控制和模型推理。这种整合度对于做原型验证来说非常友好,省去了很多胶水代码和通信协议的工作。当然,它也有局限性,比如 GPIO 的实时性不如单片机,AI 算力也有限,但作为学习和原型开发的平台,它已经足够好了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 14:00:15

SSM+Vue红色旅游网站毕设开发全流程:从环境搭建到答辩攻略

1. 先说结论&#xff1a;这个题目到底要做什么如果你正打算把“基于 SSM Vue 的漯河市红色旅游网站”作为 2026 届毕业设计&#xff0c;我先把话说透&#xff1a;这个题目不是让你去做一个新闻门户&#xff0c;也不是一个简单静态页面集合。它本质上是一个旅游信息管理系统 内…

作者头像 李华
网站建设 2026/10/21 14:00:19

FAT32数据恢复实战:用WinHex手动还原误删与格式化文件

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/21 14:00:19

晶圆盒FOUP ID识别实战:一体式读码设备的光学、算法与调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/21 14:00:17

飞凌嵌入式系统安装Java环境

文章目录1.安装JDK2.mysql注意事项3.redis注意事项4.nginx注意事项5.开机自启1.安装JDK 使用tar -zxvf解压不支持↓ 用zip来解压↓ which gzip gzip -d jdk-15.0.2_linux-aarch64_bin.tar.gz tar -xvf jdk-15.0.2_linux-aarch64_bin.tar2.mysql注意事项 mysql安装也一样&…

作者头像 李华
网站建设 2026/10/20 15:59:46

ponytail插件实战:用收束思维打造高效工作流

1. 从“ponytail”这个热词说起&#xff1a;它到底是什么第一次看到“ponytail”被当成一个技能、一个插件来讨论的时候&#xff0c;我其实愣了一下。马尾辫&#xff1f;这不是发型吗&#xff1f;但稍微在圈子里泡几天就明白了&#xff0c;现在大家嘴里的 ponytail&#xff0c;…

作者头像 李华