Mbed Online CompilerからArm Keil Studioへの移行手順について

# はじめに
12月にMbed Online Compilerがサービス終了するという事で、利用者はArm Keil Studioへ移行する必要が発生しました。

ディレクトリの移行自体は簡単なのですが、その後の操作が少し面倒なので、備忘録とロボコン部内共有も兼ねて、私自身が把握している範囲でですが記録しておこうと思います。

※間違っている部分が多々あると思われますが、修正すべき点がありましたらコメント等お願い致します。

※この記事は、[Arm Keil Studio Cloud User Guide](https://developer.arm.com/documentation/102497/1-5/?lang=en)を参考にしております。

# この記事の主な対象者
 - 現在までMbed Online Compilerで開発を行っていた方
 - 今までMbed Online Compiler以外のMbed開発環境を触った事がない方
 - Arm Keil Studioにディレクトリ移行したのは良いものの、行き詰っている方

# 移行手順
移行手順は大きく分けて以下の3つとなります。
 1. ディレクトリをKeil Studioに移行する
 1. Mbed 2からMbed OS 5 or 6へアップグレードする
 1. 互換性のない関数(主にUART周辺)を調整する

## 1. ディレクトリをKeil Studioに移行する
すでにここまではやってる方も多いかもしれませんが、一応書き記しておきます。
幸いにもボタン数クリックで移行が可能なので、手早く行っていきます。

#### 1.1. Keil Studioにログインする
[Keil Studio](https://studio.keil.arm.com/)にアクセスし、ログインします。
ユーザー情報はOnline Compilerと同じですので、普段Online Compilerにログインする際と同じ感覚でやってもらって結構です。

初回読み込みはかなり時間がかかった記憶がありますが、気長に待ちましょう。

#### 1.2. Mbed Online Compilerからプロジェクトをインポートする
##### 1.2.1. Keil Studioを初めて開く場合
Keil Studioが開いたら、この場では何も操作せず、左側に画像のようなタブが出ているはずなので、一番下のImport projects from Mbed online Compilerを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727917/d98821da-7514-4c70-4b15-731cdde44e8b.png)
すると選択画面が出てきますので、移行したいプロジェクトを選択し、Copy progamsをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727917/eba6f55d-cb7c-3461-48d7-e116ad322e12.png)
画像のように、新しくプロジェクトが追加されたら完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727917/dcf6ded7-ef39-7e1b-e972-a763e3c0f44e.png)

##### 1.2.2. Keil Studioに他のプロジェクトが存在する場合(追加読み込み)
Keil Studioを開いたら、画面左上のFileタブをクリックします。Import from Mbed Online Compilerを選択したらプロジェクト一覧が出てくると思いますので、インポートしたいプロジェクトを選択してCopy programsをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727917/282d3369-c6aa-6511-ac58-e05eda8e4651.png)
左側に選択したプロジェクトが追加されていれば完了です。

## 2. Mbed 2からMbed OS 5 or 6へアップグレードする
Keil Studioにプロジェクトを追加した状態だと思いますが、このままではまだプログラムをコンパイルする事ができません。
Online CompilerではMbed 2を使っていましたが、Keil StudioではMbed OS 5または6にしか対応しておらず(多分)、アップグレードの作業が必要となります。

##### 2.1. mbed.bldの削除
画像の通り、Mbed 2から移行後のディレクトリ内に存在するmbed.bldを削除します。
mbed.bldと書いてある上で右クリック、メニューの下の方にあるDeleteを押すことで削除できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727917/6c40be4c-6039-e199-3363-892eae8e4f91.png)

##### 2.2. Mbed OSのインポート
プロジェクト名の上で右クリック、メニューからAdd Mbed Library...を選択します。
するとURLとライブラリ名を入力する画面が出てきますので、URLに`https://github.com/ARMmbed/mbed-os`と入力し、ライブラリ名はmbed-osのまま次に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727917/4ba0895e-4f3e-9676-a1f8-88bd328219f3.png)
以下のような画面が出てきますので、過去にOnline Compilerを使用していた方のうち、**SerialクラスまたはRawSerialクラスを利用していた方は、プルダウンから"mbed-os-5.xx.x"を選択するようにしてください。** (それ以外の方は6でも問題ないかと思います。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727917/e77850d5-872f-6628-375a-cf2fca6a8842.png)
Finishを押し、新たにmbed-osディレクトリが生成されていれば、インポート完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727917/e604dfa2-b8dd-8cef-7673-466cac6cadd1.png)


## 3. Serialクラス周辺を調整する(Online Compilerからの移行者向け)
Mbed OS 5ではSerialクラスが利用できず、代わりにRawSerialというクラスを利用する必要があります。
(Mbed OS 6だとRawSerialも消え、BufferedSerialとUnBufferedSerialに分割される。こちらは未調査)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727917/41ba986c-a297-95bb-137a-a605cf3de00c.png)


##### 3.1. RawSerialクラスへの変更
変更自体は簡単で、`Serial 変数名(TX, RX)`で宣言していたものを、`RawSerial 変数名(TX, RX, baud[省略可])`に変更するだけで可能です。

##### 3.2. 構文の修正
`変数名.baud(####)`など、ピン宣言とは別でボーレートを指定していた場合、エラーを吐かれてしまいます(多分)。
そのためbaud関数を削除し、代わりにボーレートの値をRawSerial宣言の第三引数に渡してあげましょう。

また、割込みのためにattach関数を使っている方も多いと思われますが、こちらは`Serial::RxIrq`という引数を、`SerialBase::RxIrq`に変更してあげましょう(送信割込みの場合はRxIrqの部分がTxIrq)。


以下に修正例を示しておきます
```diff_cpp:main.cpp
#include "mbed.h"

void Config(void);
void PS3Data(void);

- Seial pc(USBTX,USBRX);
- Serial cont(PA_9, PA_10);

+ RawSerial pc(USBTX,USBRX);
+ RawSerial cont(PA_9, PA_10,9600);

int PS3[7];

int main(void)
{
    Config();
    //省略
}

void Config(void){
    //初期設定
-   cont.baud(9600);
-   cont.attach(&PS3Data, Serial::RxIrq);
+   cont.attach(&PS3Data, SerialBase::RxIrq);
}

void PS3Data(void)
{
    //省略
}
```


# まとめ
おおよその方はこれで動くと思います。
稀によく構文エラーが出ることがありますが、**なぜか**ビルド通るので多分大丈夫です。

引っ掛かりやすい部分をまとめると

- Mbed OSへのバージョンアップが必要
- Serialクラスを使ってる場合は、Mbed OS 5の方がある程度互換効いて使いやすい
- RawSerialクラスへの移行に伴って、若干の構文変更が必要

この辺りだと思います。
本来であれば最新のMbed OS 6を使用するべきであるとは思うのですが、Serial系クラスの一新などと面倒な仕様変更が入ったため、互換性や引継ぎのしやすさという面でMbed OS 5への説明という形で紹介させていただきました。
もし6への移行が上手くいきそうなら、今後そちらも記事にまとめたいと思います。というより誰か作って欲しいです(他力本願)。

12月にサービス終了という事で、取り急ぎ分かってる範囲でまとめてみました。
不明瞭で間違ってる部分もあると思われますが、あくまで参考程度にしていただけると幸いです。

ということで、皆様も良いMbedライフを！