{"id":45392,"date":"2023-06-04T00:56:37","date_gmt":"2024-03-10T16:01:03","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/45392-2\/"},"modified":"2024-04-30T07:14:11","modified_gmt":"2024-04-29T23:14:11","slug":"45392-2","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/45392-2\/","title":{"rendered":""},"content":{"rendered":"<h2>3\u884c\u307e\u3068\u3081<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Rust\u3067\u3082ESP32\u306e\u30d5\u30a1\u30fc\u30e0\u30a6\u30a7\u30a2\u3092\u958b\u767a\u3067\u304d\u308b\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">LLVM\u3001clang\u3001rustc\u306e\u30b3\u30f3\u30d1\u30a4\u30eb\u306f\u306a\u304b\u306a\u304b\u5927\u5909\u3002\uff08\u6642\u9593\u7684\u306a\u610f\u5473\u3067\uff09<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u7d44\u307f\u8fbc\u307fRust\u306b\u672a\u6765\u3092\u611f\u3058\u308b\u3002<\/ul>\n<h2>1. \u6982\u8981<\/h2>\n<p>\u6280\u8853\u66f8\u51787\u3067\u9812\u5e03\u3055\u308c\u3066\u3044\u305f\u300eM5Stack\u3067\u59cb\u3081\u308b\u7d44\u307f\u8fbc\u307fRust\u300f\u3068\u3044\u3046\u6280\u8853\u540c\u4eba\u8a8c\u3092\u8aad\u307f\u307e\u3057\u305f\u3002<br \/>\n\u4ee5\u524d\u3088\u308a\u30de\u30a4\u30b3\u30f3\u3092\u4f7f\u3063\u305f\u96fb\u5b50\u5de5\u4f5c\u3092\u884c\u3063\u3066\u304a\u308a\u3001\u7d44\u307f\u8fbc\u307f\u9818\u57df\u3067\u3082Rust\u3092\u4f7f\u3063\u3066\u307f\u305f\u3044\u3068\u601d\u3063\u3066\u3044\u307e\u3057\u305f\u304c\u3001\u305d\u308c\u306a\u308a\u306b\u74b0\u5883\u304c\u6574\u3063\u305f\u307f\u305f\u3044\u306a\u306e\u3067\u8a66\u3057\u3066\u307f\u308b\u3053\u3068\u306b\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>\u7d50\u8ad6\u304b\u3089\u8a00\u3048\u3070\u3001\u7121\u4e8b\u306bRust\u304b\u3089\u30b7\u30ea\u30a2\u30eb\u30b3\u30f3\u30bd\u30fc\u30eb\u306b\u300cHello world!\u300d\u306e\u6587\u5b57\u3092\u51fa\u529b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3057\u305f\u3002<\/p>\n<h2>2. \u74b0\u5883<\/h2>\n<p>\u691c\u8a3c\u306b\u7528\u3044\u305f\u74b0\u5883\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">OS: macOS Mojave 10.14.6 (18G103)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Docker CE: 19.03.2<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">llvm-xtensa: 757e18f722dbdcd98b8479e25041b1eee1128ce9<\/ul>\n<\/li>\n<\/ul>\n<p>clang-xtensa: 248d9ce8765248d953c3e5ef4022fb350bbe6c51<\/p>\n<p>rust-xtensa: b365cff41a60df8fd5f1237ef71897edad0375dd<\/p>\n<p>\u30dc\u30fc\u30c9: \u4e2d\u56fd\u306e\u30b5\u30a4\u30c8\u3067\u8cfc\u5165\u3057\u305fWROOM-32\u958b\u767a\u30dc\u30fc\u30c9<\/p>\n<pre class=\"post-pre\"><code>mac$ sw_vers\r\nProductName:    Mac OS X\r\nProductVersion: 10.14.6\r\nBuildVersion:   18G103\r\n\r\nmac$ docker version\r\nClient: Docker Engine - Community\r\n Version:           19.03.2\r\n API version:       1.40\r\n Go version:        go1.12.8\r\n Git commit:        6a30dfc\r\n Built:             Thu Aug 29 05:26:49 2019\r\n OS\/Arch:           darwin\/amd64\r\n Experimental:      false\r\n\r\nServer: Docker Engine - Community\r\n Engine:\r\n  Version:          19.03.2\r\n  API version:      1.40 (minimum version 1.12)\r\n  Go version:       go1.12.8\r\n  Git commit:       6a30dfc\r\n  Built:            Thu Aug 29 05:32:21 2019\r\n  OS\/Arch:          linux\/amd64\r\n  Experimental:     false\r\n containerd:\r\n  Version:          v1.2.6\r\n  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb\r\n runc:\r\n  Version:          1.0.0-rc8\r\n  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f\r\n docker-init:\r\n  Version:          0.18.0\r\n  GitCommit:        fec3683\r\n<\/code><\/pre>\n<h2>3. ESP32\u306b\u3064\u3044\u3066<\/h2>\n<p>ESP32\u306f\u3001\u500b\u4eba\u306e\u96fb\u5b50\u5de5\u4f5c\u3067\u3082\u983b\u7e41\u306b\u7528\u3044\u3089\u308c\u308b\u5b89\u4fa1\u304b\u3064\u591a\u6a5f\u80fd\u306a\u30de\u30a4\u30b3\u30f3\uff08\u30de\u30a4\u30af\u30ed\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\uff09\u3067\u3059\u3002<br \/>\n\u901a\u5e38\u306fESP32\u7cfb\u30c1\u30c3\u30d7\u304c\u5185\u8535\u3055\u308c\u305fWROOM-32\u30e2\u30b8\u30e5\u30fc\u30eb\u3068\u3044\u3046\u5f62\u3067\u4f7f\u308f\u308c\u308b\u3053\u3068\u304c\u591a\u304f\u3001Wi-Fi\u3001Bluetooth\u306a\u3069\u3092\u5185\u8535\u3057\u3066\u3044\u307e\u3059\u3002\u3044\u308f\u3086\u308b\u300c\u6280\u9069\u300d\u306e\u8a8d\u5b9a\u3082\u884c\u308f\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u65e5\u672c\u56fd\u5185\u3067\u3082\u554f\u984c\u306a\u304f\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>ESP32\u306e\u30b3\u30a2\uff08CPU\uff09\u306f\u3001Tensilica\u793e\u306eXtensa LX6\u3067\u3042\u308a\u3001\u7d44\u307f\u8fbc\u307f\u5206\u91ce\u3067\u306e\u63a1\u7528\u304c\u591a\u3044ARM\u7cfb\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002<br \/>\nESP32\u306e\u958b\u767a\u5143\u3067\u3042\u308b\u4e2d\u56fdEspressif Systems\u793e\u304cRust\u306e\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u3067\u3042\u308bLLVM\u306eXtensa\u30b5\u30dd\u30fc\u30c8\u3092\u516c\u958b\u3057\u305f\u3053\u3068\u306b\u3088\u308a\u3001ESP32\u4e0a\u3067Rust\u3092\u52d5\u304b\u3059\u9053\u304c\u958b\u304b\u308c\u307e\u3057\u305f\u3002<\/p>\n<h2>4. LLVM\u3001clang\u3001rustc\u306e\u30d3\u30eb\u30c9<\/h2>\n<p>ESP32\u4e0a\u3067\u306f\u5f53\u7136\u30bb\u30eb\u30d5\u30d3\u30eb\u30c9\u306a\u3069\u306f\u884c\u3048\u306a\u3044\u305f\u3081\u3001x86_64\u74b0\u5883\u306e\u30db\u30b9\u30c8\u3067\u30af\u30ed\u30b9\u30d3\u30eb\u30c9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<br \/>\n\u305d\u306e\u305f\u3081\u306b\u3001Xtensa\u5411\u3051\u306eLLVM\u3001clang\u3001rustc\u3092\u30d3\u30eb\u30c9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u624b\u9806\u306f\u524d\u8ff0\u306e\u66f8\u7c4d\u306b\u8a73\u3057\u3044\u3067\u3059\u304c\u3001\u5c11\u3005\u7169\u96d1\u306a\u305f\u3081Dockerfile\u3092\u7528\u610f\u3057\u307e\u3057\u305f\u3002\u53c2\u8003\u306b\u3069\u3046\u305e\u3002<br \/>\n\u30de\u30eb\u30c1\u30b9\u30c6\u30fc\u30b8\u3001\u304b\u3064\u4e26\u5217\u30d3\u30eb\u30c9\u3092\u884c\u3044\u307e\u3059\u306e\u3067\u3001\u305d\u308c\u3089\u306b\u5bfe\u5fdc\u3057\u305f\u30d0\u30fc\u30b8\u30e7\u30f3\u306eDocker\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\">#<\/span>\r\n<span class=\"c\"># A stage for preparing to fetch data from Git and URL.<\/span>\r\n<span class=\"c\">#<\/span>\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> ubuntu:18.04 AS ubuntu-for-fetch<\/span>\r\n\r\n<span class=\"k\">RUN <\/span>apt-get update <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"nv\">DEBIAN_FRONTEND<\/span><span class=\"o\">=<\/span>noninteractive apt-get <span class=\"nb\">install<\/span> <span class=\"nt\">--yes<\/span> <span class=\"nt\">--no-install-recommends<\/span> <span class=\"se\">\\\r\n<\/span>    ca-certificates <span class=\"se\">\\\r\n<\/span>    curl <span class=\"se\">\\\r\n<\/span>    git-core <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">rm<\/span> <span class=\"nt\">--recursive<\/span> <span class=\"nt\">--force<\/span> \/var\/lib\/apt\/lists\/<span class=\"k\">*<\/span>\r\n\r\n<span class=\"c\">#<\/span>\r\n<span class=\"c\"># A stage fetching llvm-xtensa.<\/span>\r\n<span class=\"c\">#<\/span>\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> ubuntu-for-fetch AS fetch-llvm-xtensa<\/span>\r\n\r\n<span class=\"k\">RUN <\/span>git clone https:\/\/github.com\/espressif\/llvm-xtensa.git \/root\/repo\/llvm-xtensa <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">cd<\/span> \/root\/repo\/llvm-xtensa\/ <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> git checkout 757e18f722dbdcd98b8479e25041b1eee1128ce9\r\n\r\n<span class=\"c\">#<\/span>\r\n<span class=\"c\"># A stage fetching clang-xtensa.<\/span>\r\n<span class=\"c\">#<\/span>\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> ubuntu-for-fetch AS fetch-clang-xtensa<\/span>\r\n\r\n<span class=\"k\">RUN <\/span>git clone https:\/\/github.com\/espressif\/clang-xtensa.git \/root\/repo\/clang-xtensa <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">cd<\/span> \/root\/repo\/clang-xtensa\/ <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> git checkout 248d9ce8765248d953c3e5ef4022fb350bbe6c51\r\n\r\n<span class=\"c\">#<\/span>\r\n<span class=\"c\"># A stage fetching rust-xtensa.<\/span>\r\n<span class=\"c\">#<\/span>\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> ubuntu-for-fetch AS fetch-rust-xtensa<\/span>\r\n\r\n<span class=\"k\">RUN <\/span>git clone https:\/\/github.com\/MabezDev\/rust-xtensa.git \/root\/repo\/rust-xtensa <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">cd<\/span> \/root\/repo\/rust-xtensa\/ <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> git checkout b365cff41a60df8fd5f1237ef71897edad0375dd\r\n\r\n<span class=\"c\">#<\/span>\r\n<span class=\"c\"># A stage fetching esp-idf.<\/span>\r\n<span class=\"c\">#<\/span>\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> ubuntu-for-fetch AS fetch-esp-idf<\/span>\r\n\r\n<span class=\"k\">RUN <\/span><span class=\"nv\">ARCHIVE_NAME<\/span><span class=\"o\">=<\/span>xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> curl <span class=\"nt\">-o<\/span> \/root\/<span class=\"k\">${<\/span><span class=\"nv\">ARCHIVE_NAME<\/span><span class=\"k\">}<\/span> https:\/\/dl.espressif.com\/dl\/<span class=\"k\">${<\/span><span class=\"nv\">ARCHIVE_NAME<\/span><span class=\"k\">}<\/span> <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">tar <\/span>zxfv \/root\/<span class=\"k\">${<\/span><span class=\"nv\">ARCHIVE_NAME<\/span><span class=\"k\">}<\/span> <span class=\"nt\">-C<\/span> \/opt <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">rm<\/span> \/root\/<span class=\"k\">${<\/span><span class=\"nv\">ARCHIVE_NAME<\/span><span class=\"k\">}<\/span>\r\n<span class=\"k\">RUN <\/span>git clone <span class=\"nt\">--branch<\/span> v3.3 <span class=\"nt\">--depth<\/span> 1 https:\/\/github.com\/espressif\/esp-idf.git \/opt\/esp-idf <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">rm<\/span> <span class=\"nt\">--recursive<\/span> <span class=\"nt\">--force<\/span> \/opt\/esp-idf\/.git\r\n\r\n<span class=\"c\">#<\/span>\r\n<span class=\"c\"># A stage building llvm-xtensa.<\/span>\r\n<span class=\"c\">#<\/span>\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> ubuntu:18.04 AS build-llvm-xtensa<\/span>\r\n\r\n<span class=\"k\">RUN <\/span>apt-get update <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"nv\">DEBIAN_FRONTEND<\/span><span class=\"o\">=<\/span>noninteractive apt-get <span class=\"nb\">install<\/span> <span class=\"nt\">--yes<\/span> <span class=\"nt\">--no-install-recommends<\/span> <span class=\"se\">\\\r\n<\/span>    build-essential <span class=\"se\">\\\r\n<\/span>    ca-certificates <span class=\"se\">\\\r\n<\/span>    cmake <span class=\"se\">\\\r\n<\/span>    curl <span class=\"se\">\\\r\n<\/span>    git-core <span class=\"se\">\\\r\n<\/span>    ninja-build <span class=\"se\">\\\r\n<\/span>    python <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">rm<\/span> <span class=\"nt\">--recursive<\/span> <span class=\"nt\">--force<\/span> \/var\/lib\/apt\/lists\/<span class=\"k\">*<\/span>\r\n\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> --from=fetch-llvm-xtensa \/root\/repo\/llvm-xtensa \/root\/repo\/llvm-xtensa<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> --from=fetch-clang-xtensa \/root\/repo\/clang-xtensa \/root\/repo\/llvm-xtensa\/tools\/clang<\/span>\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">mkdir<\/span> <span class=\"nt\">--parents<\/span> \/root\/build\/llvm-xtensa <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">cd<\/span> \/root\/build\/llvm-xtensa\/ <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> cmake <span class=\"se\">\\\r\n<\/span>    <span class=\"nt\">-D<\/span> <span class=\"nv\">CMAKE_INSTALL_PREFIX<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"\/opt\/llvm-xtensa\"<\/span> <span class=\"se\">\\\r\n<\/span>    <span class=\"nt\">-D<\/span> <span class=\"nv\">CMAKE_BUILD_TYPE<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"Release\"<\/span> <span class=\"se\">\\\r\n<\/span>    <span class=\"nt\">-D<\/span> <span class=\"nv\">LLVM_TARGETS_TO_BUILD<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"X86;Xtensa\"<\/span> <span class=\"se\">\\\r\n<\/span>    <span class=\"nt\">-G<\/span> <span class=\"s2\">\"Ninja\"<\/span> <span class=\"se\">\\\r\n<\/span>    \/root\/repo\/llvm-xtensa <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> ninja <span class=\"nb\">install<\/span>\r\n\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> --from=fetch-rust-xtensa \/root\/repo\/rust-xtensa \/root\/repo\/rust-xtensa<\/span>\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">mkdir<\/span> <span class=\"nt\">--parents<\/span> \/opt\/rust-xtensa <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">cd<\/span> \/root\/repo\/rust-xtensa\/ <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> .\/configure <span class=\"se\">\\\r\n<\/span>    <span class=\"nt\">--llvm-root<\/span> \/root\/build\/llvm-xtensa <span class=\"se\">\\\r\n<\/span>    <span class=\"nt\">--prefix<\/span> \/opt\/rust-xtensa <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> .\/x.py build <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> .\/x.py <span class=\"nb\">install<\/span>\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">cp<\/span> <span class=\"nt\">--recursive<\/span> \/root\/repo\/rust-xtensa\/src \/opt\/rust-xtensa\r\n\r\n<span class=\"c\">#<\/span>\r\n<span class=\"c\"># A stage for development.<\/span>\r\n<span class=\"c\">#<\/span>\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> ubuntu:18.04 AS devel<\/span>\r\n\r\n<span class=\"k\">RUN <\/span>apt-get update <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"nv\">DEBIAN_FRONTEND<\/span><span class=\"o\">=<\/span>noninteractive apt-get <span class=\"nb\">install<\/span> <span class=\"nt\">--yes<\/span> <span class=\"nt\">--no-install-recommends<\/span> <span class=\"se\">\\\r\n<\/span>    bison <span class=\"se\">\\\r\n<\/span>    ca-certificates <span class=\"se\">\\\r\n<\/span>    curl <span class=\"se\">\\\r\n<\/span>    flex <span class=\"se\">\\\r\n<\/span>    gcc <span class=\"se\">\\\r\n<\/span>    git-core <span class=\"se\">\\\r\n<\/span>    gperf <span class=\"se\">\\\r\n<\/span>    libncurses-dev <span class=\"se\">\\\r\n<\/span>    make <span class=\"se\">\\\r\n<\/span>    python <span class=\"se\">\\\r\n<\/span>    python-cryptography <span class=\"se\">\\\r\n<\/span>    python-future <span class=\"se\">\\\r\n<\/span>    python-pip <span class=\"se\">\\\r\n<\/span>    python-pyparsing <span class=\"se\">\\\r\n<\/span>    python-serial <span class=\"se\">\\\r\n<\/span>    python-setuptools <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">rm<\/span> <span class=\"nt\">--recursive<\/span> <span class=\"nt\">--force<\/span> \/var\/lib\/apt\/lists\/<span class=\"k\">*<\/span>\r\n\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> --from=build-llvm-xtensa \/opt\/rust-xtensa \/opt\/rust-xtensa<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> --from=fetch-esp-idf \/opt\/xtensa-esp32-elf \/opt\/xtensa-esp32-elf<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> --from=fetch-esp-idf \/opt\/esp-idf \/opt\/esp-idf<\/span>\r\n\r\n<span class=\"k\">SHELL<\/span><span class=\"s\"> [\"\/bin\/bash\", \"-c\"]<\/span>\r\n<span class=\"k\">RUN <\/span>curl <span class=\"nt\">--proto<\/span> <span class=\"s1\">'=https'<\/span> <span class=\"nt\">--tlsv1<\/span>.2 <span class=\"nt\">-sSf<\/span> https:\/\/sh.rustup.rs | sh <span class=\"nt\">-s<\/span> <span class=\"nt\">--<\/span> <span class=\"nt\">-y<\/span> <span class=\"nt\">--default-toolchain<\/span> stable <span class=\"nt\">--no-modify-path<\/span>\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">source<\/span> <span class=\"nv\">$HOME<\/span>\/.cargo\/env <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> rustup toolchain <span class=\"nb\">link <\/span>xtensa \/opt\/rust-xtensa <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> rustup default xtensa <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> rustup toolchain list\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">source<\/span> <span class=\"nv\">$HOME<\/span>\/.cargo\/env <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> cargo <span class=\"nb\">install <\/span>cargo-xbuild\r\n\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> PATH \/opt\/xtensa-esp32-elf\/bin:${PATH}<\/span>\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> IDF_PATH \/opt\/esp-idf<\/span>\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> XARGO_RUST_SRC \/opt\/rust-xtensa\/src<\/span>\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">echo<\/span> <span class=\"s1\">'source $HOME\/.cargo\/env'<\/span> <span class=\"o\">&gt;&gt;<\/span> ~\/.bashrc\r\n<\/code><\/pre>\n<p>\u4e0a\u8a18\u306eDockerfile\u306edevel\u30b9\u30c6\u30fc\u30b8\u3092\u4ee5\u4e0b\u306e\u624b\u9806\u3067\u30d3\u30eb\u30c9\u3057\u307e\u3059\u3002\u30d3\u30eb\u30c9\u306b\u306f30\u5206\u301c2\u6642\u9593\u307b\u3069\u639b\u304b\u308a\u307e\u3059\u306e\u3067\u6c17\u9577\u306b\u5f85\u3061\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre class=\"post-pre\"><code>mac$ DOCKER_BUILDKIT=1 docker image build \\\r\n  --target devel \\\r\n  --tag ${USER}\/rust-xtensa \\\r\n  rust-xtensa\r\n<\/code><\/pre>\n<p>\u672c\u5f53\u306f\u3059\u3079\u3066macOS\u74b0\u5883\u306b\u9589\u3058\u305f\u304b\u3063\u305f\u306e\u3067\u3059\u304c\u3001macOS\u4e0a\u306eDocker\u74b0\u5883\u3067\u306f\u3001\u306a\u305c\u304bLLVM\u306e\u30d3\u30eb\u30c9\u306e\u9014\u4e2d\u3067\u56fa\u307e\u3063\u3066\u3057\u307e\u3046\u305f\u3081\u3001\u4ed5\u65b9\u306a\u304f\u5225\u306eLinux\u74b0\u5883\u3067\u30d3\u30eb\u30c9\u3057\u3066Docker\u30a4\u30e1\u30fc\u30b8\u3092\u8ee2\u9001\u3057\u307e\u3057\u305f\u3002<\/p>\n<h2>5. \u300cHello world!\u300d\u306e\u30d3\u30eb\u30c9<\/h2>\n<p>\u4e0a\u8a18\u3067\u30d3\u30eb\u30c9\u3057\u305fDocker\u30a4\u30e1\u30fc\u30b8\u3092\u7528\u3044\u3001\u300cHello world!\u300d\u3092\u51fa\u529b\u3059\u308bRust\u30b3\u30fc\u30c9\u3092\u30d3\u30eb\u30c9\u3057\u307e\u3059\u3002<br \/>\n\u524d\u8ff0\u306e\u66f8\u7c4d\u306e\u30b3\u30fc\u30c9\u306fGitHub\u4e0a\u3067\u516c\u958b\u3055\u308c\u3066\u3044\u307e\u3059\u306e\u3067\u3001\u4eca\u56de\u306f\u305d\u3061\u3089\u3092\u305d\u306e\u307e\u307e\u4f7f\u3044\u307e\u3057\u305f\u3002<\/p>\n<pre class=\"post-pre\"><code>mac$ docker container run --interactive --tty --rm \\\r\n  --volume $(pwd):\/workspace \\\r\n  ${USER}\/rust-xtensa \\\r\n  \/bin\/bash\r\n\r\ndocker$ cd \/workspace\/\r\ndocker$ git clone https:\/\/github.com\/ciniml\/esp32-rust-examples.git\r\ndocker$ cd esp32-rust-examples\/hello_world\/\r\ndocker$ make defconfig\r\ndocker$ make\r\n<\/code><\/pre>\n<p>make -j4\u306e\u3088\u3046\u306b\u4e26\u5217\u30d3\u30eb\u30c9\u3092\u6709\u52b9\u306b\u3059\u308b\u3068\u30d3\u30eb\u30c9\u306b\u5931\u6557\u3059\u308b\u30b1\u30fc\u30b9\u304c\u3042\u3063\u305f\u305f\u3081\u3001\u4e0a\u8a18\u3067\u306f\u4e26\u5217\u306a\u3057\u3067\u30d3\u30eb\u30c9\u3057\u3066\u3044\u307e\u3059\u3002\u4e26\u5217\u30d3\u30eb\u30c9\u3059\u308b\u5834\u5408\u3082\u3001make\u30b3\u30de\u30f3\u30c9\u3092\u518d\u3073\u5b9f\u884c\u3059\u308b\u3068\u6210\u529f\u3059\u308b\u3053\u3068\u304c\u591a\u304b\u3063\u305f\u3067\u3059\u3002<\/p>\n<h2>6. ESP32\u3078\u306e\u8ee2\u9001<\/h2>\n<p>Docker for Mac\u306fUSB\u30c7\u30d0\u30a4\u30b9\u306e\u30de\u30a6\u30f3\u30c8\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u306a\u3044\u305f\u3081\u3001\u30d3\u30eb\u30c9\u3057\u305f\u30d5\u30a1\u30fc\u30e0\u30a6\u30a7\u30a2\u306e\u66f8\u304d\u8fbc\u307f\uff08\u8ee2\u9001\uff09\u306fmacOS\u4e0a\uff08Docker\u306e\u5916\u5074\uff09\u3067\u884c\u3044\u307e\u3057\u305f\u3002<\/p>\n<p>\u66f8\u304d\u8fbc\u307f\u5148\u30c7\u30d0\u30a4\u30b9\uff08\/dev\/tty.SLAB_USBtoUART\uff09\u306f\u30dc\u30fc\u30c9\uff08\u66f8\u304d\u8fbc\u307f\u88c5\u7f6e\uff09\u306b\u3088\u308a\u7570\u306a\u308a\u307e\u3059\u3002\u9069\u5b9c\u8abf\u6574\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code>mac$ pip install esptool\r\nmac$ cd esp32-rust-examples\/hello_world\/\r\nmac$ esptool.py \\\r\n  --chip esp32 \\\r\n  --port \/dev\/tty.SLAB_USBtoUART \\\r\n  --baud 115200 \\\r\n  --before default_reset \\\r\n  --after hard_reset \\\r\n  write_flash \\\r\n  -z \\\r\n  --flash_mode dio \\\r\n  --flash_freq 40m \\\r\n  --flash_size detect \\\r\n  0x1000 build\/bootloader\/bootloader.bin \\\r\n  0x10000 build\/hello-world.bin \\\r\n  0x8000 build\/partitions_singleapp.bin\r\n<\/code><\/pre>\n<h2>7. \u52d5\u4f5c\u78ba\u8a8d<\/h2>\n<p>\u4eca\u56de\u66f8\u304d\u8fbc\u3093\u3060Rust\u30b3\u30fc\u30c9\u306f\u3001\u300cHello world!\u300d\u306e\u6587\u5b57\u5217\u3092\u30b7\u30ea\u30a2\u30eb\u901a\u4fe1\uff08\u6a19\u6e96\u51fa\u529b\uff09\u306b\u51fa\u529b\u3057\u30011\u79d2\u5f8c\u306b\u518d\u8d77\u52d5\u3059\u308b\u3068\u3044\u3046\u5358\u7d14\u306a\u3082\u306e\u3067\u3059\u3002<br \/>\nscreen\u30b3\u30de\u30f3\u30c9\u3092\u7528\u3044\u3066\u30b7\u30ea\u30a2\u30eb\u901a\u4fe1\u306e\u5185\u5bb9\u3092\u78ba\u8a8d\u3059\u308b\u4f8b\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code>mac$ screen \/dev\/tty.SLAB_USBtoUART 115200\r\n...\r\nets Jun  8 2016 00:22:57\r\n\r\nrst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)\r\nconfigsip: 0, SPIWP:0xee\r\nclk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00\r\nmode:DIO, clock div:2\r\nload:0x3fff0018,len:4\r\nload:0x3fff001c,len:6264\r\nload:0x40078000,len:11624\r\nload:0x40080400,len:6648\r\nentry 0x40080764\r\nI (29) boot: ESP-IDF v3.3 2nd stage bootloader\r\nI (29) boot: compile time 07:39:47\r\nI (29) boot: Enabling RNG early entropy source...\r\nI (33) boot: SPI Speed      : 40MHz\r\nI (38) boot: SPI Mode       : DIO\r\nI (42) boot: SPI Flash Size : 4MB\r\nI (46) boot: Partition Table:\r\nI (49) boot: ## Label            Usage          Type ST Offset   Length\r\nI (56) boot:  0 nvs              WiFi data        01 02 00009000 00006000\r\nI (64) boot:  1 phy_init         RF data          01 01 0000f000 00001000\r\nI (71) boot:  2 factory          factory app      00 00 00010000 00100000\r\nI (79) boot: End of partition table\r\nI (83) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x07dc8 ( 32200) map\r\nI (103) esp_image: segment 1: paddr=0x00017df0 vaddr=0x3ffb0000 size=0x01e9c (  7836) load\r\nI (107) esp_image: segment 2: paddr=0x00019c94 vaddr=0x40080000 size=0x00400 (  1024) load\r\nI (112) esp_image: segment 3: paddr=0x0001a09c vaddr=0x40080400 size=0x05f74 ( 24436) load\r\nI (131) esp_image: segment 4: paddr=0x00020018 vaddr=0x400d0018 size=0x12a28 ( 76328) map\r\nI (158) esp_image: segment 5: paddr=0x00032a48 vaddr=0x40086374 size=0x01ca0 (  7328) load\r\nI (167) boot: Loaded app from partition at offset 0x10000\r\nI (167) boot: Disabling RNG early entropy source...\r\nI (168) cpu_start: Pro cpu up.\r\nI (171) cpu_start: Application information:\r\nI (176) cpu_start: Project name:     hello-world\r\nI (181) cpu_start: App version:      caf544c\r\nI (186) cpu_start: Compile time:     Sep 29 2019 07:41:53\r\nI (192) cpu_start: ELF file SHA256:  ac30c2c78aa66f96...\r\nI (198) cpu_start: ESP-IDF:          v3.3\r\nI (203) cpu_start: Starting app cpu, entry point is 0x40080ea0\r\nI (195) cpu_start: App cpu up.\r\nI (214) heap_init: Initializing. RAM available for dynamic allocation:\r\nI (221) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM\r\nI (227) heap_init: At 3FFB2EC8 len 0002D138 (180 KiB): DRAM\r\nI (233) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D\/IRAM\r\nI (239) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D\/IRAM\r\nI (246) heap_init: At 40088014 len 00017FEC (95 KiB): IRAM\r\nI (252) cpu_start: Pro cpu start user code\r\nI (270) cpu_start: Chip Revision: 1\r\nW (271) cpu_start: Chip revision is higher than the one configured in menuconfig. Suggest to upgrade it.\r\nI (274) cpu_start: Starting scheduler on PRO CPU.\r\nI (0) cpu_start: Starting scheduler on APP CPU.\r\nHello world!\r\nHello, from Rust\r\n<\/code><\/pre>\n<p>C\u8a00\u8a9e\u3067\u51fa\u529b\u3057\u305fHello world!\u3001Rust\u304b\u3089\u51fa\u529b\u3057\u305fHello, from Rust\u304c\u78ba\u8a8d\u3067\u304d\u307e\u3057\u305f\u3002<\/p>\n<h2>8. \u53c2\u8003<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u66f8\u7c4d\u300eM5Stack\u3067\u59cb\u3081\u308b\u7d44\u307f\u8fbc\u307fRust\u300f<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">espressif\/llvm-xtensa: Work-in-progress version of LLVM for Xtensa. See also https:\/\/github.com\/espressif\/clang-xtensa<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">espressif\/clang-xtensa: Work-in-progress version of Clang for Xtensa. See also https:\/\/github.com\/espressif\/llvm-xtensa<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">MabezDev\/rust-xtensa: Rust for the xtensa architecture. Built in targets for the ESP32 and ESP8266<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Rust on the ESP and how to get started \u2014 ctron&#8217;s blog<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>3\u884c\u307e\u3068\u3081 Rust\u3067\u3082ESP32\u306e\u30d5\u30a1\u30fc\u30e0\u30a6\u30a7\u30a2\u3092\u958b\u767a\u3067\u304d\u308b\u3002 &nbsp; LLVM\u3001clang\u3001rust [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-45392","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>- Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/45392-2\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:description\" content=\"3\u884c\u307e\u3068\u3081 Rust\u3067\u3082ESP32\u306e\u30d5\u30a1\u30fc\u30e0\u30a6\u30a7\u30a2\u3092\u958b\u767a\u3067\u304d\u308b\u3002 &nbsp; LLVM\u3001clang\u3001rust [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/45392-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-10T16:01:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T23:14:11+00:00\" \/>\n<meta name=\"author\" content=\"\u6e05, \u626c\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u6e05, \u626c\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/45392-2\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/45392-2\/\",\"name\":\"- Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2024-03-10T16:01:03+00:00\",\"dateModified\":\"2024-04-29T23:14:11+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/45392-2\/\"]}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461\",\"name\":\"\u6e05, \u626c\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g\",\"caption\":\"\u6e05, \u626c\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyang\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/45392-2\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"- Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/45392-2\/","og_locale":"zh_CN","og_type":"article","og_description":"3\u884c\u307e\u3068\u3081 Rust\u3067\u3082ESP32\u306e\u30d5\u30a1\u30fc\u30e0\u30a6\u30a7\u30a2\u3092\u958b\u767a\u3067\u304d\u308b\u3002 &nbsp; LLVM\u3001clang\u3001rust [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/45392-2\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2024-03-10T16:01:03+00:00","article_modified_time":"2024-04-29T23:14:11+00:00","author":"\u6e05, \u626c","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u6e05, \u626c","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"7 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/45392-2\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/45392-2\/","name":"- Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2024-03-10T16:01:03+00:00","dateModified":"2024-04-29T23:14:11+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/45392-2\/"]}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461","name":"\u6e05, \u626c","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g","caption":"\u6e05, \u626c"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyang\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/45392-2\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/45392","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=45392"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/45392\/revisions"}],"predecessor-version":[{"id":90470,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/45392\/revisions\/90470"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=45392"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=45392"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=45392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}