NEC ELECTRONICS NEC ELECTRONICS
NEC electronics NEC electronics NEC
ホーム
アプリケーション
製品情報
先端技術
サポート
WEBショップ
ニュース&イベント
会社案内
header
GO
詳細検索機能/特性検索
サイトマップ お問い合わせ

コード・サイズ削減の記述


目次

    
FAQ-ID = 78k0-nnn
249: スタティック・モデル使用時に注意することはありますか?
312: 計算過程の途中でダブルワード型の数値を扱う場合の合理的なプログラムの記述方法は?
97: norec、noautoを付けてもよい関数の見分けるには?
261: noauto、norec関数は外部参照できないのですか?
600: norec関数内より#pragma inline指定ありのmemcpy関数を呼び出していますがエラーになりません。

78k0
-249
スタティック・モデル使用時に注意することはありますか?
Q
ROMのサイズを小さくするためにスタティック・モデルを使用したいのですが、 注意することはありますか?
A
スタティック・モデルは、引数/オートマティック変数を静的に確保しているので、 再帰関数は引数/オートマティック変数の内容が破壊される可能性があります。

割り込み時に処理中の関数が呼び出された場合、 引数/オートマティック変数の内容が破壊される可能性があります。

また、割り込み時に処理中の関数が共有領域を使用している場合でも、 共有領域の退避/復帰は行いません。

-78K0- -78K0S- -78K4- -78K0R-

この情報はお役にたちましたか?
back to top  

78k0
-312
計算過程の途中でダブルワード型の数値を扱う場合の合理的なプログラムの記述方法は?
Q
計算結果はバイト型で収まる数値になりますが、 計算過程の途中でダブル・ワード型が必要な場合の最も合理的なプログラムの記述方法は?

例)
AのBにおける百分率Cを四捨五入して求める。

計算式 :
C=(A×100+B÷2)÷B
以下のような記述した場合、答えCをlong int宣言することになり、領域の確保が1バイトで済むところを、 4バイトも確保しなければなりません。
アセンブラで記述すれば#asm以降のような記述で答えが出ます。
このようにCで計算過程の途中の数値だけをダブル・ワード型にできますか?
void _x()
{
         c = ((unsigned long int)a * (unsigned long int)100 + (unsigned
long int)b / (unsigned long int)2) / (unsigned long int)b;

/*
     #asm
          extrn     _a
          extrn     _b
          extrn     _c

          movw ax, !!_a
          movw de, #100
          muluw     de
          movw bc, !!_b
          shrw bc, 1
          addw de, bc
          addc x, #0
          addc a, #0
          movw bc, !!_b
          divux     bc
          mov  !!_c, e

     #endasm
*/
}
A
#pragma mul
#pragma div
unsigned int a, b;
unsigned char c;

void _x()
{
        c = (unsigned char)divux((unsigned long)(b / 2) + muluw(a, 100), b);
}
のように記述してください。

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-97
norec、noautoを付けてもよい関数の見分けるには?
Q
norec、noautoを付けてもよい関数を見分けるには?
A
[noauto関数]

ローカル変数を使用していない関数のことです。
以下の2つ条件を満たす関数であれば、noauto関数にできます。

・マニュアル中の「noauto関数引数使用レジスタ」のルールで、 関数の引数をすべてレジスタに割り当てることができる。

・関数の引数割り当てで余ったレジスタおよびレジスタ変数用saddr2領域に、 すべてのオートマティック変数が割り当たる。

[norec関数]

この関数から他の関数を呼ばない関数のことです(スタック・フレームが無用)。
以下の3つの条件を満たす関数であれば、norec関数にできます。

・関数自身から他の関数を呼び出していない。

・マニュアル中の「norec関数引数使用レジスタ:受け側」のルールで、 関数の引数をすべてレジスタおよびnorec関数の引数用saddr2領域に割り当てることができる。

・関数の引数割り当てで余ったレジスタ、norec関数の引数用saddr2領域、 およびnorec関数のオートマティック変数用saddr2領域に、すべてのオートマティック変数が割り当たる。

注)記述中のsaddr2領域は-QR指定時のみ有効です。

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-261
noauto、norec関数は外部参照できないのですか?
Q
noauto、norec関数を外部参照することができません。

たとえば、sqnc.cで
norec void init(void)
を宣言し、main.cで
extern void init(void);
と宣言すると、リンク時にエラー・メッセージ

F403 Illegal indirection

が表示されます。また、
extern norec void init(void);
と宣言すると、main.cでアセンブル時にエラーが発生します。
A
norec extern void init(void);

と記述してください。


-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-600
norec関数内より#pragma inline指定ありのmemcpy関数を呼び出していますがエラーになりません。
Q
norec関数内より#pragma inline指定ありの memcpy関数を呼び出していますがエラーになりません。
A
インライン展開するため、Cコンパイラは関数と認識せず、 norec関数が有効になります。

#pragma accessのpokeb関数、peekb関数もインライン展開するため norec関数が有効になります。

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  





















 ご利用にあたって  個人情報保護について  RSS       © 1995-2008  NEC Electronics Corporation