作者 将狼才鲸
创建日期 2022-11-14
  • Gitee源码和工程地址:才鲸嵌入式 / 开源安防摄像机(嵌入式软件)
  • CSDN文章地址:项目介绍:开源安防摄像机(嵌入式软件)

4)完整的环境安装步骤

  • 写在前面,我会提供已经安装好各种工具的MSYS2环境,如果你没用过Linux,建议你直接下载本系统压缩包cj_msys64.zip,解压后使用,或者自行使用VMware Player虚拟机+Ubuntu安装开发环境,因为MSYS2中安装软件的教程很难快速找到,需要有一些使用Linux的经验才知道怎么安装特定软件;我的MSYS2环境添加了32位和64位的交叉编译工具,他们的来源不一样,后面会详述。

  • 下面是从头到尾的工具软件安装步骤:

    • 推荐使用MSYS2 + 已经用MinGW32或MinGW64编译好的程序,基本上开发过程中你能在Linux下实现的,也都能在这个环境下实现,只是有些教程没有Ubuntu下那么好找;在MSYS2中不能使用Linux的程序,必须用MinGW将源码重新编译过后才能使用,这一般是软件供应商已经做好的。
    • MSYS2的更多信息详见本仓库子文档:《04_MSYS2简述.md》

表2 MSYS2、MinGW和Cygwin的关系

软件名 版本 作用 特点
MSYS MSYS,MSYS2 Linux命令行终端:Shell,Bash 没有在Windows下编译Linux程序的工具集,会自带已经被MinGW编译好的一些包;脱胎于Cygwin,但容量更小;MSYS2是因为MSYS常年不更新而新组的的一个项目;MSYS2安装完后的文件名为msys64,你可以将你安装好之后的msys64文件夹打包发给别人,这样别人无安装就可以用了,只是容量有点大,几十G
MinGW MinGW32,MinGW64 一组编译工具链 编译后生成的是纯粹的Windows程序;它自带的命令行终端很难用也不全,要和MSYS2终端配合使用;MinGW64是因为MinGW32常年不更新而新组的的一个项目
Cygwin Cygwin 编译工具+命令行 有模拟层,将Linux API转成Windows API再执行程序,效率低,容量大,速度慢,2010年左右在Windows下搭建交叉编译环境时还多用它;要运行纯粹的Linux程序时也用它
  • 参考网址:

    • CygWin、MingW、MSYS之间的关系
    • Cygwin、Msys、MinGW、Msys2的区别与联系(转)
    • Cygwin、MinGw、mingw-w64,MSys msys2区别与联系
    • MSYS2+MinGW32 编译 QEMU需做的准备工作
    • 在Windows上编译QEMU

4.1 安装MSYS2

  1. 我当前下载的版本是msys2-x86_64-20221028.exe
  • 网上的安装教程是使用msys2打造优雅的开发环境
  • 在官网主页找到下载链接:github.com/msys2/msys2-installer/releases/download/2022-10-28/msys2-x86_64-20221028.exe ,85M左右,这只是一个安装器,不是全部的软件;这是GitHub的地址,有时候下载慢,有时候无法访问;这个可下载的软件是CICD自动生成的,国内的Gitee镜像中也没有这个下载包;但你也可以在网上其它的地方比如网盘之类的找到这个文件的下载。
  1. 我将软件安装在D盘根目录,软件会安装在d:\msys64中,安装目录不能有空格、中文。
  2. 安装完之后先不打开软件,先将国外镜像地址换成国内镜像地址,参考上方教程。
  3. 电脑配置环境变量,在PATH中增加一行D:\msys64\usr\bin
  • win10环境变量怎么设置 win10设置环境变量的方法
  1. 双击运行主目录下的msys2.exe或者mingw64.exe都可以,其它的exe有些是32位的,有些是非gcc编译器对应的软件。

4.2 MSYS2中安装QEMU

  • 因为我已经有了MSYS2环境,可以在里面直接安装QEMU;你下载Windows版本的QEMU单独安装,也是走的MSYS2+MinGW这一套,只是和Git一样,它们都是在自己的软件安装包自带了精简版的MinGW环境。

  • 我们不需要用MinGW64或者MinGW32编译QEMU,我们只安装已经编译好的QEMU软件;网上没搜到MSYS2中安装QEMU的教程,但是我们知道MSYS2中的所有软件都在packages.msys2.org/repos 、 MSYS2 Base Packages 和 MSYS2 Packages中有描述。

  • 在https://packages.msys2.org/base 中能找到mingw-w64-qemu;在https://packages.msys2.org/package/ 中能找到mingw-w64-x86_64-qemu;在https://packages.msys2.org/package/mingw-w64-x86_64-qemu?repo=mingw64 中能找到/mingw64/bin/qemu-system-aarch64.exe、/mingw64/bin/qemu-system-arm.exe,也能找到安装方法:pacman -S mingw-w64-x86_64-qemu;我当前使用的是Build Date: 2022-10-10 20:19:53,Installed Size: 768.72 MB,实际安装完后有2G。

  • 查看是否安装成功:进入cd /mingw64/bin/ 然后./qemu-system-arm.exe --version查看版本号;后续还需要设置环境变量,这里暂略。

  • 能看到输出信息:

jim@DESKTOP-SVP3BEM MSYS /mingw64/bin
$ ./qemu-system-arm.exe --version
QEMU emulator version 7.1.0
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers

4.3 MSYS2中安装32位和64位ARM交叉编译工具

  • 一些工具介绍:

    • 树莓派提供了在Linux下使用的交叉工具包的文件夹名为gcc-linaro-arm-linux-gnueabihf-raspbian-x64,使用的编译器名为arm-linux-gnueabihf-gcc,下载地址raspberrypi-tools/ arm-bcm2708。
    • GNU官方提供了树莓派在Windows中使用的交叉工具包,默认的工具是使用Visual Studio + VisualGDB来进行编译的。
      32位地址:Prebuilt Windows Toolchain for Raspberry Pi
      64位地址:Prebuilt Windows Toolchain for Raspberry Pi (64-bit)
    • ARM在Windows下自带的交叉编译工具为gcc-arm-none-eabi-10.3-2021.10-win32.exe,网页路径在https://developer.arm.com/downloads/-/gnu-rm ,交叉编译工具名为arm-none-eabi-gcc,我们不使用树莓派自带的交叉编译工具,而直接使用ARM的;因为树莓派没有直接给出MinGW下的交叉编译工具,而我也不想在Cygwin环境使用树莓派的Linux交叉编译工具。
  • 但也不在ARM官方下载,我们在MSYS2中同样也能找到:在https://packages.msys2.org/base 中能搜到mingw-w64-arm-none-eabi-gcc和mingw-w64-arm-none-eabi-gdb

    • MSYS2下载命令 pacman -S mingw-w64-x86_64-arm-none-eabi-gcc,大小有1.24 GB,参考网址:Package: mingw-w64-x86_64-arm-none-eabi-gcc
    • GDB调试工具下载的命令 pacman -S mingw-w64-x86_64-arm-none-eabi-gdb,大小有7.92 MB,参考网址:Package: mingw-w64-x86_64-arm-none-eabi-gdb
    • 安装完成后的文件在msys64/mingw64/bin/arm-none-eabi-gcc.exe
    • 如果你需要使用aarch64-elf-gcc编译64位的ARM程序,在新版的树莓派中运行,则MSYS2网站中没有,你要去Linaro软件中下载。
  • 如果有需要,你也可以安装用于64位ARM的交叉编译工具。

    • 软件名称:gcc-linaro-7.5.0-2019.12-i686-mingw32_aarch64-linux-gnu.tar.xz ,大小364M
    • 下载路径:https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/
    • 下载完之后放到msys64/mingw32/bin/里面去,用Linux命令解压,然后设置环境变量,使用方法和32位gcc交叉编译工具一样
    • 我msys64中的路径是msys64/mingw32/bin/gcc-linaro-7.5.0-2019.12-i686-mingw32_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc.exe
    • 在Linaro这里也能下到32位的GCC交叉编译工具:gcc-linaro-7.5.0-2019.12-i686-mingw32_arm-linux-gnueabihf.tar.xz
    • https://www.linaro.org/ Linaro公司主要是做ARM的一些开源工具,树莓派也是直接使用的Linaro编译器。
  • MSYS2安装make

    • pacman -S make
    • Package: make
  • 参考网址:

    • Windows下编译树莓派pico C\C++(Building on MS Windows)
    • 树莓派 交叉编译环境搭建(Win 7)
    • 【交叉编译踩坑指北(二)】windows10下VScode构建树莓派pico开发环境(C/C++)
    • 树莓派2 raspyberry Pi2 交叉编译app
    • Windows10下 交叉编译aarch64(ARMv8)架构Qt5.12.11库

4.4 用现成的程序从QEMU运行树莓派

  • 从以下网址https://gitee.com/mirrors_bztsrc/raspi3-tutorial/tree/master/0A_pcscreenfont 下载编译好的树莓派程序,我已下载好,存放在msys64家目录下的1_raspi/01_run文件夹中
  • 使用命令运行:/mingw64/bin/qemu-system-aarch64 -M raspi3b -kernel ~/1_raspi/01_run/kernel8.img -d in_asm
  • 能看到出现了QEMU窗口,并显示了hello world。
    效果如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nbXCRLJO-1668607347474)(./picture/01_QEMU_RUN.png)]

4.5 交叉编译工具编译程序,并在树莓派QEMU模拟中运行

  1. 在mirrors_bztsrc/raspi3-tutorial下载一个国外的英文仓库,是演示64位ARM树莓派裸机编程的,我借鉴这里面的工程。
  • 这个工程已下载到当前仓库根目录下,我也会将这个目录拷贝到msys64的家目录下,我会将里面的Makefile和自动运行改成和msys64适配,保证一个make命令就能编译程序,一个make run就能在QEMU中运行刚刚编译的程序。
  • 输出qemu所在位置和aarch64编译器所在位置的环境变量,这样就不用每次都写完整的路径了。
  • 打开家目录也就是msys64/home/jim/下的.bashrc,在里面末尾加上
    export PATH=PATH:/mingw64/binexportPATH=PATH:/mingw64/bin export PATH=PATH:/mingw64/binexportPATH=PATH:/mingw32/bin/gcc-linaro-7.5.0-2019.12-i686-mingw32_aarch64-linux-gnu/bin
  • 生效配置 source .bashrc
  • 查看环境变量 echo $PATH,确认已经生效
  1. 进入msys64 raspi3-tutorial源码目录,编译并运行
  • 源码我已经拷贝到msys64中,并且已经改了Makefile,能直接编译和运行,同时修改过以后的源码我也会在本仓重上传

  • 源码路径 ~/raspi3-tutorial/01_bareminimum,也就是/home/jim/raspi3-tutorial/01_bareminimum,也就是D:\msys64\home\jim\raspi3-tutorial\01_bareminimum,后面所有的示例路径我都采用第一种写法。

  • 进入目录 cd ~/raspi3-tutorial/01_bareminimum

  • 编译 make

  • 运行 make run

  • make run能运行,是因为在Makefile里面写了命令 qemu-system-aarch64 -M raspi3b -kernel kernel8.img -d in_asm

  • 01_bareminimum用例是一个空程序,所以QEMU里面什么都不会显示,其它用例的效果我会再后面展示。

  • 参考网址:

  • 树莓派有关裸机编程的教程很少,我只找到了几个英文教程和几篇中文博客:

    • 裸机编程:mirrors_bztsrc / raspi3-tutorial
    • 编写操作系统:lxjj / rpi4-osdev
    • 一点中文翻译,在树莓派4B上编写裸机操作系统(PART0)
    • 另一个树莓派操作系统开发:Baking Pi – Operating Systems Development
    • RPi bring up hello world! 树莓派底层编程裸机点亮led
    • 996refuse/emperorOS Public
    • 4 anbox 树莓派 树莓派4裸机基础教程:从hello world开始
    • Raspberry PI 系列 —— 裸机点亮LED灯
  • 参考网址:

  • 树莓派的交叉编译 (BCM2835/6/7/BCM23711)

4.6 有关树莓派裸机编程的介绍

  • 树莓派里面有GPU和ARM CPU,GPU先上电运行,然后再引导ARM运行

  • 树莓派的GPU底层固件(Bootloader)是闭源的,但可以在此基础上引导自己的U-Boot、Linux kernel,也可以不用U-Boot和Linux,直接引导裸机程序或者RTOS;这种引导方式和Xilinx ZYNQ类似,ARM和FPGA一个先启动一个后启动。

  • 一些其它的树莓派嵌入式相关的开源仓库:
    (1) 运行在 Raspberry Pi 上的小型嵌入式系统

  • Xinu project (xinu-os/xinu)
  • Ultibo project (ultibohub/Core)

(2) 一些在 Raspberry Pi 上可以嵌入在其他系统中的运行库

  • USPi(rsta2/uspi), 一个小型的支持 USB 通讯的库

(3) 以及其他一些基于 Raspberry Pi 裸机开发例子:

  • Bare Metal Programming on Raspberry Pi 3:(bztsrc/raspi3-tutorial)
  • Raspberry Pi ARM based bare metal examples (dwelch67/raspberrypi)
  • 参考网址:

    • RPi bring up hello world! 树莓派底层编程裸机点亮led
    • 从底层玩转树莓派,里面有树莓派RTOS操作系统的链接
    • 详细到吐血 —— 树莓派驱动开发入门:从读懂框架到自己写驱动
    • 在树莓派3b上如何运行uboot
    • 7个别出心裁的树莓派优质项目集锦(完整代码+电路设计资料)
    • 树莓派BootLoader
    • 树莓派的启动流程
    • 树莓派裸板linux,树莓派裸机开发步骤
    • 树莓派裸核程序开发 —— 从汇编到第一个C语言程序
    • 树莓派裸机代码bootloader学习总结

五、raspi3-tutorial硬件测试用例

  • 原始网址:mirrors_bztsrc / raspi3-tutorial
  • 本仓库中的地址:根目录/raspi3-tutorial/
  • msys64中的地址:家目录 ~/raspi3-tutorial/
  • 硬件是raspi3,64位ARM芯片,但因为有现成的代码,可以先熟悉编译环境,之后再在32位ARM上跑。

表3 raspi3-tutorial各测试用例的描述

用例名称 作用 备注
00_crosscompiler 文档,只是描述编译器相关的内容
01_bareminimum 空程序,在汇编中死循环,只是为了验证编译器和模拟器安装正确,能够编译和运行
02_multicorec 写汇编boot,并引导C语言main函数运行
03_uart1 串口打印Hello world,从MSYS2控制台输出
04_mailboxes CPU和GPU邮箱通信,通信成功后打印串口号
05_uart0 串口收发回环
06_random 打印随机数
07_delays 延时后打印
08_power 关机与重启
09_framebuffer 从屏幕显示未压缩的图片
0A_pcscreenfont 从屏幕显示点阵字库文字
0B_readsector 读SD卡扇区
0C_directory 读SD卡文件夹
0D_readfile 读SD卡文件
0E_initrd 根文件系统
0F_executionlevel 获取当前程序级别
10_virtualmemory MMU虚拟内存映射
11_exceptions 测试异常中断
12_printf 测试printf输出
13_debugger gdb调试输出
14_raspbootin64 一个简单的bootloader
15_writesector 写SD卡

1)03_uart1

  • 作用:串口打印Hello world,从MSYS2控制台输出
  • 效果:
jim@DESKTOP-SVP3BEM MSYS ~/raspi3-tutorial/03_uart1
$ make
rm kernel8.elf *.o >/dev/null 2>/dev/null || true
aarch64-linux-gnu-gcc -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -c start.S -o start.o
aarch64-linux-gnu-gcc -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -c main.c -o main.o
aarch64-linux-gnu-gcc -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -c uart.c -o uart.o
aarch64-linux-gnu-ld -nostdlib -nostartfiles start.o main.o uart.o -T link.ld -o kernel8.elf
aarch64-linux-gnu-objcopy -O binary kernel8.elf kernel8.imgjim@DESKTOP-SVP3BEM MSYS ~/raspi3-tutorial/03_uart1
$ make run
qemu-system-aarch64 -M raspi3b -kernel kernel8.img -serial null -serial stdio
Hello World!

2)04_mailboxes

  • 作用:CPU和GPU邮箱通信,通信成功后打印串口号
  • 效果:
jim@DESKTOP-SVP3BEM MSYS ~/raspi3-tutorial/04_mailboxes
$ make
rm kernel8.elf *.o >/dev/null 2>/dev/null || true
aarch64-linux-gnu-gcc -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -c start.S -o start.o
aarch64-linux-gnu-gcc -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -c main.c -o main.o
aarch64-linux-gnu-gcc -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -c mbox.c -o mbox.o
aarch64-linux-gnu-gcc -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -c uart.c -o uart.o
aarch64-linux-gnu-ld -nostdlib -nostartfiles start.o main.o mbox.o uart.o -T link.ld -o kernel8.elf
aarch64-linux-gnu-objcopy -O binary kernel8.elf kernel8.imgjim@DESKTOP-SVP3BEM MSYS ~/raspi3-tutorial/04_mailboxes
$ make run
qemu-system-aarch64 -M raspi3b -kernel kernel8.img -serial null -serial stdio
My serial number is: 0000000000000000

3)05_uart0

  • 作用:串口收发回环(串口重定向到MSYS2命令行终端)
  • 效果:
jim@DESKTOP-SVP3BEM MSYS ~/raspi3-tutorial/05_uart0
$ make
rm kernel8.elf *.o >/dev/null 2>/dev/null || true
aarch64-linux-gnu-gcc -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -c start.S -o start.o
aarch64-linux-gnu-gcc -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -c main.c -o main.o
aarch64-linux-gnu-gcc -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -c mbox.c -o mbox.o
aarch64-linux-gnu-gcc -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -c uart.c -o uart.o
aarch64-linux-gnu-ld -nostdlib -nostartfiles start.o main.o mbox.o uart.o -T link.ld -o kernel8.elf
aarch64-linux-gnu-objcopy -O binary kernel8.elf kernel8.imgjim@DESKTOP-SVP3BEM MSYS ~/raspi3-tutorial/05_uart0
$ make run
qemu-system-aarch64 -M raspi3b -kernel kernel8.img -serial stdio
My serial number is: 0000000000000000
aaaaddddd
asdfasfsafsa

4)07_delays

  • 延时后打印
jim@DESKTOP-SVP3BEM MSYS ~/raspi3-tutorial/07_delays
$ make run
qemu-system-aarch64 -M raspi3b -kernel kernel8.img -serial stdio
Waiting 1000000 CPU cycles (ARM CPU): OK
Waiting 1000000 microsec (ARM CPU): OK
Waiting 1000000 microsec (BCM System Timer): OK

5)08_power

  • 关机与重启
jim@DESKTOP-SVP3BEM MSYS ~/raspi3-tutorial/08_power
$ make run
qemu-system-aarch64 -M raspi3b -kernel kernel8.img -serial stdio1 - power off2 - reset
Choose one: 21 - power off2 - reset
Choose one: 11 - power off2 - reset
Choose one:
jim@DESKTOP-SVP3BEM MSYS ~/raspi3-tutorial/08_power

6)09_framebuffer

  • 从屏幕显示未压缩的图片

7)0A_pcscreenfont

  • 从屏幕显示点阵字库文字

8)0F_executionlevel

  • 获取当前程序级别
jim@DESKTOP-SVP3BEM MSYS ~/raspi3-tutorial/0F_executionlevel
$ jim@DESKTOP-SVP3BEM MSYS ~/raspi3-tutorial/0F_executionlevel
$ make run
qemu-system-aarch64 -M raspi3b -kernel kernel8.img -serial stdio
Current EL is: 00000001

9)11_exceptions

  • 测试异常中断
jim@DESKTOP-SVP3BEM MSYS ~/raspi3-tutorial/11_exceptions
$ make run
qemu-system-aarch64 -M raspi3b -kernel kernel8.img -serial stdio
Synchronous: Data abort, same EL, Translation fault at level 2:ESR_EL1 0000000096000006 ELR_EL1 0000000000080CC4SPSR_EL1 00000000200003C4 FAR_EL1 FFFFFFFFFF000000jim@DESKTOP-SVP3BEM MSYS ~/raspi3-tutorial/11_exceptions

10)12_printf

  • 测试printf输出
jim@DESKTOP-SVP3BEM MSYS ~/raspi3-tutorial/12_printf
$ make run
qemu-system-aarch64 -M raspi3b -kernel kernel8.img -serial stdio
Hello World!
This is character 'A', a hex number: 7FFF and in decimal: 32767
Padding test: '00007FFF', '    -123'jim@DESKTOP-SVP3BEM MSYS ~/raspi3-tutorial/12_printf

11)13_debugger

  • gdb调试输出
jim@DESKTOP-SVP3BEM MSYS ~/raspi3-tutorial/13_debugger
$ make run
qemu-system-aarch64 -M raspi3b -kernel kernel8.img -serial stdio
Synchronous: Breakpoint instruction
> runx0: 000000000008EF7C   x1: 0000000000000301   x2: 0000000000000070x3: 000000000000000B   x4: 0000000000024000   x5: 0000000000000000x6: 0000000000000000   x7: 0000000000000000   x8: 0000000000000000x9: 0000000000000000  x10: 0000000000000000  x11: 0000000000000000
x12: 0000000000000000  x13: 0000000000000000  x14: 0000000000000000
x15: 0000000000000000  x16: 0000000000000000  x17: 0000000000000000
x18: 0000000000000000  x19: 0000000000000000  x20: 0000000000000000
x21: 0000000000000000  x22: 0000000000000000  x23: 0000000000000000
x24: 0000000000000000  x25: 0000000000000000  x26: 0000000000000000
x27: 0000000000000000  x28: 0000000000000000  x29: 000000000007FFF0
x30: 000000000008EF7C  elr_el1: 8EF7C  spsr_el1: 600003C4esr_el1: F2000000  far_el1: 0
sctlr_el1: 30D00800  tcr_el1: 0
>

07 树莓派裸机编程,并在Windows MSYS2 QEMU模拟器中运行相关推荐

  1. 在Linux和Windows的Docker容器中运行ASP.NET Core

    译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott Hanselman就捷足先登了.那么我就来翻译一下这篇文章,让更多的中文读者看到.当然Scott遇到的坑我也遇 ...

  2. Windows Azure Cloud Service (24) 在模拟器中运行时跳过Windows Azure Startup任务

    <Windows Azure Platform 系列文章目录> 前一章里我们已经介绍了如何使用Windows Azure Startup来执行额外的配置任务,比如注册COM组件和注册Win ...

  3. 科学计算机怎么编程玩,如何通过可编程科学计算器在另一个设备中运行本机MFP语言编写的...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 MFP语言的一个重要功能就是通过call ... endcall语句实现对并行计算的支持.MFP语言实现多线互不干扰并行计算的基本原理是采用沙盒机制.每一 ...

  4. 树莓派Python编程指南--第一章(起航--启动和运行)

    2019独角兽企业重金招聘Python工程师标准>>> 1.1 组装好你的树莓派 组装工作之后再讲述 控制二极管发光及关闭 组装完成后,我们开始第一个例子:控制二极管发光及关闭的小程 ...

  5. 如何在Windows CMD的一行中运行两个命令?

    我想在Windows CMD控制台中运行两个命令. 在Linux中,我会这样 touch thisfile ; ls -lstrh 在Windows上如何完成? #1楼 如果要创建cmd快捷方式(例如 ...

  6. windows下在内存中运行程序

    1.前言 公司需要将两个程序合并成一个,一个我们自己的,一个客户的,运行的时候先运行我们的再运行客户的,否则无法进入游戏.现在有一个问题就是说部分客户需要在哪里打开在哪里运行,这样如果采用和原来一样的 ...

  7. 06 在MSYS2中编译树莓派裸机程序,并在QEMU中运行

    作者 将狼才鲸 创建日期 2022-11-14 Gitee源码和工程地址:才鲸嵌入式 / 开源安防摄像机(嵌入式软件) CSDN文章地址:项目介绍:开源安防摄像机(嵌入式软件) 4)完整的环境安装步骤 ...

  8. 《树莓派Python编程入门与实战》——2.1 了解Linux

    本节书摘来异步社区<树莓派Python编程入门与实战>一书中的第2章,第2.1节,作者:[美]Richard Blum,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

  9. 《树莓派Python编程入门与实战》——2.3 使用Raspbian图形用户界面

    本节书摘来异步社区<树莓派Python编程入门与实战>一书中的第2章,第2.3节,作者:[美]Richard Blum,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

最新文章

  1. 食品安全溯源区块链解决方案探索-转载
  2. twisted应用中异步回调的方式及线程的应用
  3. 华为擎云w510_苹果 iPhone 12 全家桶谍照曝光;华为台式机擎云W510现身官网
  4. 在Centos中yum安装和卸载软件的使用方法
  5. 为了让盲人也能追剧,优酷做了哪些努力?
  6. svn 命令行_Ubuntu下Subversion(SVN)的快速安装与配置
  7. mac储存文件应该放在哪里_单位不能存档,个人档案应该放在哪里呢,影响今后退休金吗?...
  8. 【下载https协议需要的cer证书】
  9. JavaScript 全栈工程师培训教程(React.js + Node.js)
  10. flink 时间语义、水位线(Watermark)、生成水位线、水位线的传递
  11. java简历校园经历_简历校园经历如何编
  12. 高德地图加载标注并实现缩放动画
  13. Unity中UI的LookAt效果实现
  14. 最新系统[防黑屏版]BT及双网盘下载(ZZ)
  15. python官网怎么下载python,苹果电脑怎么下载python
  16. 浅析小程序云原生数据库的设计与应用
  17. 写了个自动批改小孩作业的代码
  18. 用Python让蔡徐坤在我的命令行里打篮球!| 附完整代码
  19. ABC157 D - Friend Suggestions 题解
  20. FTP数据库的创建与管理

热门文章

  1. VS2017编译文件遇到fatal error C1010: 在查找预编译头时遇到意外的文件结尾的解决办法
  2. Linux磁盘无法umount的问题
  3. 音视频开发系列(15):视频与音频同步
  4. Java Comparator使用指南 ---- 看这一篇就够了
  5. Elasticsearch——Settings设置
  6. python实现蓝桥杯真题:猜美国数学家维纳的年龄
  7. auto.js教程:找图函数,图片内随机点击
  8. 2012过年的时间 2012过年放假时间 2012年什么时间过年 2012过年 2012年什么时候过年
  9. vlookup反向查询_VLOOKUP的反向查找功能
  10. Git 命令之Git clean