要は、複数ディレクトリーに色々なプロジェクトがあり、それらを全てコンパイルする手順だった。vplayer/一番簡単なのは、各プロジェクトのディレクトリーを指定して、「make」を実行する方法だ、しかしこれだと、プロジェクトが増える度に編集が必要となる。プロジェクトのディレクトリーとして、そのディレクトリーに移動して「make」するスクリプトを作っていた。rl78prog/ただ、これだと、「rl78prog」内のツールはビルでされない・・そこで、良く考えたら、「Makefile」が存在するディレクトリーだけ抜き出して、「make」を起動すれば良いと判った、何でこんな簡単な事を思いつかなかったのか不思議である。スクリプトを作成した。と全て動的に全ビルドが出来るようになった。all_project_build.sh単独で起動すれば、全体に「make」を行なう。clean」してから「make」する。した工夫で、開発環境がより良くなる事は多い。アップデートをし続けて、現在に至っている。ビルドだと、最初に「configure」を動かして、ビルドのオプションを設定し、必要な中間ファイルを作成したりして、最終的に「Makefile」が作成される。色無く機能してもらい、一元管理したい。結局、「Makefile」だけの工夫で、全てまかなえている。common/font6x12.cppこれは、「RL78/G13」の「Makefile」の先頭部分ではあるが、基本的に、ソースコードの指定だけすれば良い。従属規則は、自動で生成される。用ソースとなっている。バックスラッシュで改行をエスケープして、1行に1ファイルとしている。※この方が見やすいし、再利用する場合に利便性が高い。「VPATH」は特別な変数で、この場合、一つ手前のディレクトリー以下にあるファイルを参照出来るようにしている。サーチするディレクトリのリストを指定します。「BUILD」に「release」とすれば、リリースビルド、「debug」とすればデバッグビルドとなる。生成されたオブジェクトは、「release」又は「debug」ディレクトリーが作られてその中に全て格納される。この中には、従属規則のパスが記述されたファイル、「source.d」も格納される。使わない理由の一つだと思う。-DNDEBUGendifビルド・ディレクトリーが「release」か、「debug」で、コンパイル・オプションを切り替えている。新が起こった場合に自動で対応するソースをコンパイルする事が出来る。この規則を自分で記述するのは愚かと思えるくらい面倒で、ソースのインクルードを増やしたり減らしたりする度に記述をやりなおさないとならないし、インクルードを全て巡らないとならない。入門編などでは、これを入力させるように説明している事が多い。そこで、これらを、ソースコードから辿って、自動で生成する事にした。全なパスを生成するように工夫している。※「DEPEND_ESCAPE」は、特定のヘッダーで、従属規則が正しく生成できない場合に、それをエスケープする。endifendifこの判定で、変数「SYSTEM」にOSの属性が代入される。「OSX」の場合、「OSX_VER」にバージョン番号が代入される。hiraコメントする前回、大きなプログラムが動かない場合がある不具合の原因を取り除いてから、信頼性が向上した為、ようやく不安無く大きなプログラムを作る事ができるようになった。そこで、以前に作ったWAVプレイヤーに、LCDファイラーなどを合体させて、単独で機能するプレイヤーにアップデートしてみた。wav_play_sample.elfかなり巨大になり、書き込み時間もそれなりにかかるようになった・・・RAMは、合計4Kバイト程、スタックに最大1Kくらいは使うと思うので5K程、まだまだ余裕がある、思った程消費していない。プログラムは、「15EF7」だけど、実際には0x3000から始まるので、96K程消費している。@340は、バランスが良いデバイスなのかもしれない。RL78のI/Oを制御するテンプレートクラスは、このような場合にリソースの割り当てが柔軟なので、かなり楽が出来る、しかも、余分なコードが入らないから、高速に動作し、メモリーの節約にもなる。組み込みマイコンに適した言語なのだと思える。WAVファイルには、TAG情報が含まれているので、それを表示している。再生中に、経過時間を表示したいが、16ビットステレオの44.1KHzでは、ループに余裕が無く、LCDの書き換えをリアルタイムに行なえない。SPI通信をDMAにするとか、時分割処理が必要なので、この機能は現在は実装していない、そのうち対応したい。外部に接続した、ターミナルには、経過時間(1秒毎)を表示している。ターミナルからの操作も常に受け付ける。hiraコメントするこのネタは、良くある複数スイッチを抵抗ネットワークでデコードして、1本のポートで読み込む為のガジェットで目新しさはあまり無い。原理と動作は、分圧する抵抗を適切に選んで、直線性を維持する事で(直線性が確かならデコードするソフトが楽なだけではあるけども・・)、かなり多くのスイッチをデコードする事が可能となる、ただし、入力は排他的で、上位のスイッチが常に優先される仕様となる。差が+-10%の範囲なら5個のスイッチを認識できる事になる。(計算方法が間違ってるかもしれないが・・)※又、一般に流通している抵抗値には、限りがあるので、微妙な抵抗値を使ったネットワークは作りにくい為、あまり多くのスイッチを並べる事は難しいと思われる。方向スイッチ:※試作では、6.8Kが無かったので、3.3Kを2個直列にした。変形として、ネットワークのトポロジーを変えて、複数同時押しが可能なようなものも作れる、ただし、多くのスイッチを判定するのはより難しくなる。hiraコメントするかなり昔にAVRマイコンで、データロガーを作成した時、既に漢字の表示は対応していたが、RL78でも漢字に対応した。表示フォントは12ピクセルを使う。示のバランス的には12ピクセルの方が好みな感じ。いくつか制限がある、漢字のビットマップフォントを置く容量が無い為、どこか別途、配置する必要がある。※RL78(256Kデバイスなら、Flashに置く事が可能)・12ピクセルフォントで、136キロバイト程の容量が必要。・1MビットのEEPROMにも入らない。・SDカードを接続するシステムなら、SDカード上に漢字ビットマップを置く事で、描画が可能。・キャッシュを設ける事で描画パフォーマンスを最適化。12ピクセルのフリーフォントは色々あるけれども、今回は、蕨12を使った。フォントデータはBDF形式なので、展開して、バイナリーデータにする。この際、SJIS形式の並びとした、そうする事で、効率良く配置でき、無駄が比較的少ない。SJISのコードから、漢字のリニアアドレスを得る関数として、以下のコードを使う。code;}BDF形式を展開して、バイナリーデータを作成するアプリケーションは、以前に作成した「bmc」を使う。バイナリーデータは、蕨12フォントSJISバイナリーに置いてある。漢字表示のアプリとして、ファイラーを作成した。ファイラーSDカード上のファイル選択の様子:・LCDの横幅を超えるファイルは、自動でスクロールする。・選択中は、反転表示。・ディレクトリーの移動が可能。hiraコメントするLCDに表示するプログラムを実装するようになって、何か、正しく動かない事が、頻発してきた。調べると、最適化オプション「-Os」を使う場合に、起こる事がある事が判った。使っていたのだが、プログラムの容量が増してくると、そうもいかなくなってくる。そこで、コードを簡単に追ってみると、スタック領域に配置された変数にアクセスする場合に、スタックのアドレス計算を間違っているような挙動だった。修正するには、スキルと時間が足りないように思う。そこで、回避策を色々試してみた結果、コンパイラオプション「-flto」を追加する事で回避出来ているように思う。詳細に調べた結果、RAMの初期状態に依存していただけだった。通常「.bss」セクションは「0」クリアするが、「.data」セクションは、何かの値をロードするので、そのままな状態になっている、これが、問題のようで、ロードしない場所は「0」クリアする必要がある。そこで、リセット時、全てのRAMを全て「0」クリアするコードを追加した。$LC0※レジスタ・バンクは触らない。この変更で、怪しい挙動は、無くなったようではある。コンパイラを作りなおす必要がある。するのはやぶさかでは無い。移ったので、その過程で、ビルドオプションを精査した。--enable-ltoを追加する。※「multilib」は以前は「disable」であったが一応「enable」とした。Optimization)を有効にするオプションで、これにより翻訳単位を超えた最適化が可能になる。合は、常に「有効」にする必要があるのかもしれない。※指定しないと、「有効」になっているようである。部分があり、どうしようか悩んでいたが、RSオンラインで、新品のLCDでもをそこそこの値段で売っている事を発見して、試しに買ってみた。置が必要で、グラフィックス液晶は、その候補の一つと思う。RL78では、メモリーがそこそこあるので、128×64ピクセル程度のモノカラー液晶なら、漢字も表示できるので、大抵のアプリケーションにマッチする。今回実験した液晶は、バックライトは無いものの、850円くらいで購入でき、(2000円くらいで、表示面積が大きいタイプもある)3.3V動作が可能なタイプで、消費電力も少ない。接続ピンのピッチが1.27mmだったので、変換基板と追加回路を組み込んだ。コントローラーは、ST7565Rで、データバスが8ビットだけど、シリアル変換モードがあり、SPI通信で接続出来る。表示に必要な外部回路(主にコンデンサの接続方法等)を探して、接続した。液晶では不安定で、正しく動作しなかったが、この液晶では、何の問題も無く綺麗に動作する。※やはり、ジャンクは、ジャンクと言う事なのかもしれない。6)※ソースコードには、ST7565、SSD1306どちらか片方を有効にする定義がある。これは、スタックベースの可変引数では、安全性が確保出来ない事に由来する。便利な事は判っていても、それから離れて、std::cout関係のクラスを実装する事となったと思う。使い続ける輩が後を絶たない。ある、柔軟性やコンビニエンス的な使いかってには、敵わない。遜色無い、利便性を手に入れたと思える。多くの組み込みメーカーではデバッグ以外では使わない事が普通で、リリースビルドでは、「#define」を使って「printf」を消している。依存していて、非常に多くのリソースを消費してしまう為、限られたメモリーしか無いようなマイコンでは、使う事が出来ない。「float、double」を使わない場合に余分なコードを節約したい等、カスタムしたい場合もある。廉価版を実装してみた。演算子をオーバーロードして、全く別の機能として使う事が出来る。これを利用して、「%」記号(通常は、整数の剰余)をオーバーロードして、引数を受け取るようにしている。題を含んでしまう為、エラーステータスによる処理を行なっている。拡張して、固定小数点の表示、二進数表示などを取り入れている。呼ぶような事も行なわない、純粋な物を実装したい。表示が必要な事は結構ある。表示が出来るように拡張してみたのだが、仕様が複雑で、難解な部分が多く、現状では、全ての仕様を満足するまでには完成度は高く無いものの、ある程度は、正しく表示できるのようになった。以下のような方針で実装してみた。(整数のみの計算で行なう)・なるべくメモリーの消費を抑える。キャストされて内部処理される。該当する部分を読んでみたが、あまりに複雑で、部分を抜き出して簡単に使えそうも無い事から、自分で考えながら実装してみた。その為、無駄な部分や間違いがあるかもしれない。変換した値や温度など表示する場合など、シフトしたり掛けたり割ったりして、実数部と小数部を分けて整数で表示する事が良くある。そこで、もっと簡単に扱えるように固定小数点表示をサポートしている。1.56・上の例では、全体5桁(小数点含む)、小数部3桁、小数点以下12ビットとして表示する。・内部では、小数部+1桁目を四捨五入して丸めて表示する。サポートが必要無い場合は、ソースの頭で、以下のようにコメントアウトする事で大幅にメモリーを節約できる。WITH_FLOAT_FORMAT※現状では、「double」の80ビットフォーマットをサポートしていない。マイコンで利用でき、もちろん、他のプラットホームでもコンパイルできれば、利用可能と思う。準拠するように修正を加えた。