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

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

Tags
mbed
PlatformIO
Published
May 5, 2021

📝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のコードです。センサの実験コードになります。
#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の設定ファイル見せてあげないと。
[env:nucleo_f303k8] platform = ststm32 board = nucleo_f303k8 framework = mbed upload_protocol = stlink
これでbuildします。 ##出てきたエラー
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を書き換える

[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
notion image
こんなエラーがでました。どうやらPlatformIOの中のPythonコードのエラーらしい。
notion image
これを直したら優勝ですね。
compat.pyを頑張って開きましょう!!!! (vscodeならcmd+クリックでこのファイル開けるけどね)

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

なんか、Python3.9で動かすことになるとtostringのバグがつきものらしいです。
notion image
らしいです!!
というわけで、
  1. platform-mbedというフォルダの中に、深掘りしていくと、compat.pyってのが、どっかにあるらしいので開きます。
  1. tostringという単語を全てtobytesに変換します。
  1. 保存
  1. PlatformIOでビルド

👾結果

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

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