Azure IoT Edge v2に最適なシングルボードコンピュータ

Azure IoT Edge v2をシングルボードコンピュータ(SBC)で動かそう!と思い、Raspberry Pi 3のRaspbianで試したところ、さまざまなエラーに見舞われて上手く動きませんでした。

「SBCで安定して動かすことはできないのか?」

いくつかのSBCで、実際にAzure IoT Edge v2を動かしてみたときの、わたし個人の見解です。

Azure IoT Edgeは現時点はプレビューです。
アップデートによって状況は改善されるものと思います。

テスト方法

OSはUbuntu Linux Server 16.04を使いました。Raspberry Pi 3はRaspbian。Windows 10が動くSBCもありますが、IoT EdgeがDockerベースで作れらていることから、Linuxの方が事故りにくいと思い、Linuxにしました。

チュートリアルにある、

をセットアップして、それぞれのモジュール(edgeAgent, edgeHub, tempSensor, asa-container)に異常がないか確認しました。(例:docker logs -f tempSensor)

本当はC#モジュールで試したかったのですが、VSCode拡張でLinuxコンテナーがAmd64しか出力できなかったので止めました。

Raspberry Pi 3

様々なエラーに見舞われましたが、、、Raspbian Lite(2018-03-13-raspbian-stretch-lite.img)にこの手順でセットアップすれば動きました。

セットアップ時にメモリが足りないようで、ときどきリブートしないとエラー地獄になります。セットアップさえ終われば、ちゃんと動いています。

ただ、遅いです。tempSensorだけなら良いですが、ASAと連携するとガクガクな動きになります。

  • IoT Edgeランタイム動く
  • ASA動く
  • セットアップにコツがいる
  • 遅い
  • メモリ不足エラーが不安

UP2

AAEONが出している超パワフルなSBC。パソコンがそのままSBCになった、という感じの代物です。

  • IoT Edgeラインタイム動く
  • ASA動かない(edgeHubからのPOSTでエラー?)
  • 鬼速い

有線LANが2系統あるのが問題なのでは?edgeHubのdocker設定を変更すれば回避できるかも?と思いましたが、深追いしていないです。

LattePanda

DFRobotが出しているLattePanda秋月電子通商さんで販売されているので入手しやすいSBC。 UbuntuのインストールUSBメモリからブートが出来なくて、確認できませんでした。

  • Ubuntuがインストールできずorz
  • 基板が熱くて不安

UP

AAEONが出しているラズパイっぽいSBC。 サイズ、コネクタ配置もラズパイ風。

  • IoT Edgeランタイム動く
  • ASA動く
  • 速い

Minnowboard MAX

これもLattePanda同様に日本で入手しやすいSBCMinnowboard MAXは生産終了(EOL)なので、後継のMinnowboard Turbotを使いたかったのですが、、、手元に無いのでコレで。

  • IoT Edgeランタイム動く
  • ASA動く
  • 遅い

まとめ

速くてメモリ潤沢で不安が無い ... UP
入手しやすい ... Minnowboard MAX(ただしEOL)
自らの技術力を試したい ... Raspberry Pi 3

417 - The device's deployment configuration is not setの対処方法

事象

IoT HubでIoT Edge Deviceを作り、(IoT Edge DeviceにModule追加せずに)エッジデバイスでIoT Edgeランタイムを起動すると、IoT Edge DeviceのEdge Runtime Responseに417 - The device's deployment configuration is not setというエラーが表示されます。

f:id:matsujirushix:20180416212245p:plain

また、エッジデバイスでedgeAgentとedgeHubの2つのDockerコンテナが起動するはずなのが、edgeAgentしか起動しません。

pi@raspberrypi:~ $ docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS               NAMES
c1a8c72c3ce1        microsoft/azureiotedge-agent:1.0-preview   "/usr/bin/dotnet Mic…"   24 hours ago        Up 23 hours                             edgeAgent
pi@raspberrypi:~ $

edgeAgentのログで、ConfigEmptyExceptionが発生していることが分かります。

2018-04-16 11:52:08.164 +00:00 [ERR] - Error refreshing edge agent configuration from twin.
Microsoft.Azure.Devices.Edge.Agent.Core.ConfigSources.ConfigEmptyException: This device has an empty configuration for the edge agent. Please set a deployment manifest.
   at Microsoft.Azure.Devices.Edge.Agent.IoTHub.EdgeAgentConnection.UpdateDeploymentConfig() in /opt/vsts/work/1/s/edge-agent/src/Microsoft.Azure.Devices.Edge.Agent.IoTHub/EdgeAgentConnection.cs:line 171
   at Microsoft.Azure.Devices.Edge.Agent.IoTHub.EdgeAgentConnection.<RefreshTwinAsync>d__20.MoveNext() in /opt/vsts/work/1/s/edge-agent/src/Microsoft.Azure.Devices.Edge.Agent.IoTHub/EdgeAgentConnection.cs:line 124
2018-04-16 11:52:10.378 +00:00 [INF] - Updated reported properties

原因

これは、IoT Edgeランタイムに必要な設定(edgeAgentに対するModuleTwin?)が無いことで発生しています。

対処方法

次の操作でIoT Edgeランタイムの設定を作成すると直ります。

  1. IoT Hubにある、IoT Edge DeviceのSet Modulesをクリック
  2. Add Modules画面が表示されるので、Nextをクリック
  3. Specify Routes画面が表示されるので、Nextをクリック
  4. Review Template画面が表示されるので、Submitをクリック

Review Template画面で表示されているJSONが、edgeAgentにModuleTwinで設定されているようです。

Azure IoT Edge Quick Install Guide for Raspberry Pi 3

Azure IoT Edge v2 ランタイムをRaspberry Pi 3にインストールする手順です。

Key point

Setup process consume memory and Raspberry Pi 3 has memory only little. You need reboot before heavy setup/install process.

Step 1

Create microSD image

  • 2018-03-13-raspbian-stretch-lite.img
  • Create empty file 'ssh' on boot volume in microSD when you need to use SSH.

Step 2

Reduce GPU memory

$ sudo vi /boot/config.txt
gpu_mem=16

Reference

Disable IPv6 stack

$ sudo vi /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6=1

Reboot

$ sudo reboot

Step 3

Install pip

$ sudo apt-get update
$ sudo apt-get install python-pip

Reference

Upgrade setuptools and others

$ sudo apt-get install python2.7-dev libffi-dev libssl-dev
$ sudo pip install -U setuptools pip
$ sudo pip install -U cryptography idna

Reboot

$ sudo reboot

Step 4

Install Docker

$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ sudo usermod -aG docker pi

Reference

Re-login

$ exit

Step 5

Install Azure IoT Edge Runtime

$ sudo pip install -U azure-iot-edge-runtime-ctl
$ sudo iotedgectl setup --auto-cert-gen-force-no-passwords --connection-string "{ConnectionString}"

Reboot

$ sudo reboot

Step 6

Start Azure IoT Edge Runtime

$ sudo iotedgectl start

Reboot

$ sudo reboot

iothub-explorerをAzure Cloud Shellで使えるようにする

Azure IoT Hubの状況をモニタリングするのに、AzureポータルとDevice Explorerを使うのが定番です。特に、C2DメッセージはAzureポータルでは確認できないので、Device Explorerを使うことになります。

残念なことに、このDevice ExplorerWindows専用。MacユーザーやLinuxユーザーがC2Dメッセージをモニタリングしたいときは、Device Explorerの代わりにiothub-explorerというCLIツールを使うことになりますが、Node.jsをインストールしてiothub-explorerをインストールと、ちょっと煩わしい。

気になるが良い手が無いなぁと思っていたところ、先日、ビデオ会議でソラコム松井さん、松下さんから「Azure Cloud Shell良いよ」と、素晴らしい方法を聞いたので、試してみました。(松井さん、松下さんありがとうございます!!)

Azure Cloud Shellのセットアップ

Webブラウザから操作できるシェル。Azure管理コマンドを実行するために用意されたシェル環境のようで、Azureポータルのアカウントに紐づいて環境作成できます。(複数セッションの同時接続は可能。) サーバーは無料で、ストレージは有料。Azureストレージアカウントに課金されます。

azure.microsoft.com

Azureポータルの上部にある、コンソールっぽいアイコンをクリックしてください。

f:id:matsujirushix:20180331164750p:plain

すると、画面が上下分割されて下部にAzure Cloud Shellが表示されるので、Bash (Linux)をクリックしてください。

f:id:matsujirushix:20180331165452p:plain

ストレージの作成をクリックしてください。

f:id:matsujirushix:20180331165626p:plain

このように、Linux (Bash)が起動すれば成功です。

f:id:matsujirushix:20180331165851p:plain

なお、一番右のフォルダのようなアイコンをクリックすると、Azure Cloud Shellだけのウィンドウを開くことができます。また、そのURLをブックマークしておくと、Azureポータルを立ち上げずに直接Azure Cloud Shellを開くことも可能です。

f:id:matsujirushix:20180331170152p:plain

iothub-explorerのインストール

公式の手順はnpm install -g iothub-explorerと、グローバル領域(/usr/local/lib/node_modules)にインストールしていますがAzure Cloud Shellではここにインストールすることはできません。いくつか代案がありますが、、、ここではグローバル領域を変更してインストールしましょう。

mkdir ~/.npm-global
npm config set prefix '~/.npm-global'
npm install -g iothub-explorer

iothub-explorerの起動

~/.npm-global/bin/iothub-explorer

すばらしい。

f:id:matsujirushix:20180331174048p:plain

PATHの追加

いちいち~/.npm-global/...と入力するのは面倒なので、.bashrcにPATH追加を追記しておくと少し便利です。

vi ~/.bashrc

f:id:matsujirushix:20180331172918p:plain

PATH=~/.npm-global/bin:${PATH}

. ~/.bashrc

Azure Cloud Shellの削除

一度、Azure Cloud Shellをセットアップすると、Azureストレージアカウントに課金されます。ストレージを使っているので。

もういらないよ!というときは、リソースグループのcloud-shell-storage-xxxを削除しましょう。

f:id:matsujirushix:20180331173332p:plain

Power BI 勉強会@名古屋支部 #1に参加しました

Maker Faire Tokyo 2017のデモ、ゴミ箱残量モニタリングを作るときにEvent Hub -> Stream Analytics -> Power BIで実装したのですが、Power BIがいろいろ分からずWPFアプリケーションに変更していました。(十分理解する前に時間切れで使い慣れた方法に変更するというのは、お仕事では必要ですね。)

以降、Power BIをじっくりやろうというチャンスが無かったのですが、Power BI 勉強会@名古屋支部 #1が開催されるということで参加しました。

powerbi.connpass.com

会場は日本システム開発株式会社さんのオープンイノベーションベース。(名古屋で会場を確保するのは大変なので)会場提供ありがたい。

内容はPower BIの使いどころとか使ってみるとハマるところなどを実体験に基づいて発表されていました。どれも熱意のあるセッションで素敵でした。熱意大事。詳しくはconpassのセッション情報と資料をご参照ください。(←手抜き)

togetterもどうぞ。

togetter.com

(わたしは仕組み、仕掛けあたりが興味ポイントなのですが)わたしが気になった、気づいた点をいくつかピックアップしますと、

描画ツールではなく分析ツール

Power BIの出力は見た目がきれいなので綺麗なレポートを作るツールと感じますが、その理解は間違い。データを手軽にコネコネして分析するためのツール。また、データを最新のものに更新しても、コネコネした手順をやりなおす必要が無い。

Power Query -> DAX

コネコネのキモは、Power QueryとDAX。特にPower Query。Power QueryはPower Query Formula Languageという関数型言語で記述するのですが、Excel風のクエリーエディターでGUI操作すると、記述が生成されます。

ストリーミングデータセット

データセットは基本的にバッチ分析で、リアルタイム分析?はストリーミングデータセット。履歴データの解析をオンすると、レポートで分析できるようになります。

データセットとストリーミングデータセット、Power BIが保持するデータ、レポートと(ダッシュボードに貼る)リアルタイム表示のタイル、の関係をどう理解するのかがポイント。

Power QueryDAXの攻略がキモかな?と思いました。その先はデータ分析能力ですねorz

3/24に次回イベント、Power BIもくもく会があるようです。

ちょっと日にちが先なので、、、ぼっちモクモクしようと思います。

MbedプログラムをVisual Studioでデバッグする

前回に続き、MbedプログラムをVisual Studioデバッグしてみました。

元ネタはこちらです。 blogs.msdn.microsoft.com

元ネタにあるとおり、デバッグができるのはPreviewのVisual Studio 2017 15.6です。そのため、前回と違ってVisual Studio 2017 Previewを使いました。Visual Studio 2017 Previewはここからダウンロードできます。

プログラムの作成

前々回と同じです。

Embedded開発とIoT開発をインストール

Visual Studioに含まれている、Visual C++ tools for CMake and LinuxEmbedded開発とIoT開発のオプションをインストールしておく必要があります。

f:id:matsujirushix:20180203233230p:plain

Visual Studioを英語表示にしておく

前回Visual Studioを英語表示にしておかないとBuild/Cleanのコンテキストメニューが表示されなかったので、早めに英語表示にしておきます。ツール -> オプション国際対応の設定にある言語をEnglishにして、Visual Studioを再起動してください。

f:id:matsujirushix:20180203223718p:plain

Visual Studioで開く

前々回とほぼ同じです。

File -> Open -> Folderでエクスポートしたプログラムを開いてください。そして、Project -> Edit Settings -> CppProperties.jsonを選んで、自動的に作られたCppProperties.jsonを下記に入れ替えて保存してください。

Project -> Edit Settingsが表示されないときは、main.cppをダブルクリックで開くと表示されます。

CppProperties.json

{
  "configurations": [
    {
      "inheritEnvironments": [
        "gcc-arm"
      ],
      "name": "gccarm",
      "includePath": [
        "${env.INCLUDE}"
      ],
      "defines": [

      ]
    }
  ]
}

Visual Studio 2017 15.5の場合、"gcc-arm"を"gcc_arm"にしないと正常に動作しませんでした。

Visual Studio 2017 15.6.0 Preview 3.0の場合、ソースの探索にとても時間がかかるようです。CPU負荷が気になる場合はしばらく放置しましょう。

f:id:matsujirushix:20180203230914p:plain

ビルド

前回と同じです。

Makefileを右クリックしてBuildを選ぶとビルドできます。

デプロイ

Nucleo_blink_led.binを右クリックしてConfigure Tasksを選んでcopyコマンドをタスクに割り付ければVisual Studioからデプロイできるようになります。

tasks.vs.json

{
  "version": "0.2.1",
  "tasks": [
    {
      "taskName": "Deploy",
      "appliesTo": "BUILD/Nucleo_blink_led.bin",
      "type": "launch",
      "command": "${env.COMSPEC}",
      "args": [
        "copy BUILD\\Nucleo_blink_led.bin D:"
      ]
    }
  ]
}

f:id:matsujirushix:20180203232116p:plain

デバッグ

Visual StudioからMbedのデバッグは、Visual Studio -> GDB Client(arm-none-eabi-gdb) -> GDB Server -> Mbedデバイスという経路で行われます。

GDB Client(arm-none-eabi-gdb)はVisual StudioオプションのEmbedded開発とIoT開発に含まれています。

GDB Serverはデバイスに合わせて別途インストールしておく必要があります。メジャーところはpyOCD、OpenOCDですね。

今回はST-Linkが搭載されているNUCLEOなので、OpenOCDをつかうことにします。

OpenOCD

いろいろなバリエーションのものがネットで配布されていますが、お友達のkekyoさんがビルドしているものがあるので、それを使いましょう。

github.com

リリース1.0.1にあるopenocd-0.10.0_i686-w64-mingw32_2018-01-14.tar.bz2をC:\OpenOCD\openocd-0.10.0に解凍してください。

f:id:matsujirushix:20180204211317p:plain

Debug and Launch Settings

Nucleo_blink_led.binを右クリックしてDebug and Launch Settingsを選んでください。Debugger選択画面が表示されるので、C/C++ Debug microcontroller(gdbserver)を選択すると、マイコンデバッグ用のlaunch.vs.jsonが作られます。

そして、launch.vs.jsonを修正します。

GDB Server

GDB Serverに関するエントリ(3箇所)を変更してください。debugServerArgsとserverStartedはMbedデバイスによって記入内容が違うことがあるのでちょっと難しいです。特にserverStarted。コマンドプロンプトGDB Serverを起動して、表示された文言をコピーしましょう。

launch.vs.jsonGDB Server関連) - 変更前

"debugServerPath": "path-to-your\\gdbserver.exe",
"debugServerArgs": "-f path-to-your/board.cfg",
"serverStarted": "GDB\\ server\\ started",

launch.vs.jsonGDB Server関連) - 変更後

"debugServerPath": "C:\\OpenOCD\\openocd-0.10.0\\bin\\openocd.exe",
"debugServerArgs": "-f board\\st_nucleo_f4.cfg",
"serverStarted": "Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints",

GDB Client

GDB Clientに関するエントリ(1箇所)を変更してください。デフォルトの記述のままで正しそうですが、現時点はフルパスを明記しないと動かないようです。

launch.vs.jsonGDB Client関連) - 変更前

"miDebuggerPath": "${env.gccpath}\\bin\\arm-none-eabi-gdb.exe",

launch.vs.jsonGDB Client関連) - 変更後

"miDebuggerPath": "C:\\Program Files (x86)\\Microsoft Visual Studio\\Preview\\Professional\\Linux\\gcc_arm\\bin\\arm-none-eabi-gdb.exe",

Setup commands

GDBのセットアップコマンドを変更してください。一番最初のエントリはコメントなので削除する必要があります。必要に応じて、追加のコマンドを追記します。

launch.vs.json(セットアップコマンド) - 変更前

      "setupCommands": [
        {
          "text": "Documentation: Learn how to configure embedded debugging",
          "description": "See here for more info http://aka.ms/vsembeddeddebug",
          "ignoreFailures": true
        },
        {
          "text": "-environment-cd ${workspaceRoot}/BUILD"
        },
        {
          "text": "-file-exec-and-symbols ${workspaceRootFolderName}.elf",
          "description": "load file",
          "ignoreFailures": false
        },
        {
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }

launch.vs.json(セットアップコマンド) - 変更後

      "setupCommands": [
        {
          "text": "-environment-cd ${workspaceRoot}/BUILD"
        },
        {
          "text": "-file-exec-and-symbols ${workspaceRootFolderName}.elf",
          "description": "load file",
          "ignoreFailures": false
        },
        {
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        },
        {
          "text": "monitor reset halt",
          "ignoreFailures": true
        },
        {
          "text": "monitor reset init",
          "ignoreFailures": true
        }

デバッグ情報の生成

MbedオンラインコンパイラからエクスポートしたMakefileだと、コンパイル時にデバッグ情報が付加されていません。Makefile内のCCとCPPに'-g'を追加、'-Os'を'-O0'に変更してリビルド、デプロイしてください。リビルドですが、Makefile修正だとリビルドされないのでCleanしてBuildしてください。

Makefile(一部) - 変更前

CC      = 'arm-none-eabi-gcc' '-std=gnu99' '-c' '-Wall' '-Wextra' '-Wno-unused-parameter' '-Wno-missing-field-initializers' '-fmessage-length=0' '-fno-exceptions' '-fno-builtin' '-ffunction-sections' '-fdata-sections' '-funsigned-char' '-MMD' '-fno-delete-null-pointer-checks' '-fomit-frame-pointer' '-Os' '-mcpu=cortex-m4' '-mthumb' '-mfpu=fpv4-sp-d16' '-mfloat-abi=softfp'
CPP     = 'arm-none-eabi-g++' '-std=gnu++98' '-fno-rtti' '-Wvla' '-c' '-Wall' '-Wextra' '-Wno-unused-parameter' '-Wno-missing-field-initializers' '-fmessage-length=0' '-fno-exceptions' '-fno-builtin' '-ffunction-sections' '-fdata-sections' '-funsigned-char' '-MMD' '-fno-delete-null-pointer-checks' '-fomit-frame-pointer' '-Os' '-mcpu=cortex-m4' '-mthumb' '-mfpu=fpv4-sp-d16' '-mfloat-abi=softfp'

Makefile(一部) - 変更後

CC      = 'arm-none-eabi-gcc' '-g' '-std=gnu99' '-c' '-Wall' '-Wextra' '-Wno-unused-parameter' '-Wno-missing-field-initializers' '-fmessage-length=0' '-fno-exceptions' '-fno-builtin' '-ffunction-sections' '-fdata-sections' '-funsigned-char' '-MMD' '-fno-delete-null-pointer-checks' '-fomit-frame-pointer' '-O0' '-mcpu=cortex-m4' '-mthumb' '-mfpu=fpv4-sp-d16' '-mfloat-abi=softfp'
CPP     = 'arm-none-eabi-g++' '-g' '-std=gnu++98' '-fno-rtti' '-Wvla' '-c' '-Wall' '-Wextra' '-Wno-unused-parameter' '-Wno-missing-field-initializers' '-fmessage-length=0' '-fno-exceptions' '-fno-builtin' '-ffunction-sections' '-fdata-sections' '-funsigned-char' '-MMD' '-fno-delete-null-pointer-checks' '-fomit-frame-pointer' '-O0' '-mcpu=cortex-m4' '-mthumb' '-mfpu=fpv4-sp-d16' '-mfloat-abi=softfp'

デバッグ

Select Start ItemをNucleo_blink_led.binにしてデバッグ実行すればOKです。

f:id:matsujirushix:20180204215915p:plain

が!デプロイ直後だとうまくブレークできないときがあるようです(あります)。かなり高い確率で。そんなときは、デバッグ停止して、NUCLEOのRESETボタンをクリック、再度、デバッグ実行するとうまく動くようです。思うようにブレークされないときはRESETしましょう(笑

f:id:matsujirushix:20180204215832p:plain

MbedプログラムをVisual Studioでビルドする

前回に続き、MbedプログラムをVisual Studioでビルド(コンパイル)を試してみました。

blogs.msdn.microsoft.com

環境は以下のとおりです。

ビルド

試すといっても、Makefileを右クリックしてBuildするだけ...と思いきや、右クリックしてもBuild(やClean)が表示されていません。

f:id:matsujirushix:20180114183421p:plain

Visual Studioのバージョンを上げたり、15.6 Preview 2を入れたりしても、状況変わらず。

試行錯誤した結果、英語表示に切り替えるとBuild/Cleanがでてくることが分かりました。(お、おぅ...)

f:id:matsujirushix:20180114190613p:plain

本件、マイクロソフトへFeedbackしましたので、改善されるでしょう。

気分一新、Makefileを右クリックしてBuildを選ぶと、make.exeが起動しないエラーが。

'C:\mbed\Nucleo_blink_led_gcc_arm_nucleo_f401re\Nucleo_blink_led\Makefile' (Build)
Process 'make.exe' failed to start.
指定されたファイルが見つかりません。   at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start()
   at Microsoft.VisualStudio.VC.Workspace.MakefileTaskAction.<RunAsync>d__19.MoveNext()
Printing diag info:
ActionType = Build
filepath = C:\mbed\Nucleo_blink_led_gcc_arm_nucleo_f401re\Nucleo_blink_led\Makefile
pwd = C:\mbed\Nucleo_blink_led_gcc_arm_nucleo_f401re\Nucleo_blink_led
path = C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Linux\gcc_arm\arm-none-eabi\bin;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Linux\gcc_arm\bin;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Linux\GNU MCU Eclipse\Build Tools\2.9-20170629-1013\bin\bin
makename = make.exe
makepath = C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Linux\GNU MCU Eclipse\Build Tools\2.9-20170629-1013\bin
makearg = 
BuildConfiguration = gccarm

わたしのPCでは、C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional に Linux というフォルダーが無いので何かインストールが不足しているんじゃないかと、Visual Studio インストーラーを見たところ、それっぽい項目が増えている?ではありませんか!

f:id:matsujirushix:20180114200216p:plain

C++によるLinux開発 にある、Embedded開発とIoT開発 をチェックして、追加インストールすると、Buildが正常に実行されるようになりました。

f:id:matsujirushix:20180114200407p:plain

f:id:matsujirushix:20180114200447p:plain

gccは6.3.1でした。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Linux\gcc_arm\bin>arm-none-eabi-gcc --version
arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors 6-2017-q2-update) 6.3.1 20170620 (release) [ARM/embedded-6-branch revision 249437]