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


https://pbs.twimg.com/media/EwvfUXCVIAIjeOW?format=jpg&name=4096x4096
こんなエラーがでました。どうやらPlatformIOの中のPythonコードのエラーらしい。

これを直したら優勝ですね。compat.pyを頑張って開きましょう!!!!
(vscodeならcmd+クリックでこのファイル開けるけどね)

2. PlatformIOの中のpythonコードを直していく

なんか、Python3.9で動かすことになるとtostringのバグがつきものらしいです。

らしいです!!
というわけで、
1. platform-mbedというフォルダの中に、深掘りしていくと、compat.pyってのが、どっかにあるらしいので開きます。
2. tostringという単語を全てtobytesに変換します。
3. 保存
4. PlatformIOでビルド

👾結果

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

😇頑張った記録たち...

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

「お!なんかあるやん!」「Mbed OS 5 and Mbed 2」これでは!?

とおもったが、

そんなこともなかった。

iniの設定のオプションがあることに気づく。がこの中に使えそうなものは何もなかった

ここでMbedとは全く無関係だがそれっぽいフォーラム記事をみつける


あれ、pltaformio.iniのオプションにplatform_packagesなんてのドキュメントに載ってなかったやん...けどこれでバージョン指定できるかんじ!?って思って、とりあえず、Mbedのバージョンについて調べてみました。

たまたまこれで、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という数字について調査すべくアマゾンの奥地へと進んでいくと、

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

一番下に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しにきてください。