PlatformIOでmbedOS6ではなくOS5で開発する方法

# 📝About
MbedOS6の到来によって石化したOS5のコードたちに息を命を宿らせる記事です

# 🚀introduction
みなさんPlatformIOでmbed開発していますか？そういえば最近MbedOS6になりましたよね。なったんですよ。
私はRoboCupというロボット競技に出ていまして、高校2年生の時に世界大会に行って世界3位を獲ったんですよ。そのときに使っていたマイコンがSTM32F446RET6なんですが、コードを```PlatformIO```+```Mbed OS5```で書いていました。

### ところがMbed OS6の登場
つい最近、2020年のことです。MbedがOS5からOS6に移行しました。メインが変わって、例えば```wait_ms(600);```とか```Serial pc(USBTX,USBRX)```てのが何一つコンパイルできなくなったわけです。

https://os.mbed.com/docs/mbed-os/v6.8/apis/index.html
早くなったとか色々言っていますね。

でも、それよりも、**以前書いたコードがPlatformIO+Mbedで動かなくなりました。**
これは大惨事で、OSの互換性が無くなったのでこれ以上プログラムの更新をすることができなくなった感じでした。今回はOS5のコードを今のPlatformIOで使えるようにしていく記事になります。

# 🤔Mbed OS5のコードをOS6でビルドしてみる
とりあえず、動かねーって嘆いていたMbed OS5のコードです。センサの実験コードになります。

``` main.cpp
#include "mbed.h"

Serial pc(USBTX, USBRX);
BusOut channel(D7, D8, D9, D10, D11);
AnalogIn analog(A0);
PwmOut led(D6);

uint16_t data[16];

DigitalOut LED(D13);
Ticker blink;
uint16_t num;

void blinking(){
        LED = !LED;
}

int main(){
        pc.printf("TEST CODE\r\n");
        pc.baud(230400);
        blink.attach(&blinking, 0.5);//LIFE
        led.period_us(100);
        led = 0.5;
        while (1) {
        for (uint8_t i = 0; i < 32; i++){
                        channel = i;
                        data[i] = analog;
                        pc.printf("%d\t%d\r\n", i, data[i]);
                        wait_ms(50);
                }

                for(float i = 0; i < 1000; ++i) {
                        led.write((float)(i/1000));
                        wait_ms(2);
                }
                for(float i = 1000; i > 0; --i) {
                        led.write((float)(i/1000));
                        wait_ms(2);
                }
        }
}
```
これをビルドすると。
あ、その前に、PlatformIOの設定ファイル見せてあげないと。

```platformio.ini
[env:nucleo_f303k8]
platform = ststm32
board = nucleo_f303k8
framework = mbed
upload_protocol = stlink
```

これで```build```します。
##出てきたエラー

``` error.s
src/main.cpp:3:1: error: 'Serial' does not name a type; did you mean 'serial_t'?
    3 | Serial pc(USBTX, USBRX);
      | ^~~~~~
      | serial_t
src/main.cpp: In function 'int main()':
src/main.cpp:19:9: error: 'pc' was not declared in this scope
   19 |         pc.printf("TEST CODE\r\n");
      |         ^~
src/main.cpp:21:36: warning: 'void mbed::TickerBase::attach(F&&, float) [with F = void (*)()]' is deprecated: Pass a chrono duration, not a float second count. For example use `10ms` rather than `0.01f`. [since mbed-os-6.0.0] [-Wdeprecated-declarations]
   21 |         blink.attach(&blinking, 0.5);//LIFE
      |                                    ^
In file included from /Users/tomixrm/.platformio/packages/framework-mbed/mbed.h:82,
                 from src/main.cpp:1:
/Users/tomixrm/.platformio/packages/framework-mbed/drivers/include/drivers/Ticker.h:92:10: note: declared here
   92 |     void attach(F &&func, float t)
      |          ^~~~~~
src/main.cpp:29:25: error: 'wait_ms' was not declared in this scope; did you mean 'wait_ns'?
   29 |                         wait_ms(50);
      |                         ^~~~~~~
      |                         wait_ns
src/main.cpp:34:25: error: 'wait_ms' was not declared in this scope; did you mean 'wait_ns'?
   34 |                         wait_ms(2);
      |                         ^~~~~~~
      |                         wait_ns
src/main.cpp:38:25: error: 'wait_ms' was not declared in this scope; did you mean 'wait_ns'?
   38 |                         wait_ms(2);
      |                         ^~~~~~~
      |                         wait_ns
*** [.pio/build/nucleo_f303k8/src/main.o] Error 1
=============================================================== [FAILED] Took 152.00 seconds ===============================================================
```

 はい、こんな感じに表示が出ました。エラーだらけですね。このソースコードの中だと
- ```Serial```
- ```attach```
- ```wait_ms```
が動いていないようです💢😠👊
互換性！！！！なぜ！！Mbed OS6ちょっと見てみましたけど、まーじで初心者ゴロシですよ。理解できなかった。

# 🥳MbedOS5に対応していく
ここからがメインディッシュになります。
### 💪すること

- **platformio.iniを書き換える**
- **PlatformIOの中のpythonコードを直していく**

##1. platformio.iniを書き換える

```platformio.ini
[env:nucleo_f303k8]
platform = ststm32
board = nucleo_f303k8
framework = mbed
upload_protocol = stlink
platform_packages = framework-mbed@~6.51504.200716
```

```platform_packages = framework-mbed@~6.51504.200716```を加えたのがみそ
ビルドしてみる。

**2021/10/13追記**
`platform_packages = framework-mbed@~ﾅﾝﾄｶ`は以下の設定でバージョンを選べるそうです。

```

2018-04-19T13:21:46Z : framework-mbed@~4.50802.0
2018-06-12T20:47:52Z : framework-mbed@~4.50806.1
2018-08-07T22:06:40Z : framework-mbed@~5.50904.1
2018-10-29T15:25:23Z : framework-mbed@~5.51001.181029
2019-02-07T17:59:55Z : framework-mbed@~5.51103.190208
2019-02-22T19:26:53Z : framework-mbed@~5.51104.190222
2019-03-12T22:06:13Z : framework-mbed@~5.51105.190312
2019-05-09T18:06:06Z : framework-mbed@~5.51203.190509
2019-07-01T18:08:31Z : framework-mbed@~5.51204.190701
2019-08-26T13:12:04Z : framework-mbed@~5.51304.190826
2020-06-22T10:27:31Z : framework-mbed@~6.51401.200622
2020-07-20T13:44:52Z : framework-mbed@~6.51504.200716
2020-07-22T10:17:23Z : framework-mbed@~6.60200.200722
2020-12-27T11:50:32Z : framework-mbed@~6.51506.201227
2021-01-28T20:38:38Z : framework-mbed@~6.60600.210128
2021-03-18T18:53:29Z : ramework-mbed@~6.60900.210318
2021-03-18T18:53:29Z : framework-mbed@@~6.60900.210318
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135538/53e5bfd5-afbf-83d5-e743-da463faaf304.png)
https://pbs.twimg.com/media/EwvfUXCVIAIjeOW?format=jpg&name=4096x4096
こんなエラーがでました。どうやらPlatformIOの中のPythonコードのエラーらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135538/99c2c3d2-1dd2-fc35-e7f3-9a0c636a0753.png)
これを直したら優勝ですね。**compat.pyを頑張って開きましょう！！！！
(vscodeならcmd+クリックでこのファイル開けるけどね)**

## 2. PlatformIOの中のpythonコードを直していく
https://github.com/python-intelhex/intelhex/issues/45

**なんか、Python3.9で動かすことになると**```tostring```**のバグがつきものらしいです。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135538/3295c717-da61-9265-3e54-7561c67f3ce7.png)
**らしいです！！**
というわけで、
1. platform-mbedというフォルダの中に、深掘りしていくと、```compat.py```ってのが、どっかにあるらしいので開きます。
2. ```tostring```という単語を全て```tobytes```に変換します。
3. 保存
4. PlatformIOでビルド

## 👾結果
![Screenshot 2021-03-22 9.56.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135538/8d450fe4-6eef-dc1b-b757-33e23521e7c3.png)

なんとかビルドできました！！完全勝利
これで世界中のMbesOS5のコードの石化復活です。
お疲れ様でした!! 楽しいMbed0S5ライフを！


# 😇頑張った記録たち...
ここからはメンコンテンツではないですが、頑張ってこれを見つけた記録になります。6時間くらいかかりました...
色々と記事を見漁りました。

https://docs.platformio.org/en/latest/frameworks/mbed.html#mbed-os-5-and-mbed-2

###「お！なんかあるやん！」「Mbed OS 5 and Mbed 2」これでは！？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135538/abca3bf8-3f3f-d32e-b270-5e28b12d18aa.png)

とおもったが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135538/b51f4d20-1f2d-72a6-c3ec-bdf463285198.png)

そんなこともなかった。

https://docs.platformio.org/en/latest/projectconf/section_env.html#options

### iniの設定のオプションがあることに気づく。がこの中に使えそうなものは何もなかった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135538/3bb2ae1b-fcd5-cfe9-f3f9-4bd2cb7b4aea.png)

### ここでMbedとは全く無関係だがそれっぽいフォーラム記事をみつける
https://community.platformio.org/t/set-framework-version/17212/3

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135538/5a72dabd-5c29-9a3f-6d15-469a00a10dd0.png)
あれ、```pltaformio.ini```のオプションに```platform_packages```なんてのドキュメントに載ってなかったやん...けどこれでバージョン指定できるかんじ！？って思って、とりあえず、**Mbedのバージョンについて調べてみました。**

https://community.platformio.org/t/bluepill-and-mbed-os-6-2/16033

**たまたまこれで、OS5でビルドしたときに出てくるコンソールの表示を貼っつけてくれている人を見つけました。** たまたま、これをみると```PACKAGES```に

```
PACKAGES: 
 - framework-mbed 6.51504.200716 (5.15.4) 
 - toolchain-gccarmnoneeabi 1.90201.191206 (9.2.1)
```
```6.51504.200716 (5.15.4) ```と書いてあります。
**5.14.4**という数字について調査すべくアマゾンの奥地へと進んでいくと、

https://os.mbed.com/mbed-os/releases/#

リリースノートにたどり着きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135538/cc8eeb92-75d2-0e05-4962-57053321bc9a.png)

一番下に**5.14.4**があります。どうやらこれがOS5のバージョン名らしいです。
どうやら、**6.51504.200716 = (5.15.4)**ってことらしい。それで、**5.15.4**の上に**5.15.6**がlatestっぽいこともわかった。

mbedOSを5.15.6にすればOS5が使えそうだ。
でも6.51504.200716みたいな数字よく分からない。調べても出てこないし、とりあえずMbedOS5が使えたらいいから、5.15.4でいいや

# 最後に
お疲れ様でした。
分からなかったらTwitter(@TomiXRM)にDMしにきてください。