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 |