网站根目录权限设置,优秀的响应式网站,设计一个小程序需要多少钱,典型网站建设实例精讲写本文的原因是官方的教程已经过时了#xff0c;如果你现在按照官方教程来在 Mac 上进行配置#xff0c;那么会遇到一堆问题#xff0c;比如我几乎把能踩的“雷”都踩了。所以这里记录了完整过程#xff0c;以及各种错误的原因和处理方法#xff0c;不然以后换 Mac 了或者…写本文的原因是官方的教程已经过时了如果你现在按照官方教程来在 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 gitgithub.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.1CMake 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 下面就有这么多链接 选择你对应平台就是处理器架构的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/下如下 这时候这个目录的绝对地址就是/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-gcc和arm-none-eabi-g内容大致如下 不要选择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 灯开始闪烁
#include pico/stdlib.hconst 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);}
}在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”部分会有说明。
构建成功会显示以下内容 而此时的build目录下内容如下 这时候先继续讲如何构建 pico-examples如果你想马上知道如何导入可以跳到后面。
pico-examples
回到pico目录下
$ cd ../..首先下载 pico-examples
# 用 https
$ git clone https://github.com/raspberrypi/pico-examples.git
# 用 SSH
$ git clone gitgithub.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减少到三分之一左右你可以自己尝试看看。
这是因为-j4利用了更多的进程而更多的进程意味着更多的线程。这样可以提升 CPU 的利用率和降低程序运行时间所以你可以看到使用使用-j4的用户使用 CPU 时间user和系统使用 CPU 时间sys都要高于不使用-j4的情况。
这里的4可以根据你的处理器线程数进行调整由于这个任务的 CPU 利用率很高阻塞、睡眠的情况少所以上限大概就是你的线程数更高的值带来的提升比较少。但是4的个很不错的选择因为
如果尝试过多线程编程就知道4线程是一个拐点很多任务超过4之后线程数带来的性能提升曲线会放缓之前增加一个线程带来的提升可能需要增加两到三个线程才能达到。很多处理器可以同时运行的线程数还是不太够而4是很多机器能接受的。
如果你拥有一个核心很多的处理器可以试试看设置为最高的速度用time make -jxx测试一下时间如果可以的话评论留言让我记录一下哦。
导入编译好后的二进制文件
导入的方法很简单首先拔下来你的树莓派 Pico然后按住树莓派上的白色按钮“BOOTSEl”如下 然后插上线连接到 Mac 上。这样树莓派 Pico 会进入 USB 大容量存储模式。
这时就会发现出现了这样的一个 USB 存储装置 然后将我们之前构建好的项目中的.uf2文件拖入这里即可。拖入后会显示“磁盘没有正常推出”对此不要紧张是正常的。
如果将一开始blink项目中的blink.uf2拖入那么就可以看到树莓派 Pico 上的 LED 开始闪烁了。
断开再次插上也会继续闪烁如果你想重置树莓派 Pico 来让他別闪了那么再次断开按住按钮进入 USB 存储模式就会重置清空之前的二进制文件。
最后关于构建中还可能会出现一些问题这些问题我会单独开一篇来进行整理已将链接贴到开头了。
希望能帮到有需要的人