📝About🚀introductionところがmbed OS6の登場🤔mbed OS5のコードをOS6でビルドしてみる🥳mbedOS5に対応していく💪すること1. platformio.iniを書き換える2. PlatformIOの中のpythonコードを直していく👾結果
📝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
こんなエラーがでました。どうやらPlatformIOの中のPythonコードのエラーらしい。
これを直したら優勝ですね。
compat.pyを頑張って開きましょう!!!!
(vscodeならcmd+クリックでこのファイル開けるけどね)
2. PlatformIOの中のpythonコードを直していく
なんか、Python3.9で動かすことになると
tostring
のバグがつきものらしいです。らしいです!!
というわけで、
- platform-mbedというフォルダの中に、深掘りしていくと、
compat.py
ってのが、どっかにあるらしいので開きます。
tostring
という単語を全てtobytes
に変換します。
- 保存
- PlatformIOでビルド
👾結果
なんとかビルドできました!!完全勝利
これで世界中のMbesOS5のコードの石化復活です。
お疲れ様でした!! 楽しいmbed OS5ライフを!
頑張った記録たち...