2 Replies Latest reply on Sep 11, 2020 1:19 AM by JuIn_1625121

    Community Translation - ImageCraft code size optimization

    JuIn_1625121

      Hi

       

      I want to translate ImageCraft code size optimization.

      ImageCraft code size optimization

      Please confirm to my work.

       

      Best Regards,

      Inoue

        • 1. Re: Community Translation - ImageCraft code size optimization
          JuyoungJ_06

          Hi, Inoue-san

          Confirm to work this KBA, please work to do.

           

          Thanks

          Jenna

          • 2. Re: Community Translation - ImageCraft code size optimization
            JuIn_1625121

            Original:ImageCraft code size optimization

            =======================================================

            タイトル:ImageCraftでのコードサイズの最適化

             

            回答:

            質問:ImageCraftコンパイラでコードサイズの最適化を実現するためのポイントを教えてください。

            返答:

            ImageCraft のコードサイズを最適化する際には、この記事で紹介するようないくつかのポイントがあります。

            再配置可能なコード開始アドレス

            これはコンパイラが再配置可能なコードを配置し始めるアドレスです。 boot.asm コードの終わりより後ろの値を設定する必要があります。最適な「 再配置可能なコード開始アドレス」は、boot.asm コードの直後です。このアドレスが必要以上に大きい値になると、boot.asm コードの終了から再配置可能なコードまでの間のメモリを埋めるために、HALT がhexファイルに追加されます。 その結果、コードスペースが無駄になります。

            ブートコードの終わりは map(project_name.mp)ファイルから取得することができ、同じものを再配置可能なコード開始アドレスとして設定することができます。

            Area                               Start  End    Decimal Bytes (Attributes)

            --------------------------------   ----   ----   ------- ----- ------------

                                         TOP   0068   00F5 =    245. bytes (abs,ovr,rom)

            上の例では、 TOP領域はアドレス 00F5 で終了しています。再配置可能なコード開始アドレスを設定するには、Project >> SettingsメニューでLinkerオプションを選択し、Relocatable Code Start addressに00F5を入力します。

            boot.asm のサイズはデバイスファミリやグローバルパラメータの設定によって異なります。 そのため、グローバルパラメータに変更があった場合は、.mpファイルを確認し、Relocatable Code Start Addressを調整してください。

            割り込みサービスルーチン(ISR)における関数呼び出し

            C言語のISR内部から関数が呼び出されると、ImageCraftはすべての仮想レジスタ(__r0, __r1, __rx, __ryなど)をスタックに "プッシュ "し、リターンの前に "ポップ "します。 プロジェクト内の仮想レジスタの数にもよりますが、これは最大120バイトのコードスペースを増やすことになります。 そのため、ISR の内部から関数を呼び出すことは避けてください。 良い方法としては、ISRの内部ではフラグを設定して実際の処理はフォアグラウンドで行う、といったことがあります。

            コンフィギュレーションの初期化

            最適なコードサイズにするには、Project >> Settings >> Chip Editorの “Configuration Initialization Type"で「Loop(size efficient)」を選択します。

             

            このオプションを選択すると、psocconfigtbl.asmファイルは表を利用してコンフィギュレーションレジスタの初期値を格納し、これらの表をループすることでコンフィギュレーションレジスタをロードします。これにより、実行時間を犠牲にしてコードスペースを大幅に節約することができます。"Direct Write"オプションを選択すると、各コンフィギュレーションレジスタは "mov reg[]... "命令で書き込まれます。

            サブリメーション  - 未使用のAPIを削除

            サブリメーション機能を使用して、コードから未使用のAPIを削除します。 Project >> Settings メニューで"Code Compression Technologies" の下にある Sublimation オプションを有効にします。

            コンデンセーション(重複コードの排除)

            上のスクリーンショットの画面で、Condensationオプションを有効にすると、コンパイラはプロジェクト内で繰り返し現れるコードをサブルーチンで置き換え、コードが現れる場所ではこのサブルーチンを呼び出します。これにより、コードを大幅に削減することができます。

            浮動小数点演算

            浮動小数点演算ライブラリは整数演算ライブラリよりも多くのコードスペースを占有します。そのため、可能な限り浮動小数点演算の代わりに整数演算を使用してください。

            コードの一部をアセンブラに変換

            丁寧に書かれたアセンブリコードは、コンパイルされた'C'コードよりも小さいことが多いです。そのため、可能な限り、'C' コードの一部をアセンブリコードに変更してみてください。

            "Switch "文 と "if-else if "文

            1バイト変数(BYTE)のスイッチ文の場合、ImageCraftコンパイラはスイッチ構文よりもif-else構文を使用することでより効率的なコードを生成します。サイズの違いについてバイト数でみた場合、9バイト+各ケースにつき5バイトです。例えば、デフォルトの項目を備えた4ケースのスイッチ文は、"if - else if "を使用した同等の実装よりも、(9 + 5 * 4) = 29バイト多く使用します。

            スイッチ文が2バイト変数(WORD)の場合、結果的にコードサイズは "switch "と "if-else if "のどちらの実装でもほぼ同じになります。