TipsTweetIARでは任意の関数をRAMから実行するのに、魔法のキーワードを付けて関数を定義するだけで、簡単にRAMに配置、フラッシュから自動的にコピーしてくれました。IDE、いわゆるGCC環境ではどのようにすれば良いのでしょうか?今回は、そんなGCC環境で特定の関数をRAMから実行するには、どのようにするのか紹介します。EWARM(以下、EWARM)と同様に非常に簡単です。基本的には、EWARMと同様にあるキーワードを付加するとその関数や変数がRAMに配置されます。EWARMなら関数のRAM実行が超簡単!魔法の呪文1つだけ。はい、では、行ってみましょう。要点__attribute__キーワードが必要.dataセクションに配置するFlashROMの.dataセクションからRAMセクションにコピーするのは、自動的にやってくれる__attribute__キーワード__attribute__キーワードは、GCCのオンラインドキュメンテーションでは、以下のように説明されています。(GCC)特に、関数の属性を宣言するために使用されるもので、コンパイラが関数の呼び出しを最適化したり、コードを慎重にチェックするのに役立つとあります。コードの配置、コード生成のオプション、更にはアノテーション付きの関数でのコール・戻り値を制御できるとあります。アノテーションって、C言語では使わないですよね。割り込みハンドラの関数だと明示して上げると、コンパイラが割り込みハンドラに最適な関数のエントリやエグジットを生成してくれるそうです。この__attribute__キーワードは、変数や構造体などにも使用でき、関数や変数の配置も制御できる訳です。属性longcall:関数アトリビュートとしての属性で、指定した関数が実行場所が異なることを明示します。:特定のセクションに変数や関数などを配置します。これら、属性を指定することで、指定した関数を指定したセクションに配置できます。変数をメモリ配置する場合には、longcallは必要ないです。))括弧をダブルで囲む必要があります。リンカースクリプト変数や関数の配置場所は、リンカースクリプト内に記述されているRAM領域を指定ます。SDKのリンカースクリプトを見て行きましょう。SDKでは、デフォルトで上記data、data_RAM2、data_RAM3セクションに指定された変数や関数をRAMに配置することが可能です。変数とコードの配置セクションこのリンカースクリプトでは、全てのオブジェクトファイルに対して、.ramfanc.$RAM2と.ramfanc.$RAM3のセクションに指定されている変数や関数を、それぞれdata_RAM2とdata_RAM3セクションに配置すると記述されています。.dataセクションは、全てのオブジェクトファイルに対して、.ramfanc*とあるので、上記以外の.ramfancが付くセクションは、全て.dataセクションに配置されるようになっています。AT>PROGRAM_FLASHそして、実際に格納されるのが、PROGRAM_FLASHになり、実行される場所がRAM領域になります。SDKでは、実行される場所の”RAM領域”として、KinetisのSRAMには上位アドレスバンク(SRAM_UPPER)と下位アドレスバンク(SRAM_LOWER)があります。フレックスメモリ対応製品ではFLEX_RAM領域があります。SRAM_LOWERのRAM領域に配置させたい場合には、__attribute__属性セクション指定で、.ramfanc.$SRAM_LOWER(.ramfanc.$RAM2も可)とセクション指定すると、.data_RAM2セクション(下位アドレスRAM)に配置されるようになります。気にする必要がなければ、.ramfancセクションに指定すると、.dataセクション(SRAM_UPPER領域)に配置されます。FlashROMからRAMへのコピーは自動でやってくれて楽チンリンカースクリプトでRAMに配置しても、実際にコードが格納されるのはフラッシュメモリ(PROGRAM_FLASH)です。コード実行される時は、指定したRAM領域から実行されます。RAMは電源が落ちるとコードは消えて無くなります。そのため起動時にFLASHからRAMに配置指定した変数や関数をコピーする必要があります。SDKでは、スタートアップコード内でこれらRAM領域の変数や関数を自動でコピーしてくれるので、__attribute__属性でセクション指定(.data、.data_RAM2、.data_RAM3)すると、RAM内のこれらセクションを自動的にコピーしてくれるので楽チンです。./utilities/fsl_assert.oちゃんとSRAMの下位アドレスバンク0x1FFF0000(SRAM_LOWER)に配置されていますね。まとめIAR社のEWARMでは、__ramfuncキーワードを付けるだけでしたが、GCC環境でもこれと同等のキーワードとして、__attribute__キーワードがあります。この属性でRAM領域を示すセクションに指定してあげることで、自動的に変数や関数をRAMに配置させ、関数ならRAM実行が可能になります。RAMを有効活用する際に、参考にしてください。siteプロフィールマイコン大好き、マイコンで何でも出来るをモットーにどんどん記事をアップしていきたいと思っています。マイコンは特に、NXPマイコンが好きです。KinetisやLPCマイコンを中心に幅広く投稿していきます。横浜のNXPファンお問い合わせは、こちらから。(7)ブログをメールで購読メールアドレスを記入して購読すれば、更新をメールで受信できます。