書かれたコードを呼び出すための機能追加がされた。ひとつ前の記事では、CプロジェクトをHEXファイルに変換し、そこから必要なC関数を呼び出す方法について述べた。この記事では、もう一つの方法について述べる。HEXファイルに変換する方法においては、複雑なCでのコーディングが必要な多くの事例に対応できる。クラス)の実装について述べた。コードに変換してプログラムに埋め込む方法を取る。HEXを介する方法と比べた長所は、以下の通り。プログラムの場合はこの記事で述べる方法が有利である。プログラムが意図したように動作しない場合は、HEXを介する方法に移行すればよい。呼び出す例について述べる。a+b;}この例を説明するために、GitHubレポジトリーを作成したので、参照していただきたい。見ていただければ、説明が分かりやすいと思う。この記事では、1から5までの手順ごとに該当レポジトリーへのリンクを付けたので、そちらも見ていただきたい。Cのプロジェクトを一つ作成する必要がある。何でも良いのだが、ここではpico-examplesからhello_usb.cを選んで、若干変更した物から始める事とする。World!」と表示し続けるプログラムだ(前の記事と同じ)。0;}このプロジェクトをcmake/makeでビルドすると、hello_cw.uf2に加えてhello_cw.hexが作成されることが分かる。このようにして作成されたhexファイルを用いることになる。2.目的のコードを、プロジェクト内に記述するCアプリケーションを記述してテストする環境が整ったので、ここで目的のコードを書いてみる。ひとつ前の記事の方法とは異なり、この記事の方法では、プログラムはRAM上ではなくフラッシュ上に構築する方法を取る。上で述べたadd_values()関数を追加して、テスト結果を表示するようなものにした。コンパイラーの最適化を無効にするため、CMakeFiles.txtに次の記述を追加している。コードを埋め込もうとする場合、以下の点に注意が必要だ。R3を使用する)から変更されないようにするa.の対策のためには、必要な関数がすべて、「main()」関数、もしくはそこから呼び出される関数の中で、最低一度は呼び出される必要がある。ないと、リンクの際に不必要な関数コードとして、削除されてしまう。Cコンパイラー(gcc)が行う最適化のために、関数がインライン展開されてしまう事もあり、そうなると外部から呼び出すことができなくなってしまう。これを防ぐ方法にはさまざまあり、1:目的の関数を「main.c」とは別のファイル内に記述する、2:「__declspec(noinline)」アトリビュートを使う、3:最適化を行わない、などがある。コンパイラーの規約に関係するもので、これを遵守しないと(引数を5つ以上にしてしまうと)、正常に動作しない。c.の対策は色々と複雑で、同一のCファイル内で目的の関数を呼び出している場合に変なレジスター使用が起こるようだ。最適化の一つなので、当然ながら最適化を行わないようにすることで回避することができる。以上の事から、トラブルを防ぐにはgccの最適化を停止することが有効である。CMakeLists.txtに「add_definitions(-O0)」の一行を加えたのは、そのためである。特殊な作例で、実行速度が最大でないといけないようなケースにはこの方法は使えないが、そうでなければ、最適化を停止して使用するのが無難だろう。4.PHPスクリプトを配置する作成されたHEXファイルを呼び出すBASICプログラムを自動作成するためのスクリプト「c_convert.php」を用意した。このスクリプトは、PHPで記述されているので、PHPがない場合はインストールが必要である。このPHPスクリプトは汎用であるが、冒頭の記述(13-34行目辺り)を若干編集して使用する。今回の例では、次のようになっている。$hex_fileでは、ビルドの際に作成された「*.dis」「*.map」「*.hex」の3つのファイルの位置を指定する。$debug_fileはオプションで、PC-Connect機能を利用してデバッグを行っている際の、BASICファイルの位置を指定する。必要が無い場合は、「//」でコメントアウトしておく。$functionsには、BASICから呼び出したいCの関数名を列挙しておく。$rodataには、自動認識されないが必要な部品名を文字列で指定したリストを指定する。逆に、$excludedには必要のない部品の物理アドレスのリストを指定する。通常は、$rodataと$excludedの設定は変更の必要は無いはずだ。5.Cプログラムのビルドと、PHPスクリプトの実行ここまで準備できれば、Cプログラムをビルドした後に、PHPスクリプトを実行する。「result.txt」と「log.txt」の二つのファイルが出来ているはずだ。ここでの例のように進めると、「result.txt」の内容は次のようになる。コードを埋め込んで呼び出しできるようにした、必要最小限の構成になっている。INIT_C」と4行目の「end」の間に書けばよい。次のように変更して、BASICプログラムを完成させてみよう。C_RODATAあとは、このBASICプログラムをMMC/SDカードにコピーすれば、実行することができる。実行時のスナップショットは、以下の通り。以上が、簡単なCコードをBASICプログラムに埋め込んで呼び出すための手順である。埋め込む動作をしている。プログラムが正常に動作しない事が起きうる。ファイルを作成する方法の方が対応できる範囲が広いので、そちらを試していただきたい。取り込みについて述べたが、手続きが複雑であった。プログラムならこの記事で書いた方法でより簡便に取り込める。応用範囲がさらに広くなることを、期待している。