2016-11-08 9 views
0

32ビットARMコアマイクロコントローラプロジェクトのCプログラムを作成しました。このプロジェクトは、私はディスプレイ用LCDの内蔵RAMにロードするテキストのための機能を書かれているLCDを持って、この関数は次のとおりです。関数の呼び出しに使用されるコードメモリ(C ARM-GCC)

/*------------------------------------------- 
* Name  : LCD_Show_String 
* Description : Load a line of text to LCD's RAM 
* Argument(s) : row - load to which row in LCD. 
*    *str - The text 
*    *font_table - the font table to be used 
*    *font_descriptor - information of the font table 
*    align - Align ALIGN_LEFT, ALIGN_CENTER or ALIGN_RIGHT 
*    print_now - 0: Do not print the text on LCD now 
*       1: Print the text on LCD immediately 
*    mode - PIXEL_ON, PIXEL_OFF or PIXEL_XOR (method to print each pixel) 
* 
* Return value: Total width of the string printed. 
* -----------------------------------------------*/ 
UINT16_T LCD_Show_String(UINT8_T row, const UINT8_T *str, const UINT8_T *font_table, \ 
       const UINT16_T *font_descriptor, LCD_Align_t align, 
       UINT8_T print_now, LcdPixelMode mode) 

私はこの関数を呼び出すとき:

LCD_Show_String(7, "TEST", small_font_bitmap, 
         small_font_des, ALIGN_CENTER, 0, PIXEL_ON); 

私は各ことがわかりました私はこの関数を呼び出すときに、40バイトのコードメモリを使い果たしました。また、関数内のパラメータの数を増やすと、必要なメモリが増えます。たとえば、もともと私はこの関数に13個のパラメータを持っていました。この関数を呼び出すたびに最大約100バイトを使いました。

私はそれは正常ですか?なぜそれは非常に多くのメモリを使い果たしたのですか?使用するメモリを減らすことはできますか?

コンパイラはARM GCCコンパイラ

ありがとうございます。

+0

MCUにはどのくらいのRAMが搭載されていますか? –

+0

それは16KBのRAMを持っていますが、私はRAMではなくプログラムメモリについて話しています。それは256KBのメモリを持っていますが、私はほとんどそれを使い果たしています。 – eepty

+0

'-Os'モードでコンパイルしようとしましたか? –

答えて

0

スタックフレームを作成するために関数を呼び出しています。あなたはR0〜R15を持っているので、それは16のレジスタです。あなたが親指モードでそれぞれ16ビットであれば、それはあなたに32バイト+返信アドレスと状態を与えるので、私はあなたに40バイトを与えるでしょう。私はこれを減らす方法を見ない。あなたは関数をインライン化することができます。 40バイトは本当にARM上では何もありません。

+0

私のARMは256KBのコードメモリを持っていますが、このプロジェクトは非常に多くの機能を備えており、ユーザーインターフェイスにはさまざまな画面がありますので、すべて256KBを使い果たしました。この機能は、何百回も呼ばれることがあります。以前はメモリを使い切っていたので、この関数でパラメータの数を減らすと、合計コードサイズは約20KBに減少することがわかった。私はRAMについて話しているわけではないことを覚えておいてください、私はプログラムメモリについて話しています。 – eepty

+0

@eeptyすべてのレジスタをスタックに "プッシュ"する必要があるので、プログラムコードメモリと同じメモリを使います。アセンブリを危険にしたい場合は、コードをインライン化するだけでも、レジスタのサブセットを使用していることがわかっていても、いくつかの変数だけをプッシュすることができます。私は残りの部分がゴミであることを知っていたので、戻りアドレスと3つのレジスタだけをスタックにプッシュしましたが、それは危険なパスです。また、コードを管理するのが難しくなります。 –

関連する問題