DATE : 2006/12/20 (Wed)
BREW シミュレータの「BREW 出力ウィンドウ」に次のようなログが出力された場合、メモリ関係のバグが発生しています。(以下は、「BREW シミュレータ 3.1.2.17」での例です。「?」には、特定の値が入ります)
*OEMOS.c:556 - BPOINT Type ?, Address: ????????
「Address:」の値はメモリ内のバグの発生したアドレスで、実行するプログラムによって変わります。
このログの中の「Type ?」という部分が、バグの内容を表しています。
この「Type」には1~4まであります。それぞれが表す内容は次の通りです。
- Type 1
- MALLOC 関数などで確保したメモリ領域が解放されていないメモリリーク
- Type 2
- 取得した BREW インタフェースが解放されていないメモリリーク
- Type 3
- メモリ領域の二重解放
- Type 4
- 確保・解放されたメモリ領域の情報を管理しているノードの異常
(;^ω^)案外目立たない出力なので、注意が必要ですね。
参考文献
DATE : 2006/12/18 (Mon)
(前回の記事)
BREW 全体の処理
BREW 全体は、イベントやコールバックの行列と言えます。
BREW AEE(Application Execution Environment、アプリケーション実行環境)はシングルスレッドですが、複数のアプレットを実行できます。
その実体は、実行する処理を溜め込むための単一のキューにあります。
各アプレットからは、実行したい処理がキューに次々と登録されていきます。そこで BREW AEE はキューから処理をひとつずつ取り出しては実行します。それぞれの処理はごく短いものなので、このような動作を繰り返すことで複数のアプレットを同時に実行しているように見せかけています。
ここでいう「処理」が、コールバックやイベントに当たります。コールバックやイベントを使用すると、キューに実行したい処理を登録することができます。登録された処理は BREW から直接呼び出されることになるので、時間のかかる処理でも細かく分けることができれば、再起動される時間を気にせずに実行できるというわけです。
(つづきます)
参考文献
DATE : 2006/12/16 (Sat)
携帯電話内で動作している全 BREW アプレットは、単一スレッド上で動作します。すると、あるアプレットがフリーズしてしまうと、他のアプレットの実行もできなくなってしまいます。
そのため、一定時間以内に処理が終わらなければ BREW そのものが再起動する場合があります。この「一定時間」というのは、機種によってまちまちですが、大体は1秒程度なのだそうです。
そのため、各アプレットの処理の一つ一つは1秒以内に終わるように開発しなければいけません。
具体的には、イベントやコールバックを使って時間のかかる処理を細分化することになります。
( ^ω^)しばらくは、このあたりの情報を取り上げてみたいと思います。
(つづきます)
参考文献
DATE : 2006/12/11 (Mon)
BREW には、文字型が2種類あります。1バイトの文字を表す文字型と、2バイトの文字を表すワイド文字型です。具体的には、以下に示す型で定義されています。
文字の種類 | 型 |
---|---|
1バイト文字 | char |
ワイド文字 | AECHAR(符号なし2バイト整数) |
ワイド文字も1バイト文字同様、文字列の末尾はヌル(0)です。
BREW では、文字列のエンコーディングは機種依存です。ただ、日本の機種では Shift_JIS が多いようです。
1バイト文字からワイド文字への変換を行うには、STREXPAND 関数(AEEStdLib.h)を使用します。char 値はそのままに、1バイト文字が2バイトに拡張されてワイド文字となります。2バイト文字はそのままワイド文字になります。
逆に、ワイド文字から1バイト文字への変換には WSTRCOMPRESS 関数を使用します。
以下は、STREXPAND 関数を使用するサンプルコードです。
char string = "文字列"; AECHAR wideString[4]; STREXPAND((const byte*) string, STRLEN(string), wideString, 4 * sizeof(AECHAR));
(BREW 3.1.2 API リファレンスでは、STREXPAND 関数の第1引数は const char* 型と表記されていますが、実際には const byte* 型です。ここで、byte 型は unsigned char と定義されています)
ちなみに、紛らわしい関数に STRTOWSTR 関数と WSTRTOSTR 関数があります。STRTOWSTR は文字列の1バイト1バイトを全てワイド文字に変換します。つまり2バイト文字の1文字がワイド文字2文字に変換されてしまいます。WSTRTOSTR 関数は、その逆です。
そのため、1バイト文字と2バイト文字とが混在した文字列とワイド文字列との変換には、STREXPAND 関数と WSTRCOMPRESS 関数を使用します。
また、UTF8TOWSTR という関数もあります。一見、UTF-8 から機種に合った文字エンコーディングに変換する関数のような気もしますが、実際には UTF-8 から UTF-16 に変換する関数です。
参考文献
DATE : 2006/11/29 (Wed)
BREW で取得できる方位や進行方向の0度は、
通常の方位磁針が指す0度は磁北です。一般に「北」と言うと、北極点に向かう方角のことを言います。しかし、地球の磁場は地軸とずれており、さらに地域によってゆがんでいます。そのため、北極点に向かう方角を真北、地磁気の北を指す方角を磁北と言います。
BREW で取得できる方位は BREW API ドキュメントの IPOSDET_GetOrientation 関数の項目に書かれています。
そして IPOSDET_GetGPSInfo 関数で取得できる進行方向は TIA/EIA IS-801規格(PDF)に準拠しています。この規格書の P.3-48 に、次のような記述がありました。
0 degrees is True North and the angle increases toward the East.
ここから、BREW の方位・進行方向の0度は真北(True North)を指すことが分かります。