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

news2025/1/15 17:40:42
作者将狼才鲸
创建日期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的关系
软件名版本作用特点
MSYSMSYS,MSYS2Linux命令行终端:Shell,Bash没有在Windows下编译Linux程序的工具集,会自带已经被MinGW编译好的一些包;脱胎于Cygwin,但容量更小;MSYS2是因为MSYS常年不更新而新组的的一个项目;MSYS2安装完后的文件名为msys64,你可以将你安装好之后的msys64文件夹打包发给别人,这样别人无安装就可以用了,只是容量有点大,几十G
MinGWMinGW32,MinGW64一组编译工具链编译后生成的是纯粹的Windows程序;它自带的命令行终端很难用也不全,要和MSYS2终端配合使用;MinGW64是因为MinGW32常年不更新而新组的的一个项目
CygwinCygwin编译工具+命令行有模拟层,将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。
    效果如下:在这里插入图片描述

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= 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,确认已经生效
  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)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件产品测试的准入准出标准有哪些?

软件产品的测试并不是测试人员简单的执行测试过程便可以交付的,而是有着一定的标准,什么条件可以开始测试,什么时候结束测试等等也就是测试的准入准出标准。 一、软件测试的准入标准 1、开发人员编码结束并且已在开发环境中完成单元测试&a…

OpUtils局域网唤醒:远程引导计算机

局域网唤醒 (LAN),通常称为 LAN 唤醒,是一种计算机网络标准,有助于远程启动有线和无线网络。也称为远程唤醒、LAN 唤醒、无线 LAN 唤醒或简称 WOL,LAN 唤醒技术可帮助网络管理员优化能源使用,并…

一文教你搞定Python如何自定义标准排序

文章目录1.字典自定义排序按照value排序按照key值排序先按照value降序,再按key升序2.多维列表自定义标准排序案例题目描述输入输出代码:1.字典自定义排序 按照value排序 sdict() s[a]45 s[b]44 s[c]78 s[d]34 asorted(s.items(),keylambda x:x[1],reve…

手摸手教你使用 Docker 快速搭建 Gitlab 服务

前言 Glitlab 比较占用内存,官方建议最低配置为 2核4G。我的服务器刚刚好是2核4G,但是还装了 Docker 跑一些其他服务,所以以防万一,还是选择在本地的虚拟机中进行安装。 如果你有一台配置较高的服务器那就更好了,一步…

nodejs+vue+elementui图书馆销售网上书城管理系统express228

目 录 前端技术:nodejsvueelementui 前端:HTML5,CSS3、JavaScript、VUE 摘 要 I ABSTRACT I 目 录 III 第1章 绪论 1 1.1开发背景 1 1.2开发意义 1 1.3研究内容 1 第2章 主要技术和工具介绍 3 下面我们讲解 1、 node_modules文…

【数据结构】队列详解 栈和队列OJ题 —— 用队列实现栈、用栈实现队列、设计循环队列

文章目录前言队列的概念队列的结构队列的实现结构设计接口总览初始化销毁入队列出队列取对头数据取队尾数据判空计算队列大小OJ题用队列实现栈用栈实现队列设计循环队列结语前言 今天的内容分为两大块:队列讲解 和 OJ题。队列讲解部分内容为:队列概念&a…

Android App开发图像加工中卡片视图CardView和给图像添加装饰的讲解以及实战(附源码 简单易懂)

需要图片集和源码请点赞关注收藏后评论区留言~~~ 一、卡片视图 随着手机越来越先进,开发者已经不满足简单地显示一张张图片,而要设计更多的花样,比如Android提供了一个卡片视图CardView,顾名思义它拥有卡片式的圆角边框&#xff…

[附源码]java毕业设计健身房管理系统论文2022

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

深度剖析 Vue3 如何通过虚拟DOM更新页面

上一讲我们主要介绍了 Vue 项目的首次渲染流程,在 mountComponent 中注册了effect 函数,这样,在组件数据有更新的时候,就会通知到组件的 update 方法进行更新 Vue 中组件更新的方式也是使用了响应式 虚拟 DOM 的方式&#xff0c…

git 命令行其实真的很好用

使用命令行操作git,我觉得是最简单、最直接的方式,最开始使用git的时候特别喜欢这种方式。后来,就不再使用命令行,而是选择了其他可视化的工具,如idea自带的插件、sourceTree、TortoiseGit、GitKraken。发生的转变的原…

AI绘画提示词创作指南:DALL·E 2、Midjourney和 Stable Diffusion最全大比拼

💡 作者:韩信子ShowMeAI 📘 深度学习实战系列:https://www.showmeai.tech/tutorials/42 📘 自然语言处理实战系列:https://www.showmeai.tech/tutorials/45 📘 计算机视觉实战系列:h…

Jenkins 10 问 10 答,你想知道都在这

大家好啊,我是大田。 今天汇总一下近几周关于 Jenkins 问题。 1、如何安装 Jenkins? 答:一步一步教你安装部署 Jenkins,不信你安不上 2、忘记登录密码? 答:Jenkins 忘记登录密码解决办法 3、jenkins中缺少…

基于 IDEA 搭建 RocketMQ-4.6 源码环境

RocketMQ 架构 源码搭建前, 需要理解 RocketMQ 的四个重要组件, 以及 RocketMQ 的工作流程: NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。 Broker部署相对复杂,Broker分为Master…

Java基础之《undertow容器》

一、什么是undertow 1、undertow是springboot默认支持的三种servlet容器之一。 tomcat、jetty、undertow 2、undertow怎么读 under-tow 3、undertow是RedHat(红帽公司)的开源产品,采用java开发,是一款灵活、高性能的web服务器&…

大学生游戏静态HTML网页设计-(北京冬奥会12页 带js 带视频 轮播图)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS:样式 在操作方面上运用了html5和css3, 采用…

stack容器、queue容器(20221116)

一、stack容器 1、基本概念 先进后出的数据结构,只有一个出口(栈顶)。 栈不允许有遍历行为,可以判断是否为空(empty),也可以知道其元素个数(size) 2、常用接口 构造函数: stac…

初始MySQL

目录 一、什么是数据库 二、SQL分类 三、库的操作 四、表的操作 五、数据类型 六、表的约束 什么是数据库 存储数据用文件就可以了,为什么还要有数据库? 文件保存数据有以下几个缺点: 文件的安全性问题文件不利于数据查询和管理 文件…

电脑视频怎么录制?好用的电脑录屏方法

在日常使用电脑的时候,很多小伙伴经常会遇到需要录制电脑视频的时候。但网上各种眼花缭乱的电脑录屏方法,很多小伙伴看了表示自己根本没有学会。今天就给大家分享2个简单好用的电脑录屏方法,看完后轻松掌握电脑录屏。 一.使用Wind…

主成分分析法在图像压缩和重建中的应用研究-含Matlab代码

目录一、引言二、主成分分析法概念及性质2.1 概念2.2 性质三、计算步骤3.1 计算相关系数矩阵3.2 计算特征值与特征向量3.3 计算主成分贡献率及累计贡献率3.4 计算主成分载荷3.5 各主成分的得分四、图像压缩与重建实验分析五、参考文献六、Matlab代码获取一、引言 主成分分析法…

【附源码】Python计算机毕业设计网上购物平台

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…