如何使用Mac终端给树莓派pico构建C/C++程序进行开发,以及遇到各种问题该怎么处理,不使用任何IDE或编辑器(例如VS Code)

这篇具有很好参考价值的文章主要介绍了如何使用Mac终端给树莓派pico构建C/C++程序进行开发,以及遇到各种问题该怎么处理,不使用任何IDE或编辑器(例如VS Code)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写本文的原因是官方的教程已经过时了,如果你现在按照官方教程来在 Mac 上进行配置,那么会遇到一堆问题,比如我几乎把能踩的“雷”都踩了。所以这里记录了完整过程,以及各种错误的原因和处理方法,不然以后换 Mac 了或者在其他平台遇到同样的问题,忘记怎么处理的就头大了。

接下来先记录一下整体的安装流程,会介绍一些背景知识,对于一些会错误的地方会进行说明和解释。虽然文中对一些可能出现的错误进行了介绍,但是还是单独写了一篇博客进行整理,方便以后查阅:《为树莓派Pico配置交叉编译环境和工具链arm-none-eabi-gcc时可能会遇到的错误以及解决方案》

安装流程

下载 Raspberry Pi Pico SDK

Raspberry Pi Pico SDK 提供为基于 RP2040 的设备(如 Raspberry Pi Pico)编写 C/C++ 或汇编语言程序需要使用的使用的头文件、库和构建系统,这大大提升了开发效率。

这部分的方法可以和官方介绍的方法一样,但是如果你使用 HTTPS 克隆失败了很多次,那么建议使用 SSH 或者更新 Git 试试看,GitHub 在 HTTPS cloning errors 对这个问题有简单的介绍。所以这里两种地址都列出来:

# 使用https
git clone https://github.com/raspberrypi/pico-sdk.git --branch master
# 使用 SSH
git clone git@github.com:raspberrypi/pico-sdk.git --branch master

然后进入pico-sdk目录,初始化引用的子模块:

$ cd pico-sdk
$ git submodule update --init

这里可能需要等待很长时间,而且经常会出现错误,比如加载失败、连接超时等,需要多试试看,因为都是 HTTPS 下载的,建议根据上文连接中的介绍进行诊断。这部分真的需要耐心!

配置 Raspberry Pi Pico SDK

接下来需要在环境变量PICO_SDK_PATH中记录pico-sdk的根地址,这样后面 CMake 就可以找到需要的一些库、头文件等一些工具。这需要在你的 Shell 配置文件里加上这么一句:

export PICO_SDK_PATH=~/Desktop/pico/pico-sdk

接下来你可以关闭终端再次打开,或者使用source来激活这个更改,比如:

$ source .bash_profile

后面配置其他工具时也需要类似的操作,如果你想进一步了解这步的知识,可以看我的另一篇博客:《macOS在终端上如何直接使用脚本或者下载的程序》。

此外,虽然这里还没提及 CMake,但是还有另一种方法,你还可以在CMakeLists.txt中的project(...)部分之前加上这句话也可以设置环境变量PICO_SDK_PATH

set(PICO_SDK_PATH ~/Desktop/pico/pico-sdk)

后面的路径用不用双引号包裹都行,一般不会出现解析错误,保险起见可以加。

这种方法的好处在于对不同项目可以设置不同的环境变量,你可以根据自己的需求进行选择。

安装 CMake

CMake 是一个构建、测试、打包的工具,可以生成make可以构建的makefile文件。这是因为make在所有类 Unix 都是自带的,但是makefile文件编写不是很容易。

这里我们直接使用brew进行安装即可:

brew install cmake

使用下面的命令查看版本来确认已经安装:

$ cmake --version
cmake version 3.27.1

CMake suite maintained and supported by Kitware (kitware.com/cmake).

(介绍CMake的博客还没写完,写完会贴个链接在这)

工具链

为什么需要工具链

在 Mac 上给树莓派 Pico 进行开发是需要交叉编译的。交叉编译就是在系统上编译另一种系统甚至另一个平台的程序,比如我是在 X86 架构的 macOS 上编译 Arm 架构 Linux 的可执行程序。为了实现这个目的需要一套工具来编译,比如目标系统、目标平台的编译器、库,这套工具就是常说的工具链(Toolchain)。因为本机上的编译器clang和库是给 macOS 编译程序的,编译出来的可执行程序是Mach-O executable格式,而不是 Linux 需要的格式。顺道一提,这里树莓派 Pico 需要导入的可执行程序格式为UF2 firmware image, family Raspberry Pi RP2040

下载工具链

给树莓派 Pico 进行交叉编译的工具链名为:arm-none-eabi-gcc,使用方法和gcc一样,但是一般很少直接使用 arm-none-eabi-gcc 进行编译,都是使用 CMake 进行安装。

需要注意的是,下载工具链不要直接使用brew下载。因为brew安装的版本可能是不是树莓派 Pico 对应的版本或者配置错误,这样会导致一些错误。比如当前brew下载的版本只有 200MB,而官网的版本有 845MB,如果使用brew下载的版本,那么虽然也是 12.3 版本,cmake构建也没有问题,但是到make这步的时候就会显示以下错误:

-- Build files have been written to: /shared/pico-setup/pico/pico-examples/build/elf2uf2
[  0%] Performing build step for 'ELF2UF2Build'
Scanning dependencies of target elf2uf2
[ 50%] Building CXX object CMakeFiles/elf2uf2.dir/main.cpp.o
[100%] Linking CXX executable elf2uf2
[100%] Built target elf2uf2
[  0%] No install step for 'ELF2UF2Build'
[  0%] Completed 'ELF2UF2Build'
[  0%] Built target ELF2UF2Build

这时候用下面的命令卸载、清理掉brew安装的内容:

# 卸载arm-none-eabi-gcc
$ brew uninstall arm-none-eabi-gcc
# 清理掉一些下载文件
$ brew cleanup arm-none-eabi-gcc
# brew默认将二进制文件安装到/usr/local/bin/目录下,虽然前面卸载了,但是可能会有一些残留,手动删一下
$ sudo rm /usr/local/bin/arm-none-eabi-*

这时候再从官网下载即可。

进入 Arm GNU Toolchain Downloads,用页面搜索功能搜一下“macOS”,因为链接太多了。你会看到光是在 macOS 下面就有这么多链接:

如何使用Mac终端给树莓派pico构建C/C++程序进行开发,以及遇到各种问题该怎么处理,不使用任何IDE或编辑器(例如VS Code),软件/程序教程,树莓派 pico,交叉编译,C/C++

选择你对应平台(就是处理器架构)的AArch32 bare-metal target (arm-none-eabi)中的链接点击下载。选择AArch32因为树莓派 Pico 的微控制器 RP2040 包含的 Arm Cortex M0 是 32 位的,也就是AArch32,如果你下成AArch64 bare-metal target (aarch64-none-elf)是没法编译的。

安装工具链

如果你下载的是 tar.xz 格式的,那么使用下面的指令将其解压:

$ tar xvf arm-gnu-toolchain-版本号-darwin-arm64-arm-none-eabi.tar.xz

然后将其放在一个你喜欢但是不经常动的位置。

如果你下载的是 PKG 格式的,那么安装之后会放在“应用程序”目录/Applications/下,如下:

如何使用Mac终端给树莓派pico构建C/C++程序进行开发,以及遇到各种问题该怎么处理,不使用任何IDE或编辑器(例如VS Code),软件/程序教程,树莓派 pico,交叉编译,C/C++

这时候这个目录的绝对地址就是/Applications/ArmGNUToolchain/

配置工具链

接下来要像之前一样配置一下工具链,好让cmake构建的时候找到需要的编译器、汇编器等工具以及库。

配置方法是在环境变量PATH中添加上arm-none-eabi的二进制目录,这样就可以使用里面的工具了。

如果是使用 PKG 安装的,那么在 Shell 配置文件中添加如下语句(版本不同可以略有变化):

export PATH="$PATH:/Applications/ArmGNUToolchain/版本号/arm-none-eabi/bin"

如果你是下载的 tar.xz,那么在 Shell 配置文件中添加如下语句(版本不同可以略有变化):

export PATH="$PATH:~/arm-gnu-toolchain-12.3.rel1-darwin-arm64-arm-none-eabi/bin"

~/arm-gnu-toolchain-12.3.rel1-darwin-arm64-arm-none-eabi是你之前下载解压好之后放的位置,选择里面第一层的bin目录,该目录应该包含 C/C++ 的编译器arm-none-eabi-gccarm-none-eabi-g++,内容大致如下:

如何使用Mac终端给树莓派pico构建C/C++程序进行开发,以及遇到各种问题该怎么处理,不使用任何IDE或编辑器(例如VS Code),软件/程序教程,树莓派 pico,交叉编译,C/C++

不要选择arm-none-eabi里的bin

如果你完成了以上步骤,那么就可以为树莓派 Pico 进行交叉编译了。

构建项目

这里我们使用一个自制的例子和官方例子 pico-examples 来介绍一下构建项目中的一些命令。

首先新建一个pico目录来存放这些例子,并且进入该命令:

$ mkdir pico
$ cd pico

简单的例子

接下来介绍简单的自制例子。按照以下命令新建一个目录blink,然后在里面新建一些文件和目录:

# 新建一个`blink`目录并进入
$ mkdir blink
$ cd blink
# 创建两个空白文件 blink.c 和 CMakeLists.txt
$ touch blink.c CMakeLists.txt
# 将 pico-sdk 项目中的 pico_sdk_import.cmake 文件复制到当前目录下
# 如果你之前没有设置PICO_SDK_PATH,那么就使用你的pico-sdk路径
$ cp $PICO_SDK_PATH/external/pico_sdk_import.cmake .

然后在blink.c文件中输入以下内容,这些编译后会让树莓派 Pico 上的 LED 灯开始闪烁(如果你的是 Pico W,那么不要使用下面的代码):

#include "pico/stdlib.h"

const uint LED_PIN = 25;

int main() {

	gpio_init(LED_PIN);
	gpio_set_dir(LED_PIN, GPIO_OUT);
	gpio_put(LED_PIN, 0);
	
	while (true) {
		gpio_put(LED_PIN, 1);
		sleep_ms(250);
		gpio_put(LED_PIN, 0);
		sleep_ms(250);
	}
}

如果你的是 Pico W,那么使用下面的代码,而不是上面的,这是因为 Pico W 的板载 LED 没有连接到 RP2040 上,而是连接到无线芯片的 GPIO 上了,这就导致上面使用的25引脚是 Wi-Fi 而不是 LED,这种情况下使用的代码如下:

#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"

int main() {
    stdio_init_all();
    if (cyw43_arch_init()) {
        printf("Wi-Fi init failed");
        return -1;
    }
    while (true) {
        cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, 1);
        sleep_ms(250);
        cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, 0);
        sleep_ms(250);
    }
}

CMakeLists.txt文件中输入以下内容:

cmake_minimum_required(VERSION 3.17)

include(pico_sdk_import.cmake)

# 这两个是设置目标系统和目标平台的,如果不加这两句也行,但是第一次运行 cmake 构建时会需要较长时间寻找合适的编译器,后面再构建就没区别了
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

project(blink)

pico_sdk_init()


add_executable(blink 
blink.c
)

target_link_libraries(blink pico_stdlib)

pico_add_extra_outputs(blink)

这时候新建一个名为build的目录来存放构建后的内容,然后进入。

$ mkdir build
$ cd build

这是一个良好的构建项目的习惯,因为会很方便清理一些构建后的文件,也是cmake的惯例。

然后使用以下命令进行构建:

$ cmake ..
$ make -j4

如果在构建过程中出现任何错误,都建议完全清空build目录,再进行下次构建!

这里你可能会好奇为什么使用make -j4这个命令,而不是直接使用make。其实两个都可以,但是推荐使用选项-j4,原因在“pico-examples”部分会有说明。

构建成功会显示以下内容:

如何使用Mac终端给树莓派pico构建C/C++程序进行开发,以及遇到各种问题该怎么处理,不使用任何IDE或编辑器(例如VS Code),软件/程序教程,树莓派 pico,交叉编译,C/C++

而此时的build目录下内容如下:

如何使用Mac终端给树莓派pico构建C/C++程序进行开发,以及遇到各种问题该怎么处理,不使用任何IDE或编辑器(例如VS Code),软件/程序教程,树莓派 pico,交叉编译,C/C++

这时候先继续讲如何构建 pico-examples,如果你想马上知道如何导入可以跳到后面。

pico-examples

回到pico目录下:

$ cd ../..

首先下载 pico-examples:

# 用 https
$ git clone https://github.com/raspberrypi/pico-examples.git
# 用 SSH
$ git clone git@github.com:raspberrypi/pico-examples.git

同样进入pico-examples目录,然后新建build目录,在进入其中:

$ cd pico-examples
$ mkdir build
$ cd build

然后就像简单的例子一样使用下面的命令来构建所有的项目:

$ cmake ..
$ make -j4

为什么make要使用选项-j

这里解释一下为什么使用make -j4而不是make

  • 选项-j4意思是“同时运行 4 个任务或者命令”,如果直接使用make可能会出现fatal error: cannot read spec file ‘nosys.specs’: No such file or directory的错误,也就是一个好了得等另外一个。
  • 不过使用-j4的主要目的是为了加快构建速度。

二者的速度差距有多少呢?我进行了测试,可以看到实际花费的时间(real)减少到三分之一左右,你可以自己尝试看看。
如何使用Mac终端给树莓派pico构建C/C++程序进行开发,以及遇到各种问题该怎么处理,不使用任何IDE或编辑器(例如VS Code),软件/程序教程,树莓派 pico,交叉编译,C/C++

这是因为-j4利用了更多的进程,而更多的进程意味着更多的线程。这样可以提升 CPU 的利用率和降低程序运行时间,所以你可以看到使用使用-j4的用户使用 CPU 时间(user)和系统使用 CPU 时间(sys)都要高于不使用-j4的情况。

这里的4可以根据你的处理器线程数进行调整,由于这个任务的 CPU 利用率很高,阻塞、睡眠的情况少,所以上限大概就是你的线程数,更高的值带来的提升比较少。但是4的个很不错的选择,因为:

  1. 如果尝试过多线程编程就知道,4线程是一个拐点,很多任务超过4之后线程数带来的性能提升曲线会放缓,之前增加一个线程带来的提升可能需要增加两到三个线程才能达到。
  2. 很多处理器可以同时运行的线程数还是不太够,而4是很多机器能接受的。

如果你拥有一个核心很多的处理器,可以试试看设置为最高的速度,用time make -jxx测试一下时间,如果可以的话评论留言让我记录一下哦。

导入编译好后的二进制文件

导入的方法很简单,首先拔下来你的树莓派 Pico,然后按住树莓派上的白色按钮“BOOTSEl”,如下:

如何使用Mac终端给树莓派pico构建C/C++程序进行开发,以及遇到各种问题该怎么处理,不使用任何IDE或编辑器(例如VS Code),软件/程序教程,树莓派 pico,交叉编译,C/C++

然后插上线连接到 Mac 上。这样树莓派 Pico 会进入 USB 大容量存储模式。

这时就会发现出现了这样的一个 USB 存储装置:

如何使用Mac终端给树莓派pico构建C/C++程序进行开发,以及遇到各种问题该怎么处理,不使用任何IDE或编辑器(例如VS Code),软件/程序教程,树莓派 pico,交叉编译,C/C++

然后将我们之前构建好的项目中的.uf2文件拖入这里即可。拖入后会显示“磁盘没有正常推出”,对此不要紧张,是正常的。

如果将一开始blink项目中的blink.uf2拖入,那么就可以看到树莓派 Pico 上的 LED 开始闪烁了。强调一点,如果你之前使用 MicroPython 进行编程,后面还要的话那么需要重新安装MicroPython,因为导入的文件会替换之前有的 MicroPython。

断开再次插上也会继续闪烁,如果你想重置树莓派 Pico 来让他別闪了,那么再次断开按住按钮进入 USB 存储模式就会重置清空之前的二进制文件。但是也可能会出现外围设备重置失败的情况,那么就用我另外一篇博客的办法写个程序进行重置:《如何重置树莓派 Pico(重置外围设备失败)》

最后,关于构建中还可能会出现一些问题,这些问题我会单独开一篇来进行整理(已将链接贴到开头了)。

希望能帮到有需要的人~文章来源地址https://www.toymoban.com/news/detail-637767.html

到了这里,关于如何使用Mac终端给树莓派pico构建C/C++程序进行开发,以及遇到各种问题该怎么处理,不使用任何IDE或编辑器(例如VS Code)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mac如何在终端使用diskutil命令装载和卸载推出外接硬盘

    最近用 macOS 装载外接硬盘的时候,使用 mount 死活装不上,很多文章也没详细的讲各种情况,所以就写一篇博客来记录一下。 mount 和 umount 是在 macOS 上是不能用的,如果使用会显示未知特殊文件或者没有权限,如下: 如果给 umount 加上 sudo 就会显示 Resource busy ,提示使用 di

    2024年02月15日
    浏览(31)
  • 树莓派Pico W无线WiFi开发板使用方法及MicroPython网络编程实践

    树莓派Pico W开发板是树莓派基金会于2022年6月底推出的一款无线WiFi开发板,它支持C/C++和MicroPython编程。本文介绍树莓派Pico W无线WiFi开发板的使用方法及MicroPython编程示例,包括树莓派Pico W开发板板载LED使用及控制编程示例,Pico W开发板用作WiFi无线HTTP网络服务器的MicroPython编

    2023年04月12日
    浏览(22)
  • Mac OS下 使用 osascript 指令,执行完可执行程序后,关闭当前已结束的终端(Terminal)窗口)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 最近在工作中需要使用shell 脚本的可执行程序,在shell里调用完成一些其他功能。Mac os下 执行的时候是调用终端(Terminal)。执行完成后会有一个已结束终端进程界面,一直在桌面显示,每次都需要手动

    2024年02月11日
    浏览(21)
  • 前端开发框架React技术如何与小程序结合,进行页面构建

    前端开发框架 React 可以通过小程序提供的开发工具和 API 进行结合。 例如使用小程序提供的 WebView 组件来加载前端框架的页面。 或者使用小程序提供的组件和 API 来实现前端框架的功能。 同时,也可以通过小程序提供的云开发功能来实现前端框架与后端数据的交互。 可以通

    2024年02月09日
    浏览(19)
  • 使用树莓派Pico、DHT11和SSD1306搭建一个温度湿度计(只使用官方库,以及官方案例代码的错误之处和解决方案)

    最近想树莓派 Pico、DHT11 温湿度传感器和 SSD1306 OLED 屏幕做一个温度湿度计,树莓派官方案例也分别有这两个设备的案例,我就想做个简单的温度湿度计作为学习微控制器的开始,结果遇到了一个大坑,所以写本文记录一下整个过程。 本文最后会实现一个能在 SSD1306 OLED 屏幕上

    2024年02月11日
    浏览(17)
  • 树莓派pico做鼠标与键盘

    参考 键盘检测网站 学习网站(重要) 学习网站 寻求帮助---------- help(func) 查看支持的按键----- import board dir(board) 法一为发送指定数据(终端函数调用) 最终成品为按键发送,GP19与GP20分别接按键,按下后分别打印出a,b(可自定义) 鼠标为按键控制(也可终端控制),按下按键

    2024年02月10日
    浏览(19)
  • RPI pico(树莓派 pico RP2040微控制器) 教程1:刷固件

       树莓派pico搭载了两个ARM Cortex-M0+内核最高频率133MHz、 264KB的内部RAM、DMA控制器,支持挂最高达16MB的片外Flash。它有30个GPIO,4个可以作为模拟输入。外设包含2个UART、2个SPI、2个I2C、16个PWM通道以及一个USB1.1控制器。树莓派pico支持c/c++和 python两种编程方式, 我们这里使用p

    2024年02月13日
    浏览(35)
  • 如何用树莓派Pico针对IoT编程?

    目录 一、Raspberry Pi Pico 系列和功能 二、Raspberry Pi Pico 的替代方案 三、对 Raspberry Pi Pico 进行编程 硬件 软件 第 1 步:连接计算机 第 2 步:在 Pico 上安装 MicroPython 第 3 步:为 Thonny 设置解释器 第 4 步:编写程序 第5步:运行程序 四、小结 众所周知,Raspberry Pi(树莓

    2024年02月12日
    浏览(16)
  • 如何在Win11系统中使用ubuntu(WSL)终端编译 Rust 程序

    参考微软提供的官方指南 在管理员模式下打开 PowerShell 或 Windows 命令提示符,方法是右键单击并选择“以管理员身份运行”,输入 wsl --install 命令,然后重启计算机。 从windows store 中下载安装 打开文件资源管理器,打开左侧的Linux文件夹,定位到 etc/apt/ 目录,将 sources.list

    2024年02月20日
    浏览(18)
  • 编译Micropython固件For树莓派Raspberry Pi Pico

    1. 前言 由于想把自己编写的py文件打包的固件中,所以记录下如何编译micropython固件和打包。 2. 编译 最简单的方式就是在你的树莓派上进行,我用的是RP Pi2 下载所需文件: 更新子模块 更新编译工具 准备编译 编译最终文件存放在 3. 打包py文件 将需要打包的py文件放在 然后在

    2024年02月10日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包