別シリーズでMbedOS2用のソースをビルド。Keil Studio Cloudのエディタ画面上では問題の赤×印多数でしたが、OS2のライブラリを参照するように設定しておけば問題なくビルド完了。しかしOS6ではビルド不可です。今回、不可だった部分を修正、OS6のオブジェクトを作って動作を確認。小手先対応なんだけれども。
※「モダンOSのお砂場」投稿順Indexはこちら
Keil Studio Cloud上でのOS2用のソースのビルドの件
Keil Studio Cloud上で、OS2用で動作OKであったソース(Arm Online CompilerでOS2用にビルドできていたもの)をKeil Studio Cloud上にもってきてビルドしてみた別シリーズ記事は以下です。
三上先生のSDR(ソフトウエア・デファインド・レディオ)をNucleo F446REボード上で動かすためのコード一式です。ビルドできれば関東地方の中波ラジオを受信できるもの。
元のソースはArm Online Compiler上で、OS2用に問題なくビルドできるものでしたが、最近Arm社が「とっととKeil Studio Cloudへ移行せよ」と思召しているので、Keil Studio Cloud上でビルドを試みてみた次第。
上記の記事で報告しているとおり、
-
- ビルドは成功し、オブジェクトは実機上で正常に動作する
- しかし、Keil Studio Cloudのエディタ画面ではエラー多数
これは、エディタ画面で文法チェックなどをつかさどっている clangd がビシビシと指摘しているためだと思われます。Arm Online CopilerでOS2用にビルドするときと、Keil Studio Cloudではコンパイラも変わっているし、その設定も違うと。
上記の記事で積み残していた、OS2用のソースをOS6上でビルドできるように改変してみたのが今回です。勝手改変すみません。改変部分のみ部分的に説明させていただきます。
OS6上での問題点、とその小手先対応
本来であれば、三上先生の意図を把握してただしくOS6対応するべきですが、はっきり言って「動くようになれば良し」という小手先対応です。
第1の問題点は、OS2の時代には存在した Serial オブジェクトがOS6では廃止されている、という点です。通常はBuffered か、Unbeffered Serialに置き換えるというのが、正しい対処ではないかと思います。ただし、元のソースを拝見すると、Serial のインスタンスを pc として
pc.printf(…
みたいな使い方をしている場所が多数。どちらかというと OS6ではデバッグ用にオブジェクトを作らなくても使える stdio に近いです。Buffered SerialはAPI異なるので書き直さんとならないし。ということで Serialオブジェクトを消してしまって、stdio 相手に printfすることにいたしました。
ただこの時の問題点はキー入力を監視しておりキーによって「選局」していることです。0ならNHK第1とか。これを三上先生の御ソースでは、Serialオブジクトの割り込みハンドラにattachする関数でキー入力を監視して切り替えてます。Debug用のstdio相手にやるのはどうかな~という感じだったので、main関数内のループを以下のようにしてみました。
while (true) { char chr = getchar(); if (('0' <= chr) && (chr <= '6')) { nco_.Set(F_C_[chr & 0x07]); putchar(chr); } if (chr == '\r') printf("\r\n"); }
もともとのオリジナルでは空ループであったところに入力待ちと選局を押し込み、割り込みハンドラへのフックは廃止しました。SDR処理そのものはADコンバータの割り込みハンドラ内で処理されているので問題ないハズ、という小手先対応です。なお、stdin, stdout相手の処理なので、オリジナルのgetc, putcではなく、getchar(), putchar()にしてます。
これでとりあえずエラーは消えた、と。
第2の問題点は、簡単なようで結構ムズイ問題です。オリジナルのソースのあるクラス定義の中に以下のような記述がありました。
static const float AMP_ = 1.0f/2048.0f;
クラスの定数として浮動小数点値を定義しているのです。OS2時代のOnline Compilerでは通してくれるのですが、Keil Stduio CloudでOS6用のデフォルトではこれは「許されない」ようです。
constexpr
というキーワードも浮かんだのですが、これはこれで奥深い問題を引き起こすみたいっす。C++11もよくわかっていない年寄はさっさと断念。この定数を使っている場所が1か所しかないことを確かめ、その場にリテラルおいてしまいました。こいうときはどう書くのがよいのか、また後でだな~。
あともう一か所、三上先生の御ソースでは「マルチバイト文字使用の警告抑制のため」以下のpragma 使われてます。
#pragma diag_suppress 870
コンパイラも変わり、このような抑制は不要なんじゃないかな~。知らんけど。
上記はコメントアウトしてしまいました。問題ないっと。
ビルドと実行結果
上記のような変更にて、ビルドは通るようになりました(Mbed OS 6.15.1)
そして、生成されたオブジェクトファイルを実機に書き込めば、ちゃんとラジオが聞こえ、ラジオ局の選局機能も動いております。汚い小手先対応だけれども、一応OS6対応だし。