06 在MSYS2中编译树莓派裸机程序,并在QEMU中运行
作者 | 将狼才鲸 |
---|---|
创建日期 | 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
- 我当前下载的版本是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镜像中也没有这个下载包;但你也可以在网上其它的地方比如网盘之类的找到这个文件的下载。
- 我将软件安装在D盘根目录,软件会安装在d:\msys64中,安装目录不能有空格、中文。
- 安装完之后先不打开软件,先将国外镜像地址换成国内镜像地址,参考上方教程。
- 电脑配置环境变量,在PATH中增加一行D:\msys64\usr\bin
- win10环境变量怎么设置 win10设置环境变量的方法
- 双击运行主目录下的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。
效果如下:
4.5 交叉编译工具编译程序,并在树莓派QEMU模拟中运行
- 在mirrors_bztsrc/raspi3-tutorial下载一个国外的英文仓库,是演示64位ARM树莓派裸机编程的,我借鉴这里面的工程。
- 这个工程已下载到当前仓库根目录下,我也会将这个目录拷贝到msys64的家目录下,我会将里面的Makefile和自动运行改成和msys64适配,保证一个make命令就能编译程序,一个make run就能在QEMU中运行刚刚编译的程序。
- 输出qemu所在位置和aarch64编译器所在位置的环境变量,这样就不用每次都写完整的路径了。
- 打开家目录也就是msys64/home/jim/下的.bashrc,在里面末尾加上
export PATH= P A T H : / m i n g w 64 / b i n e x p o r t P A T H = 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,确认已经生效
- 进入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)
06 在MSYS2中编译树莓派裸机程序,并在QEMU中运行相关推荐
- 在不同的环境中编译hello world程序
(一)在DOS命令行中编译hello world程序 单击开始 在搜索框中输入cmd 选择cmd.exe 打开命令行窗口 编译hello world 在命令行窗口中输入 echo hello worl ...
- VS中编译64位程序以及遇到的问题(E0000235)
安装64位操作系统不是编译64位程序的必要条件,关键是要装64位程序的编译器. 1. 选择"Build" – "Configuration Manager"菜单 ...
- linux中编译C语言程序
1.首先安装gcc编辑器 yum install gcc* -y 2.编写C语言程序 [root@test ~]# vim aa.c #include<stdio.h> int main( ...
- c 语言如何处理表格文件中的数据库,C#程序从Excel表格中读取数据并进行处理
今天做了一个Excel表格数据处理的事情,因为数据量表较大(接近7000条)所以处理起来有点麻烦,于是写了一个程序, 先将程序记下以便将来查找. using System; using System. ...
- java句子中找单词_java程序找到一个句子中每个单词的字母数
我想找到一个句子中每个单词的字母数.我已经尝试了几次使用几个代码,但从来没有得到它.我总是显示错误StringIndexOutOfBounds异常.我的一个代码如下:java程序找到一个句子中每个单词 ...
- Windows中添加自己的程序到开机启动中(添加服务,添加注册表)
在系统启动的时候启动自己想要启动的程序: 方法一:利用开机启动文件夹 将exe文件或exe文件的快捷方式复制到(启动)文件夹下 以win7为例:开始→所有程序→启动→鼠标右键打开 方法二:添加系统服务 ...
- WSL2编译IMX6ULL裸机程序Win10通过Win32DiskImager烧录SD卡
1. 修改imxdownload.c文件 完整代码见附录 gcc mixbin.c -o mixbin 使用上述gcc命令编译生成mixbin可执行文件,该文件只用于在WSL2下生成load.imx. ...
- linux编译文件 no such,Linux中编译或安装程序时提示No such file or directory
linux find命令 Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} ...
- linux 编译c文件 arm,用arm-linux-gcc编译arm裸机程序(可调用库)
CC=arm-linux-gcc #换成arm-elf-gcc不行,可以生成flat格式的文件,但我不知道怎么转成binary LD=arm-linux-ld OBJCOPY=arm-lin ...
最新文章
- 题目1493:公约数
- swoole-co-pool v1.0.1,Swoole 协程工作池
- 2016012075 谢月月 散列函数的应用及其安全性
- Java客户端操作elasticsearch--添加文档
- 三道题就能考察你对Vue掌握了多少!
- webservice 参数太大_webservice大数据
- 超全面超详细的Linux学习入门系列教程
- SNMP学习笔记之SNMP TRAP简介、流程以及使用Python实现接受Trap信息
- 自备一个刷BIOS神器
- Arduino AT24C02详解读写地址位
- GroupBox与Panel控件
- 精选16款超精美的XP登录界面下载
- 如何做好一个APP开发项目?需要规避以下误区
- 黑客丛林通关攻略参考(更新中)
- 一门课程学习转录组调控分析和R可视化第十四期 (线上线下开课)
- css 控制 段落 超出三行的部分显示...
- 在英特尔独立显卡上训练ResNet PyTorch模型
- 多用途DF无线数据收发模块
- 原生jq下载文件的方式
- UEFI应用与编程--SMM(一)
热门文章
- vulnhub--Leeroy:1
- Java开发中解析word文档录入数据库——后续
- 上海交通大学计算机系张伟楠,重点实验室系列学术报告:上海交通大学张伟楠...
- 面试之-3.0概率质量函数,概率密度函数,概率分布函数
- 关于vsCode中文插件突然无效的解决办法
- Unable to make field private final java.lang.String java.io.File.path accessible: module java.base d
- vue+element密码和确认密码校验以及隐藏显示密码的小眼睛
- Python画图如何显示各点横纵坐标(x, y)?
- 微信浏览器的rem使用填坑
- zbrush导入obj模型不显示_zbrush软件怎么导入obj格式文件?Zbrush2018教程在哪可以看?...