Luaスクリプトのメモリ使用

様々なlua APIが使用者に自分の機能を実装の可能にする。でも、このプラットフォームでプログラムするのは色んな制限があります、その中、メモリの使用が一番です。 多分貴方が「マイコンのプログラミングがピーシーに違う、マイコンのリソースが大変厳しい」を知っています。このマイコンに、合計メモリは128キロバイトであります、現在、使用者に利用可能なメモリが80キロバイトくらいです。開発者がPCにのようでメモリを使用すると、速くメモリが不足になってしまいます。ただ、若干なルールを従うと、複雑な機能を実装するスクリプトを書くことが可能になります。

メモリ使用

このプロジェクトで、以下の部分のメモリを使います:

  • 静的に使用したBSSセグメントに、インタラプトのスタックとUSBのバッファーと画面のバッファーと色んな頻繁に使用するバッファー、変数を含みます。この部分は、今まで26キロバイトであります。

  • UIのスタック、バックグラウンドなサービス(データキャプチャーやluaインタプリタや急速充電トリガー)、PCアプリのインターフェース、RTOSでクリエイトしたタスク。この部分20キロバイトであります。

  • 残しました80キロバイトが空きます、luaスクリプトがこの部分を使用することができます。

メモリ使用量を監視する

開発者が、PCアプリで、「Luaスクリプト」パンネルで見えます。 スクリプトで: sys.gFreeHeap() を呼び出して空きヒープをゲットします sys.gFreeHeapEver() を呼び出して起動以来最大使用した時に空きヒープをゲットします sys.gTotalHeap() を呼び出して合計ヒープをゲットします

lua言語の考え

80キロバイトのメモリが、随分多い機能を実装するできるでしょう。 ファームウェアが、46キロバイトで全ての機能実装した。

実は、他のファクターを含みましたら、状況は違う。

ファームウェアが全てC言語で実装しました、ただし、luaは動的で高水準なプログラミング言語ので、メモリ使用量が大きくなっている。例えば、number型(このプラットフォームでfloatにしました)luaで22バイトのメモリを占めます、Cで4バイトだけです。この例で、luaスクリプトが5倍のメモリを占めました。他にも、Cに比べて、関数の呼び出しや、バイトコードのロードや、メモリの使いが多い。

主にはメモリのピーク使用量

組み込みシステムで、安定性が大事な考えであります、メモリの割り当ての失敗することができません。このシステムが、メモリの割り当てが失敗したら、すぐに全ての機能を停止すると、メモリ失敗のダイアログを表示することをデッサンしました。このエラーを解除すれば、再起動しかありません。 組み込み失敗したら、あなたのスクリプトが、リソースをリリースやダイアログを表示することができません。あなたのスクリプトが、ピークのメモリ使用量が絶対にマックスになれません。

ヒント1: スクリプトをモジュール化にする

スクリプトを実行する時、全てのファイルをメモリに読み込みする、そして、バイトコードに翻訳をする。つまり、ある瞬間に、スクリプトとバイトコードが、同時にメモリを占めます。

考えある40キロバイトのスクリプト、40キロバイトのバイトコードにコンバートを想定します。メモリのピーク使用量は80キロバイト、これは随分ギリギリでしょう。

でも、四つのモジュール、一つが10キロバイト、10キロバイトのコンバートしたバイトコードを想20定、こうすると、全てrequireでロードの時、ピークなメモリ使用量がは40+10=50キロバイトになりました。

ヒント2: コードをプリコンパイルする

普通に、ヒント1がメモリ使用をいい範囲にするのは十分ですが、あなたがコンパイルにのメモリピークを消すことができます。sys.gByteCode({path},[option])を実行すると、入力ファイルの同じディレクトリで *.lc の出力ができます。オプションのパラメータsys.RESERVE_DEBUG_INFOを使えれば、デバッグ情報を残すことができます。

下記がどのくらいにメモリをセーブできるの例です: テストファイル UI_Demo.lua サイズ5.23キロバイト | 条件 | ピークメモリ使用量 | | —— | —— | | *.lua 直接に | 29.64KB| | *.lc RESERVE_DEBUG_INFO | 19.52KB | | *.lc STRIP_DEBUG_INFO | 16.00KB |