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のコードです。センサの実験コードになります。
#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
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しにきてください。
Author And Source
この問題について(PlatformIOでmbedOS6ではなくOS5で開発する方法), 我々は、より多くの情報をここで見つけました https://qiita.com/TomiXRM/items/4478dc63301c9919cfc2著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .