树莓派操作系统

2023-05-16

树莓派操作系统

  • 树莓派操作系统
    • 介绍
    • 更新和升级树莓派操作系统
      • 使用 APT
      • 使用 rpi 更新
    • 播放音频和视频
      • OMXPlayer 应用程序
      • 如何播放音频
      • 如何播放视频
      • 播放期间的选项
      • 在后台播放
    • 使用 USB 网络摄像头
      • 基本用法
      • 自动化图像捕获
      • 延时拍摄
    • 实用工具
      • tvservice
      • vcgencmd
      • vcdbg
    • Python
      • Thonny
      • 基本 Python 用法
      • Thonny 中的 Python 文件
      • 使用命令行
      • 其他使用 Python 的方法
      • 安装 Python 库
    • GPIO 和 40 针接头
      • 电压
      • 输出
      • 输入
      • 更多的
      • GPIO 引出线
      • 权限
      • Python中的GPIO

树莓派操作系统

介绍

Raspberry Pi OS 是基于 Debian 的免费操作系统,针对 Raspberry Pi 硬件进行了优化,是推荐在 Raspberry Pi 上正常使用的操作系统。 该操作系统带有超过 35,000 个软件包:预编译软件以一种很好的格式捆绑在一起,便于安装在您的 Raspberry Pi 上。

Raspberry Pi OS 正在积极开发中,重点是提高 Raspberry Pi 上尽可能多的 Debian 软件包的稳定性和性能。

更新和升级树莓派操作系统

让您的 Raspberry Pi 保持最新状态非常重要。 第一个也是最重要的原因是安全性。 运行 Raspberry Pi OS 的设备包含您依赖的数百万行代码。 随着时间的推移,这些数百万行代码将暴露众所周知的漏洞,这些漏洞记录在 公开可用的数据库 中,这意味着它们很容易被利用。 作为 Raspberry Pi OS 用户,缓解这些漏洞的唯一方法是让您的软件保持最新,因为上游存储库密切跟踪 CVE 并尝试快速缓解它们。

第二个原因,与第一个相关,是您在设备上运行的软件肯定包含错误。 一些错误是 CVE,但错误也可能会影响所需的功能,而与安全性无关。 通过使您的软件保持最新,您可以降低遇到这些错误的机会。

使用 APT

管理安装、升级和删除软件的最简单方法是使用 Debian 的 APT(高级打包工具)。 要更新 Raspberry Pi OS 中的软件,您可以 apt 从终端窗口使用该工具。

使您的操作系统保持最新

APT 将 Raspberry Pi 上的软件源列表保存在 /etc/apt/sources.list . 在安装软件之前,您应该使用 apt update . 继续并打开一个终端窗口并输入:

sudo apt update

接下来, 使用以下命令将所有已安装的软件包 升级到最新版本:

sudo apt full-upgrade

请注意, full-upgrade 它优先于 simple 使用 upgrade ,因为它还会获取可能已进行的任何依赖项更改。

一般来说,定期执行此操作将使您的安装与您正在使用的特定主要 Raspberry Pi OS 版本(例如 Buster)保持同步。 它不会从一个主要版本更新到另一个,例如,Stretch to Buster 或 Buster to Bullseye。

但是,在 Raspberry Pi OS 映像中偶尔会发生需要手动干预的更改,例如新引入的包。 这些不是通过升级安装的,因为此命令仅更新您已经安装的软件包。

笔记内核和固件作为 Debian 软件包安装,因此在使用上述过程时也会获得更新。 这些软件包很少更新,并且经过广泛的测试。

如果将现有 SD 卡移动到新的 Raspberry Pi 型号(例如 Raspberry Pi Zero 2 W),您可能还需要先使用上述说明更新内核和固件。

空间不足

运行时 sudo apt full-upgrade ,它会显示将下载多少数据以及将占用多少 SD 卡空间。 值得检查 df -h 您是否有足够的可用磁盘空间,因为不幸 apt 的是不会为您执行此操作。 另请注意,下载的包文件( .deb 文件)保存在 /var/cache/apt/archives . 您可以删除这些以释放空间 sudo apt clean ( sudo apt-get clean 在旧版本的 apt 中)。

从以前的操作系统版本升级

警告升级现有图像是可能的,但不能保证在所有情况下都能正常工作,我们不建议这样做。 如果您确实希望尝试升级您的操作系统版本,我们强烈建议您先进行备份——我们对因更新失败而丢失的数据不承担任何责任。

最新版本的 Raspberry Pi OS 是基于 Debian Bullseye 的。 以前的版本是基于 Buster 的。 如果您想执行从 Buster 到 Bullseye 的就地升级(并且您知道风险),请参阅 论坛中的说明 。

搜索软件

您可以使用以下命令在档案中搜索具有给定关键字的包 apt-cache search :

apt-cache search locomotive sl - Correct you if you type `sl' by mistake

您可以在安装之前查看有关软件包的更多信息 apt-cache show :

apt-cache show sl Package: sl Version: 3.03-17 Architecture: armhf Maintainer: Hiroyuki Yamamoto <yama1066@gmail.com> Installed-Size: 114 Depends: libc6 (>= 2.4), libncurses5 (>= 5.5-5~), libtinfo5 Homepage: http://www.tkl.iis.u-tokyo.ac.jp/~toyoda/index_e.html Priority: optional Section: games Filename: pool/main/s/sl/sl_3.03-17_armhf.deb Size: 26246 SHA256: 42dea9d7c618af8fe9f3c810b3d551102832bf217a5bcdba310f119f62117dfb SHA1: b08039acccecd721fc3e6faf264fe59e56118e74 MD5sum: 450b21cc998dc9026313f72b4bd9807b Description: Correct you if you type `sl' by mistake  Sl is a program that can display animations aimed to correct you  if you type 'sl' by mistake.  SL stands for Steam Locomotive.

使用 APT 安装软件包

sudo apt install tree

键入此命令应告知用户该软件包将占用多少磁盘空间并要求确认软件包安装。 输入 Y (或只按 Enter ,因为是默认操作)将允许安装发生。 这可以通过 -y 在命令中添加标志来绕过:

sudo apt install tree -y

安装此软件包 tree 可供用户使用。

使用 APT 卸载软件包

您可以使用以下命令卸载软件包 apt remove :

sudo apt remove tree

系统会提示用户确认删除。 同样, -y 标志将自动确认。

您还可以选择完全删除包及其关联的配置文件 apt purge :

sudo apt purge tree

使用 rpi-update

rpi-update 是一个命令行应用程序,它将您的 Raspberry Pi OS 内核和 VideoCore 固件更新到最新的预发布版本。

警告不保证软件的预发布版本可以正常工作。 rpi-update 除非 Raspberry Pi 工程师建议,否则 不应在任何系统上使用。 它可能会使您的系统不可靠甚至完全损坏。 它不应用作任何常规更新过程的一部分。

该 rpi-update 脚本最初由 Hexxeh 编写,但现在由 Raspberry Pi 工程师支持。 脚本源位于 rpi-update 存储库 中。

它能做什么

rpi-update 将下载最新的 linux 内核预发布版本、其匹配模块、设备树文件,以及最新版本的 VideoCore 固件。 然后它将这些文件安装到 SD 卡上的相关位置,覆盖任何以前的版本。

使用的所有源数据 rpi-update 都来自 rpi-firmware 存储库 。 此存储库仅包含来自 官方固件存储库 的数据子集,因为并非该存储库中的所有数据都是必需的。

跑步 rpi-update

如果您确定需要使用 rpi-update ,建议先备份当前系统,因为运行 rpi-update 可能会导致系统无法启动。

rpi-update 需要以root身份运行。 更新完成后,您将需要重新启动。

sudo reboot

它在 rpi-update 存储库 中记录了许多选项。

如何恢复安全

如果您已经完成 rpi-update 并且事情没有按您希望的那样工作,如果您的 Raspberry Pi 仍然可以启动,您可以使用以下命令返回到稳定版本:

sudo apt install --reinstall libraspberrypi0 libraspberrypi-{bin,dev,doc} raspberrypi-bootloader raspberrypi-kernel

您需要重新启动 Raspberry Pi 才能使这些更改生效。

播放音频和视频

警告

以下文档是指 Raspberry Pi OS Buster 及更早版本。 OMXPlayer 在最新的操作系统版本 中已被弃用 。 如果您正在运行 Bullseye,VLC 现在是推荐的替代方案。

在 Raspberry Pi 上播放音频和视频的最简单方法是使用已安装的 OMXPlayer 应用程序。

这是硬件加速的,可以播放许多流行的音频和视频文件格式。 OMXPlayer 使用 OpenMAX ( omx ) 硬件加速接口 (API),它是 Raspberry Pi 上官方支持的媒体 API。 OMXPlayer 由 Kodi Project 的 Edgar Hucek 开发。

OMXPlayer 应用程序

最简单的命令行是 omxplayer <name of media file> . 媒体文件可以是音频或视频或两者兼而有之。 对于下面的示例,我们使用了标准 Raspberry Pi OS 安装中包含的 H264 视频文件。

omxplayer /opt/vc/src/hello_pi/hello_video/test.h264

默认情况下,音频被发送到模拟端口。 如果您使用带扬声器的配备 HDMI 的显示设备,您需要告诉 omxplayer 通过 HDMI 链路发送音频信号。

omxplayer --adev hdmi /opt/vc/src/hello_pi/hello_video/test.h264

显示视频时,整个显示将用作输出。 您可以使用窗口选项指定您希望视频显示在显示器的哪个部分。

omxplayer --win 0,0,640,480 /opt/vc/src/hello_pi/hello_video/test.h264

您还可以指定要显示视频的哪一部分:这称为裁剪窗口。 这部分视频将被放大以匹配显示,除非您还使用窗口选项。

omxplayer --crop 100,100,300,300 /opt/vc/src/hello_pi/hello_video/test.h264

如果您使用的是 Raspberry Pi Touch Display ,并且想要将其用于视频输出,请使用 display 选项指定要使用的显示器。 n HDMI 为 5,触摸屏为 4。 使用 Raspberry Pi 4,您有两个 HDMI 输出选项。 n HDMI0 为 2,HDMI1 为 7。

omxplayer --display n /opt/vc/src/hello_pi/hello_video/test.h264

如何播放音频

要播放 MP3 文件,请使用以下命令导航到 .mp3 终端中文件的位置, cd 然后键入以下命令:

omxplayer example.mp3

这将 example.mp3 通过显示器的内置扬声器或通过耳机插孔连接的耳机播放音频文件。

如果您需要示例文件,可以使用以下命令从此处下载示例文件:

wget https://raw.githubusercontent.com/raspberrypilearning/burping-jelly-baby/master/data/la.mp3 -O example.mp3 --no-check-certificate

如果您听不到任何声音,请确保您的耳机或扬声器连接正确。 请注意,omxplayer 不使用 ALSA,因此会忽略 or 设置的 音频配置 。 raspi-config amixer

如果 omxplayer 无法自动检测到正确的音频输出设备,您可以使用以下命令强制通过 HDMI 输出:

omxplayer -o hdmi example.mp3

或者,您可以通过耳机插孔强制输出:

omxplayer -o local example.mp3

您甚至可以通过耳机插孔和 HDMI 强制输出:

omxplayer -o both example.mp3

如何播放视频

要播放视频,请使用 导航到终端中视频文件的位置 cd ,然后键入以下命令:

omxplayer example.mp4

这将 example.mp4 全屏播放。 点击 Ctrl + C 退出。

在 Raspberry Pi 4 上,已删除对 MPEG2 和 VC-1 编解码器的硬件支持,因此我们建议使用 VLC 应用程序,它在软件中支持这些格式。 此外,VLC 对 H264 和新的 HEVC 编解码器具有硬件支持。

示例视频

您的 Raspberry Pi 上提供了动画电影 Big Buck Bunny 的视频样本。 要播放它,在终端窗口中输入以下命令:

omxplayer /opt/vc/src/hello_pi/hello_video/test.h264

在 Raspberry Pi 4 上,对 H264 文件使用以下命令:

omxplayer /opt/vc/src/hello_pi/hello_video/test.h264

或用于 H264、VC1 或 MPEG2

vlc /opt/vc/src/hello_pi/hello_video/test.h264

使用 VLC 时,您可以通过封装原始 H264 流(例如来自 Raspberry Pi 摄像头模块)来提高播放性能。 这很容易使用 ffmpeg . 如果 VLC 全屏运行,播放也会得到改善; 从用户界面选择全屏,或者您可以将 --fullscreen 选项添加到 vlc 命令行。

此示例命令转换为 30 fps video.h264 的容器化: video.mp4

ffmpeg -r 30 -i video.h264 -c:v copy video.mp4

播放期间的选项

播放期间有许多选项可用,通过按相应的键来操作。 并非所有选项都适用于所有文件。 可以使用以下方式显示键绑定列表 omxplayer --keys :

2 提高速度 < 倒带 > 快进 z 显示信息 j 上一个音频流 k 下一个音频流 我上一章 o 下一章 n 前一个字幕流 m 下一个字幕流 s 切换字幕 w 显示字幕 x 隐藏字幕 d 减少字幕延迟(- 250 毫秒) f 增加字幕延迟 (+ 250 ms) q 退出 omxplayer p /空格暂停/恢复 - 减少音量 + / = 增加音量 左箭头搜索 -30 秒 右箭头搜索 +30 秒 向下箭头搜索 -600 秒 向上箭头搜索 +600 秒

在后台播放

omxplayer 如果在没有 tty(用户输入)的情况下在后台运行,将立即关闭,因此要成功运行,您需要使用该 选项告诉 omxplayer 不需要任何用户输入。 --no-keys

omxplayer --no-keys example.mp3 &

& 在命令末尾 添加 会在后台运行作业。 jobs 然后,您可以使用该命令 检查此后台作业的状态。 默认情况下,该作业将在播放完毕后完成,但如有必要,您可以使用该 命令 omxplayer 随时停止它。 kill

$ jobs [1]-  Running			 omxplayer --no-keys example.mp3 & $ kill %1 $ [1]-  Terminated		  omxplayer --no-keys example.mp3 &

使用 USB 网络摄像头

您可以使用标准 USB 网络摄像头在您的 Raspberry Pi 上拍摄照片和视频, 而不是使用 Raspberry Pi 摄像头模块。

笔记摄像头模块的质量和可配置性大大优于标准 USB 网络摄像头。

首先,安装 fswebcam 软件包:

sudo apt install fswebcam

如果您没有使用默认 pi 用户帐户,则需要将您的用户名添加到 video 组中,否则您将看到“权限被拒绝”错误。

sudo usermod -a -G video <username>

要检查用户是否已正确添加到组中,请使用该 groups 命令。

基本用法

输入命令 fswebcam 后跟文件名,将使用网络摄像头拍摄照片,并保存到指定的文件名:

fswebcam image.jpg

此命令将显示以下信息:

正在尝试源模块 v4l2... /dev/video0 打开。 没有指定输入,使用第一个。 将分辨率从 384x288 调整为 352x288。 --- 捕获帧... 损坏的 JPEG 数据:标记 0xd4 之前的 2 个无关字节 在 0.00 秒内捕获的帧。 --- 处理捕获的图像... 将 JPEG 图像写入“image.jpg”。

笔记使用的小默认分辨率,以及显示时间戳的横幅的存在。

本例中使用的网络摄像头的分辨率为 1280 x 720 so 来指定我想要拍摄图像的分辨率,使用以下 -r 标志:

fswebcam -r 1280x720 image2.jpg

此命令将显示以下信息:

正在尝试源模块 v4l2... /dev/video0 打开。 没有指定输入,使用第一个。 --- 捕获帧... 损坏的 JPEG 数据:标记 0xd5 之前的 1 个无关字节 在 0.00 秒内捕获的帧。 --- 处理捕获的图像... 将 JPEG 图像写入“image2.jpg”。

现在以网络摄像头的全分辨率拍摄照片,并带有横幅。

移除横幅

现在添加 --no-banner 标志:

fswebcam -r 1280x720 --no-banner image3.jpg

其中显示以下信息:

正在尝试源模块 v4l2... /dev/video0 打开。 没有指定输入,使用第一个。 --- 捕获帧... 损坏的 JPEG 数据:标记 0xd6 之前的 2 个无关字节 在 0.00 秒内捕获的帧。 --- 处理捕获的图像... 禁用横幅。 将 JPEG 图像写入“image3.jpg”。

现在这张照片是以全分辨率拍摄的,没有横幅。

自动化图像捕获

您可以编写一个使用网络摄像头拍照的 Bash 脚本。 下面的脚本将图像保存在 /home/pi/webcam 目录中,因此首先创建 webcam 子目录:

mkdir webcam

要创建脚本,请打开您选择的编辑器并编写以下示例代码:

#!/bin/bash DATE=$(date +"%Y-%m-%d_%H%M") fswebcam -r 1280x720 --no-banner /home/pi/webcam/$DATE.jpg

该脚本将拍照并使用时间戳命名文件。 假设我们将其保存为 webcam.sh ,我们将首先使文件可执行:

chmod +x webcam.sh

然后运行:

./webcam.sh

它将运行文件中的命令并给出通常的输出:

正在尝试源模块 v4l2... /dev/video0 打开。 没有指定输入,使用第一个。 --- 捕获帧... 损坏的 JPEG 数据:标记 0xd6 之前的 2 个无关字节 在 0.00 秒内捕获的帧。 --- 处理捕获的图像... 禁用横幅。 将 JPEG 图像写入“/home/pi/webcam/2013-06-07_2338.jpg”。

延时拍摄

您可以使用 cron 来安排在给定的时间间隔拍照,例如每分钟捕捉延时。

首先打开cron表进行编辑:

crontab -e

这将询问您要使用哪个编辑器,或者在您的默认编辑器中打开。 在编辑器中打开文件后,添加以下行以安排每分钟拍照一次(参考上面的 Bash 脚本):

* * * * * /home/pi/webcam.sh 2>&1

保存并退出,您应该会看到以下消息:

crontab: installing new crontab

确保您的脚本不会保存使用相同文件名拍摄的每张照片。 这将每次覆盖图片。

实用工具

有几个有用的命令行

电视服务

tvservice 是一个命令行应用程序,用于获取和设置有关显示器的信息,主要针对 HDMI 视频和音频。

单独键入 tvservice 将显示可用命令行选项的列表。

-p,--首选

使用首选设置打开 HDMI 输出。

-o,--关闭

关闭显示输出。

笔记使用此命令关闭输出也会破坏与显示相关的任何帧缓冲区/dispmanx 层。 这些不会在随后的电源上重新建立,因此会导致空白屏幕。

更好的选择是使用 vcgencmd display_power 选项,因为这将保留任何帧缓冲区,因此当重新打开电源时,显示器将返回到之前的开机状态。

-e, --explicit="组模式驱动器"

使用指定的设置打开 HDMI

组可以是 CEA , DMT , CEA_3D_SBS , CEA_3D_TB , CEA_3D_FP ,之一 CEA_3D_FS 。
模式是从 -m, --modes 选项返回的模式之一。
驱动器可以是 HDMI ,之一 DVI 。

-t,--ntsc

HDMI 模式使用 59.94Hz(NTSC 频率)而不是 60Hz。

-c, --sdtvon="模式方面[P]"

PAL 使用指定的模式或 NTSC ,以及指定的纵横比, 4:3 , 14:9 , 开启标清电视(复合输出) 16:9 。 可选 P 参数可用于指定渐进模式。

-m, --modes=组

其中 Group 是 CEA 或 DMT 。

显示指定组中可用的显示模式列表。

-M,--监控

监控任何 HDMI 事件,例如拔出或连接。

-s,--状态

显示显示模式的当前设置,包括模式、分辨率和频率。

-a,--音频

显示音频模式的当前设置,包括通道、采样率和采样大小。

-d, --dumpid=文件名

将当前的 EDID 保存到指定的文件名。 然后,您可以使用 edidparser <filename> 以人类可读的形式显示数据。

-j,--json

与选项结合使用时 --modes ,以 JSON 格式显示模式信息。

-n,--名称

从 EDID 数据中提取显示名称并显示它。

-l,--列表

列出所有连接的显示器及其显示器 ID。

-v,--设备=显示

指定要使用的设备的 ID; --list 查看可用 ID 的输出。

vcgencmd

该 vcgencmd 您可以在 Github 上 找到该 vcgencmd 实用程序的源代码 。

要获取所有 vcgencmd 支持的命令的列表,请使用 vcgencmd commands . 下面列出了一些有用的命令及其所需的参数。

VCOS

该 vcos 命令有两个有用的子命令:

version 在 VideoCore 上显示固件的构建日期和版本

log status 显示各种 VideoCore 固件区域的错误日志状态

版本

显示 VideoCore 固件的构建日期和版本。

获取相机

显示树莓派摄像头的启用和检测状态: 1 表示是, 0 表示否。 虽然除精简版本外的所有固件都支持相机,但需要使用 raspi-config 启用此支持。

get_throttle

返回系统的节流状态。 这是一个位模式 - 设置的位表示以下含义:

少量十六进制值意义

0

0x1

检测到欠压

1

0x2

手臂频率上限

2

0x4

目前受到限制

3

0x8

软温度限制激活

16

0x10000

发生欠压

17

0x20000

已发生 Arm 频率上限

18

0x40000

发生了节流

19

0x80000

出现软温度限制

测量温度

返回由其内部温度传感器测量的 SoC 温度; 在 Raspberry Pi 4 上, measure_temp pmic 返回 PMIC 的温度。

measure_clock [时钟]

这将返回指定时钟的当前频率。 选项包括:

描述

手臂

ARM 内核

GPU核心

H264

H.264 块

网络服务商

图像传感器管道

v3d

3D块

UART

UART

脉宽调制

PWM 模块(模拟音频输出)

emmc

SD卡接口

像素

像素阀

一个东西

模拟视频编码器

hdmi

HDMI

dpi

显示并行接口

例如 vcgencmd measure_clock arm

measure_volts [块]

显示特定模块使用的当前电压。

堵塞描述

VC4核心电压

sdram_c

SDRAM核心电压

sdram_i

SDRAM I/O 电压

sdram_p

SDRAM物理电压

otp_dump

显示 SoC 内的 OTP(一次性可编程)内存的内容。 这些是 32 位值,索引从 8 到 64。有关更多详细信息,请参阅 OTP 位页面 。

get_config [配置项|int|str]

显示指定配置设置的值:或者,指定 int (整数)或 str (字符串)以查看给定类型的所有配置项。 例如:

vcgencmd get_config total_mem

返回设备上的总内存(以 MB 为单位)。

get_mem 类型

报告 ARM 和 GPU 可寻址的内存量。 显示 ARM 可寻址内存的使用量 vcgencmd get_mem arm ; 显示 GPU 可寻址内存使用量 vcgencmd get_mem gpu 。 请注意,在内存超过 1GB 的设备上,该 arm 参数将始终返回 1GB 减去 gpu 内存值,因为 GPU 固件只知道前 1GB 内存。 要获得设备上总内存的准确报告,请参阅 total_mem 配置项 - 请参阅 get_config 上面的部分。

codec_enabled [类型]

报告是否启用了指定的 CODEC 类型。 可能的类型选项有 AGIF、FLAC、H263、H264、MJPA、MJPB、MJPG、 MPG2 、MPG4、MVC0、PCM、THRA、VORB、VP6、VP8、 WMV9 、 WVC1 。 当前突出显示的那些需要付费许可证(有关更多信息,请参阅 此 config.txt 部分 ),但在 Raspberry Pi 4 和 400 上除外,其中这些硬件编解码器优先于软件解码被禁用,这不需要许可证。 请注意,由于 Raspberry Pi 4 和 400 上的 H.265 HW 块不是 VideoCore GPU 的一部分,因此无法通过此命令访问其状态。

获取液晶信息

显示任何连接的显示器的分辨率和颜色深度。

mem_oom

显示在 VideoCore 内存空间中发生的任何 OOM(内存不足)事件的统计信息。

mem_reloc_stats

显示来自 VideoCore 上可重定位内存分配器的统计信息。

read_ring_osc

返回环形振荡器的当前速度电压和温度。

hdmi_timings

显示当前 HDMI 设置时序。 有关返回值的详细信息,请参阅 视频配置 。

dispmanx_list

转储当前显示的所有 dispmanx 项目的列表。

显示电源 [0 | 1 | -1] [显示]

显示当前显示器电源状态,或设置显示器电源状态。 vcgencmd display_power 0 将关闭当前显示器的电源。 vcgencmd display_power 1 将打开显示器的电源。 如果没有设置参数,这将显示当前的电源状态。 最后一个参数是可选的显示器 ID,由下表返回 tvservice -l 或从下表返回,它允许打开或关闭特定显示器。

请注意,对于 7" Raspberry Pi 触摸显示器,这只是打开和关闭背光。触摸功能继续正常运行。

vcgencmd display_power 0 7 将关闭电源以显示 ID 7,即 Raspberry Pi 4 上的 HDMI 1。

展示ID

主液晶

0

二次液晶

1

HDMI 0

2

合成的

3

HDMI 1

7

要确定特定显示 ID 是打开还是关闭,请使用 -1 作为第一个参数。

vcgencmd display_power -1 7 如果显示器 ID 7 关闭,则返回 0,如果显示器 ID 7 开启,则返回 1,如果显示器 ID 7 处于未知状态(例如未检测到),则返回 -1。

vcdbg

vcdbg 是一个帮助在 ARM 上运行的 Linux 调试 VideoCore GPU 的应用程序。 它需要以root身份运行。 此应用程序主要用于 Raspberry Pi 工程师,尽管有一些命令对普通用户可能有用。

sudo vcdbg help 将给出可用命令的列表。

笔记仅列出了最终用户的使用选项。

版本

显示来自 VideoCore 的各种版本信息。

日志

从指定子系统转储日志。 可能的选项是:

日志描述

味精

打印出消息日志

断言

打印断言日志

前任

打印异常日志

信息

从日志头打印出信息

等级

设置指定类别的 VCOS 日志记录级别,n|e|w|i|t

列表

列出 VCOS 日志记录级别

例如要打印出消息日志的当前内容:

vcdbg log msg

malloc

列出 VideoCore 堆中当前的所有内存分配。

游泳池

列出池分配器的当前状态

可重定位

没有任何其他参数,列出可重定位分配器的当前状态。 也用于 sudo vcdbg reloc small 列出小分配。

使用子命令 sudo vcdbg reloc stats 列出可重定位分配器的统计信息。

历史

与任务历史相关的命令。

用于 sudo vcdbg hist gnuplot 将 gnuplot 格式的任务历史转储到 task.gpt 和 task.dat

Python

Python 是一种功能强大的编程语言,易于使用、易于阅读和编写,并且与 Raspberry Pi 一起,您可以将项目连接到现实世界。 Python 语法简洁,强调可读性,并使用标准的英文关键字。

Thonny

最简单的 Python 介绍是通过Python 3 开发环境 Thonny 。 您可以从桌面或应用程序菜单打开 Thonny。

Thonny 为您提供了一个 REPL(Read-Evaluate-Print-Loop),这是您可以输入 Python 命令的提示。 因为它是一个 REPL,所以您甚至可以在不使用 print . 在 Thonny 应用程序中,这称为 Shell 窗口。

如果需要,您可以使用变量,但您甚至可以像计算器一样使用它。 例如:

>>> 1 + 2 3 >>> name = "Sarah" >>> "Hello " + name 'Hello Sarah'

Thonny 还内置了语法高亮和一些对自动完成的支持。 Alt + P 您可以使用(上一个)和 Alt + N (下一个) 回顾您在 REPL 中输入的命令的历史记录。

基本 Python 用法

Python中的你好世界:

print("Hello world")

就那么简单!

缩进

一些语言使用花括号 { 来 } 包裹属于一起的代码行,并留给编写者缩进这些行以在视觉上嵌套。 但是,Python 不使用花括号,而是需要缩进以进行嵌套。 例如 for Python 中的循环:

for i in range(10): 	print("Hello")

这里需要缩进。 缩进的第二行将是循环的一部分,而未缩进的第二行将在循环之外。 例如:

for i in range(2): 	print("A") 	print("B")

会打印:

A B A B

而以下:

for i in range(2): 	print("A") print("B")

会打印:

A A B

变量

要将值保存到变量,请像这样分配它:

name = "Bob" age = 15

请注意,这些变量没有指定数据类型,因为类型是推断出来的,以后可以更改。

age = 15 age += 1  # increment age by 1 print(age)

这次我在增量命令旁边使用了注释。

评论

注释在程序中被忽略,但您可以在那里留下注释,并用井号 # 表示。 多行注释使用三引号,如下所示:

""" This is a very simple Python program that prints "Hello". That's all it does. """ print("Hello")

列表

Python 也有列表(在某些语言中称为数组),它们是任何类型的数据的集合:

numbers = [1, 2, 3]

列表用方括号表示 [] ,每个项目用逗号分隔。

迭代

某些数据类型是可迭代的,这意味着您可以遍历它们包含的值。 例如一个列表:

numbers = [1, 2, 3] for number in numbers: 	print(number)

这将获取列表中的每个项目 numbers 并打印出该项目:

2 3

注意我用这个词 number 来表示每个项目。 这只是我为此选择的词 - 建议您为变量选择描述性词 - 使用复数表示列表,单数表示每个项目是有意义的。 它使阅读时更容易理解。

其他数据类型是可迭代的,例如字符串:

dog_name = "BINGO" for char in dog_name: 	print(char)

这会遍历每个字符并将它们打印出来:

B I N G O

范围

整数数据类型不可迭代,尝试迭代它会产生错误。 例如:

for i in 3: 	print(i)

将产生:

TypeError: 'int' object is not iterable

但是,您可以使用以下 range 函数创建可迭代对象:

for i in range(3): 	print(i)

range(5) 包含数字 0 、 1 、 2 和 3 ( 4 总共五个数字)。 要获得 (包括)数字 1 ,请使用 . 5 range(1, 6)

长度

您可以使用诸如 len 查找字符串或列表的长度之类的函数:

name = "Jamie" print(len(name))  # 5 names = ["Bob", "Jane", "James", "Alice"] print(len(names))  # 4

如果语句

您可以将 if 语句用于控制流:

name = "Joe" if len(name) > 3: 	print("Nice name,") 	print(name) else: 	print("That's a short name,") 	print(name)

Thonny 中的 Python 文件

要在 Thonny 中创建 Python 文件,请单击 File > New ,您将获得一个 窗户。 这是一个空文件,而不是 Python 提示符。 您在此窗口中编写一个 Python 文件,保存它,然后运行它,您将在另一个窗口中看到输出。

例如,在新窗口中,键入:

n = 0 for i in range(1, 101): 	n += i print("The sum of the numbers 1 to 100 is:") print(n)

然后保存此文件( File > Save 或 Ctrl + S )并运行( Run > Run Module 或点击 F5 ),您将在原始 Python 窗口中看到输出。

使用命令行

您可以在标准编辑器 中编写 Python 文件 ,然后从命令行将其作为 Python 脚本运行。 只需导航到保存文件的目录(使用 cd 和 ls 指导)并运行 python3 ,例如 python3 hello.py .

其他使用 Python 的方法

python3 通过在终端中 键入来访问标准的内置 Python shell 。

这个 shell 是一个准备好输入 Python 命令的提示符。 您可以像 Thonny 一样使用它,但它没有语法高亮或自动完成功能。 您可以使用键回顾您在 REPL 中输入的命令的历史记录 Up/Down 。 用于 Ctrl + D 退出。

IPython

IPython 是一个交互式 Python shell,具有语法高亮、自动完成、漂亮的打印、内置文档等功能。 默认情况下不安装 IPython。 安装:

sudo pip3 install ipython

然后从命令行运行 ipython 。 它的工作方式与标准类似 python3 ,但具有更多功能。 尝试打字 len? 和点击 Enter 。 您会看到包括该 len 函数的文档字符串在内的信息:

Type:	   builtin_function_or_method String Form:<built-in function len> Namespace:  Python builtin Docstring: len(object) -> integer Return the number of items of a sequence or mapping.

尝试以下字典理解:

{i: i ** 3 for i in range(12)}

这将打印以下内容:

{0: 0,  1: 1,  2: 8,  3: 27,  4: 64,  5: 125,  6: 216,  7: 343,  8: 512,  9: 729,  10: 1000,  11: 1331}

在标准的 Python shell 中,这会打印在一行上:

{0: 0, 1: 1, 2: 8, 3: 27, 4: 64, 5: 125, 6: 216, 7: 343, 8: 512, 9: 729, 10: 1000, 11: 1331}

Up/Down 您可以使用 in 之类的键 来回顾您在 REPL 中输入的命令的历史记录 python 。 历史记录也会持续到下一个会话,因此您可以退出 ipython 并返回(或在 v2/3 之间切换)并且历史记录仍然存在。 用于 Ctrl + D 退出。

安装 Python 库

apt

一些 Python 包可以在 Raspberry Pi OS 档案中找到,并且可以使用 apt 安装,例如:

sudo apt update sudo apt install python-picamera

这是一种更可取的安装方法,因为这意味着您安装的模块可以使用常用的 sudo apt update 和 sudo apt full-upgrade 命令轻松保持最新状态。

pip

并非所有 Python 包都可在 Raspberry Pi OS 存档中使用,而且这些包有时可能已过时。 如果在 Raspberry Pi OS 存档中找不到合适的版本,可以从 Python 包索引 (称为 PyPI)安装包。

为此,请安装 pip:

sudo apt install python3-pip

然后使用以下命令安装 Python 包(例如 simplejson ) pip3 :

sudo pip3 install simplejson

piwheels

官方 Python 包索引 (PyPI) 托管包维护者上传的文件。 某些软件包需要编译(编译 C/C++ 或类似代码)才能安装它们,这可能是一项耗时的任务,尤其是在单核 Raspberry Pi 1 或 Raspberry Pi Zero 上。

piwheels 是一项服务,提供可在 Raspberry Pi 上使用的 预编译包(称为 Python wheels)。 Raspberry Pi OS 已预先配置为使用 piwheels 进行 pip。 在www.piwheels.org 上阅读有关 piwheels 项目的更多信息 。

GPIO 和 40 针接头

Raspberry Pi 的一个强大功能是电路板顶部边缘的一排 GPIO(通用输入/输出)引脚。 当前所有 Raspberry Pi 板上都有一个 40 针 GPIO 接头(在 Raspberry Pi Zero、Raspberry Pi Zero W 和 Raspberry Pi Zero 2 W 上未安装)。 在 Raspberry Pi 1 Model B+(2014 年)之前,电路板包含一个较短的 26 针接头。

任何 GPIO 引脚都可以(在软件中)指定为输入或输出引脚,并用于广泛的用途。

黄色:GPIO,黑色:负级,橙色3.3v电源,红色5v电源,白色:仅限高级使用
GPIO表:

BCMwPiNameModelVPhysicalVModeNamewPiBCM

3.3v

1

2

5v

2

8

SDA.1

IN

1

3

4

5v

3

9

SCL.1

IN

1

5

6

0v

4

7

GPIO. 7

IN

1

7

8

1

ALT0

TxD

15

14

0v

9

10

1

ALT0

RxD

16

15

17

0

GPIO. 0

IN

0

11

12

0

IN

GPIO. 1

1

18

27

2

GPIO. 2

IN

0

13

14

0v

22

3

GPIO. 3

IN

0

15

16

0

IN

GPIO. 4

4

23

3.3v

17

18

0

IN

GPIO. 5

5

24

10

12

MOSI

IN

0

19

20

0v

9

13

MISO

IN

0

21

22

0

IN

GPIO. 6

6

25

11

14

SCLK

IN

0

23

24

1

IN

CE0

10

8

0v

25

26

1

IN

CE1

11

7

0

30

SDA.0

IN

1

27

28

1

IN

SCL.0

31

1

5

21

GPIO.21

IN

1

29

30

0v

6

22

GPIO.22

IN

1

31

32

0

IN

GPIO.26

26

12

13

23

GPIO.23

IN

0

33

34

0v

19

24

GPIO.24

IN

0

35

36

0

IN

GPIO.27

27

16

26

25

GPIO.25

IN

0

37

38

0

IN

GPIO.28

28

20

0v

39

40

0

IN

GPIO.29

29

21

笔记GPIO管脚的编号不是按数字顺序排列的; 板上有 GPIO 引脚 0 和 1(物理引脚 27 和 28),但保留用于高级用途(见下文)。

电压

板上有两个 5V 引脚和两个 3.3V 引脚,以及一些不可配置的接地引脚 (0V)。 其余引脚均为通用 3.3V 引脚,这意味着输出设置为 3.3V,输入可耐受 3.3V。

输出

指定为输出引脚的 GPIO 引脚可以设置为高电平 (3.3V) 或低电平 (0V)。

输入

指定为输入引脚的 GPIO 引脚可以读取为高电平 (3.3V) 或低电平 (0V)。 这通过使用内部上拉或下拉电阻器变得更容易。 引脚 GPIO2 和 GPIO3 具有固定的上拉电阻,但对于其他引脚,可以在软件中进行配置。

更多的

除了简单的输入和输出设备外,GPIO 引脚还可以与多种替代功能一起使用,有些在所有引脚上可用,有些在特定引脚上可用。

PWM(脉宽调制)

软件 PWM 在所有引脚上可用

GPIO12、GPIO13、GPIO18、GPIO19 上提供硬件 PWM

SPI

SPI0: MOSI (GPIO10); MISO (GPIO9); SCLK (GPIO11); CE0 (GPIO8), CE1 (GPIO7)

SPI1: MOSI (GPIO20); MISO (GPIO19); SCLK (GPIO21); CE0 (GPIO18); CE1 (GPIO17); CE2 (GPIO16)

I2C

数据:(GPIO2); 时钟 (GPIO3)

EEPROM数据:(GPIO0); EEPROM 时钟 (GPIO1)

串行

TX(GPIO14); 接收(GPIO15)

GPIO 引出线

通过打开终端窗口并运行命令,可以在 Raspberry Pi 上访问方便的参考 pinout 。 该工具由 GPIO Zero Python 库提供,该库默认安装在 Raspberry Pi OS 桌面映像上,但不安装在 Raspberry Pi OS Lite 上。

有关 GPIO 引脚的高级功能的更多详细信息,请参阅 gadgetoid 的 交互式引脚图

警告虽然将简单的组件连接到 GPIO 引脚是非常安全的,但重要的是要小心接线方式。 LED 应该有电阻器来限制通过它们的电流。 不要将 5V 用于 3.3V 组件。 不要将电机直接连接到 GPIO 引脚,而是使用 H 桥电路或电机控制器板 。

权限

为了使用 GPIO 端口,您的用户必须是该 gpio 组的成员。 该 pi 用户默认为会员,其他用户需手动添加。

sudo usermod -a -G gpio <username>

Python中的GPIO

使用 GPIO Zero 库可以轻松开始使用 Python 控制 GPIO 设备。 该库在 gpiozero.readthedocs.io 上进行了全面记录。

引领

要控制连接到 GPIO17 的 LED,您可以使用以下代码:

from gpiozero import LED from time import sleep led = LED(17) while True: 	led.on() 	sleep(1) 	led.off() 	sleep(1)

在像 Thonny 这样的 IDE 中运行它,LED 会反复闪烁。

LED 方法包括 on() 、 off() 、 toggle() 和 blink() 。

按钮

要读取连接到 GPIO2 的按钮的状态,可以使用以下代码:

from gpiozero import Button from time import sleep button = Button(2) while True: 	if button.is_pressed: 		print("Pressed") 	else: 		print("Released") 	sleep(1)

按钮功能包括属性 is_pressed 和 is_held ; 回调 when_pressed , when_released , 和 when_held ; 和方法 wait_for_press() 和 wait_for_release 。

按钮 + LED

要将 LED 和按钮连接在一起,您可以使用以下代码:

from gpiozero import LED, Button led = LED(17) button = Button(2) while True: 	if button.is_pressed: 		led.on() 	else: 		led.off()

或者:

from gpiozero import LED, Button led = LED(17) button = Button(2) while True: 	button.wait_for_press() 	led.on() 	button.wait_for_release() 	led.off()

或者:

from gpiozero import LED, Button led = LED(17) button = Button(2) button.when_pressed = led.on button.when_released = led.off​​​​
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树莓派操作系统 的相关文章

  • 跳表的动态演示

    跳表的动态演示 插入操作 删除操作 xff1a 查询操作 xff1a
  • [模拟/模拟/有技巧的搜索] csp第一次模拟

    目录 题目一 咕咕东的奇遇题意样例思路总结代码 题目二 咕咕东想吃饭题意样例思路总结代码 题目三 可怕的宇宙射线题意样例思路总结代码 题目一 咕咕东的奇遇 题意 有一个如图所示的圆环 xff0c 初始时指针指在a处 给定一个字符串 xff0
  • [单调栈/差分/尺取/单调队列]Exercise Week5 A最大矩形+B魔法猫+C平衡字符串+D滑动窗口

    目录 A 单调栈 最大矩形题意样例思路总结代码 B 差分 TT 39 s Magic Cat题意样例思路总结代码 C 尺取 平衡字符串题意样例思路总结代码 D 单调队列 滑动窗口题意样例思路总结代码 A 单调栈 最大矩形 题意 给一个直方图
  • [树的直径/并查集/最小生成树/最小瓶颈生成树]Exercise Week6 A+B+C+D

    目录 A 树的直径 氪金带东题意样例思路总结代码 B 并查集 戴好口罩 xff01 题意样例思路总结代码 C 最小生成树 掌握魔法 东东题意样例思路总结代码 D 最小瓶颈生成树 数据中心题意样例思路总结代码 A 树的直径 氪金带东 题意 实
  • [差分约束/拓扑排序/kosaraju缩点]Exercise Week8 A+B+C

    目录 A 差分约束 区间选点 题意样例样例输入 xff1a 样例输出 思路总结代码 B 拓扑排序 猫猫向前冲题意样例样例输入 xff1a 样例输出 xff1a 思路总结代码 C SCC缩点 区间选点 题意样例样例输入 xff1a 样例输出
  • [大模拟]Test Week8 二阶魔方

    目录 大模拟 东东玩二阶魔方题意d样例样例输入 xff1a 样例输出 思路总结代码 B 模拟 ST串题意样例样例输入 xff1a 样例输出 xff1a 思路总结代码 大模拟 东东玩二阶魔方 题意d 东东有一个二阶魔方 xff0c 即2 2
  • [大模拟]Test Week14 猫睡觉问题

    目录 大模拟 猫睡觉问题题意样例样例输入 xff1a 样例输出 思路总结代码 大模拟 猫睡觉问题 题意 众所周知 xff0c TT家里有一只魔法喵 这只喵十分嗜睡 一睡就没有白天黑夜 喵喵一天可以睡多次 xff01 xff01 每次想睡多久
  • [区间DP/状压DP]Exercise Week12 A~E

    目录 A 水 找数题意样例样例输入 xff1a 样例输出 思路总结代码 B BFS 逃离题意样例样例输入 xff1a 样例输出 xff1a 思路总结代码 C DP 扫楼题意样例样例输入 xff1a 样例输出 思路总结代码 D 区间DP 最长
  • 新的开始( [USACO08OCT]打井Watering Hole)

    新的开始 newstart pas c cpp 题目描述 话说小 FF 在经历了上次 寻找古代王族遗产 的探险后 xff0c 成为了世界上最伟大的探险 家并拥有了一大笔财富 当然他不能坐吃山空 xff0c 必须创造财富 xff01 xff0
  • UOS配置本地APT源和外部软件包

    root 64 skill PC mount dev sr0 mnt mount mnt WARNING device write protected mounted read only root 64 skill PC vi etc ap
  • [二分答案] 洛谷P1873 砍树

    目录 题意样例样例输入 xff1a 样例输出 思路总结代码 题意 伐木工人米尔科需要砍倒M米长的木材 这是一个对米尔科来说很容易的工作 xff0c 因为他有一个漂亮的新伐木机 xff0c 可以像野火一样砍倒森林 不过 xff0c 米尔科只被
  • [区间DP]洛谷P1063 能量项链

    目录 题意样例样例输入 xff1a 样例输出 思路总结代码 题意 样例 样例输入 xff1a 4 2 3 5 10 样例输出 710 思路 1 经典区间DP题 算是合并石子的变种 只不过由一个点变成了一个区间 不过我们也可以用结构体存储 当
  • Linux命令行初接触-1 操作文件和目录

    操作文件 amp 目录 1 通配符含义常用通配符常用字符类类型匹配范例 2 mkdir 创建目录3 cp 复制文件和目录工作方式常用选项 4 mv 移动和重命名文件工作方式常用选项 5 rm 删除文件和目录工作方式常用选项注意事项 6 ln
  • 机器学习入入入入门(1)机器学习基本概念、引出深度学习

    机器学习入入入入门 xff08 1 xff09 0 前言1 基本步骤2 基本概念2 1 Hyperparameters2 2 local minima 3 linear model3 1 基础概念 4 piecewise linear cu
  • 深度学习蒟蒻入门——从0安装pytorch(CPU版)

    从0安装pytorch 1 检查自己的电脑有没有GPU2 安装CPU版的pytorch3 测试pytorch 1 检查自己的电脑有没有GPU 首先打开任务管理器 xff0c 选择性能栏 然后滑到最下 xff0c 看是否有GPU一项 xff0
  • 系统学习iOS动画 —— Stroke和路径动画

    这是要完成的动画 xff1a 先添加需要的代码 xff0c 这里需要将storyboard的ViewController换成TableViewController xff0c 将Under Top Bars 和 Under Bottom B
  • 不知道这些网站还做什么程序员呀!

    今天我就来总结一些程序员必备的网站 xff0c 囊括开源项目 解决bug 技术分享 一线资源和自我提升的网站 xff0c 希望能对广大程序猿有所帮助 xff0c 赶紧给我收藏起来 xff0c 下次刷不到了可别说我没提醒你 我们首先来看一下国
  • (音视频开发)WebRTC进阶流媒体服务器开发-多人互动架构

    一 xff1a 多人互动架构方案 xff08 一 xff09 WebRTC回顾 xff0c 两层含义 xff1a 1 WebRTC是google开源的流媒体客户端 xff0c 可以进行实时通讯 xff0c 主要应用于浏览器之间进行实时通讯

随机推荐

  • 10种linux下磁盘快照方式恢复系统

    导读大家都知道windows系统有一个磁盘快照的功能 xff0c 在windows2003中系统恢复开始依赖于一个叫做硬盘快照服务 Volume Snapshot Service 的服务 xff0c 他能够自动创建系统快照 包括正在使用的文
  • ubuntu安装go开发环境

    一 为ubuntu20 04更新源 给root用户设置密码 xff1a 命令 xff1a sudo passwd root 备份原来的源 xff0c 命令 xff1a sudo cp etc apt sources list etc apt
  • 如何修复Ubuntu中包缓存文件被毁问题

    导读今天 xff0c 我尝试更新我的 Ubuntu 18 04 LTS 的仓库列表 xff0c 但收到了一条错误消息 xff1a E The package cache file is corrupted it has the wrong
  • 1002 A+B for Polynomials (25分) 详解+易错点

    注意点 xff1a 系数为0 xff0c 则不输出 xff0c 例 xff1a 其中 1和1相加为0 xff0c 则在输出时避免这一项 xff0c 而且要注意结果的K值 xff0c 不要包括这一项 xff0c 思路 xff0c 利用结构体存
  • Linux远程桌面的选择

    Linux的远程桌面主要分两个部分 xff1a Linux客户机连Linux服务器和Windows客户机连Linux服务器 xff0c 还有现在用平板电脑连远程桌面 Linux客户机连Windows服务器比较简单没啥可说的 xff0c rd
  • Kali Linux mdk3WiFi洪水攻击 攻击路由器 生成虚假WiFi WiFi身份验证攻击可使连接WiFi的手机掉线重连抓包

    将无线网卡转换为监听模式 airmon ng start wlan0 查找附近无线网络 airodump ng wlan0mon Authentication DoS xff1a xff08 洪水攻击 xff0c 又叫做身份验证攻击 xff
  • 大一java程序设计的某次作业题解

    题目描述 xff1a 设计程序实现输入日期及机票张数 xff0c 计算出应付金额 假设北京至上海的机票全价为 1200 元 张 xff0c 以 2017 年为例进行程序编写 xff0c 所有的法定假日 xff0c 机票无折扣 xff1b 除
  • D. Make It Round(1759D)

    要求n k后缀0数量最多 xff08 k lt 61 m xff09 xff0c 且n k尽可能大 比赛时思路 xff08 错误 xff09 xff1a 10是由2和5组成 xff0c 故先统计n的因子包含2的个数num2 包含5的个数nu
  • Codeforces Round #841 (Div. 2)

    B Kill Demodogs 分析 显然要选择和两斜线的元素相加 所以答案可以表示为 xff1a 即 xff1a 根据公式 得答案为 但答案不能直接得这个 因为n的范围为1e9 xff0c 而ull的范围为1e20 xff0c 答案的第一
  • Educational Codeforces Round 141 Editorial C~D

    1783C Yet Another Tournament 分析 正解思路是贪心 开始自己也想的贪心 xff1a 首先显然打败的人数越多越好 xff0c 然后选择权值最小的人打败 这个思路前半部分没问题 xff0c 后半部分过不了样例的第二个
  • Codeforces Round #844 (Div. 1 + Div. 2, based on VK Cup 2022 - Elimination Round) D

    1781D Many Perfect Squares 分析 对于每组 xff0c 若和均为完全平方数 xff0c 则存在 xff1a 所以枚举所有 xff0c 对于每个 xff0c 枚举其所有 双因子对 xff0c 若两个因子之差为偶数 x
  • 匹配已有字符串

    生活小妙招 通过set和substr函数 xff0c 方便快捷地写出匹配已有字符串的代码 前置芝士 xff1a set使用详解 题目 xff1a G Perfect Word 代码实现 通过set 43 string的substr的使用快速
  • 在vue中使用rules的定义和校验规则

    表单内容里面定义属性 lt Form ref 61 34 rulesForm 34 model 61 34 rulesForm 34 label width 61 34 100 34 rules 61 34 rules 34 gt lt F
  • Codeforces Raif Round 1 (Div. 1 + Div. 2) D

    D Bouncing Boomerangs 分析 一个stack用于存只有一个的物品的行的物品位置 xff0c 一个queue用于存有两个物品的行的左边物品位置 xff08 其实这两个容器用stack还是queue无所谓 xff0c 只是这
  • 使用django服务的前置操作

    注意 xff1a 这是一个用于小组作业说明的内部文章 xff0c 如果你在寻找部署django服务的完整流程 xff0c 请退出此文章 python版本 xff1a 3 7 输入命令 xff0c 安装django工具 xff1a pip i
  • Codeforces Round #853 (Div. 2) C题

    CF1789C Serval and Toxel 39 s Arrays 学弟的思路 思路清晰 xff0c 代码简洁明了 xff0c 吊打目前80 以上题解 分析 记录每个数字在多少个数组中出现过 xff0c 即记录每个数字出现的次数 然后
  • E. Carrots for Rabbits(一种神奇的数列维护技巧)

    题目 E Carrots for Rabbits 分析 将每个物品都放到大根堆里 xff0c 但每个物品有两个信息 xff1a 长度len 当前被切了几段part 根据这个物品当前状态的贡献 作为在堆里位置的依据 贡献由cal函数算出 注意
  • Codeforces Round 857 (Div. 1 + Div. 2) 2A - 2D

    A Likes 分析 首先数据保证了一定合法 xff0c 那只需要统计有几个负数 最大的策略是先把所有正数用完 xff0c 然后把所有负数用完 xff0c 可知答案一定是1 2 3 4 5 4 3这种形式 xff1b 最小策略是加一个就直接
  • Struts2校验框架<validators>配置报错

    问题 xff1a 新建了Actionname validation xml文件写校验 xff0c 发现 lt validators gt 及其子标签爆红 解决 1 找到部署Struts2时在官网下载的一堆 jar包 如图 xff1a 解压圈
  • 树莓派操作系统

    树莓派操作系统 树莓派操作系统 介绍更新和升级树莓派操作系统 使用 APT使用 rpi 更新播放音频和视频 OMXPlayer 应用程序如何播放音频如何播放视频播放期间的选项在后台播放使用 USB 网络摄像头 基本用法自动化图像捕获延时拍摄