[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[pilot-tech-ml 90] スタックの拡張 方法
こんばんは、福本です。
以前から「Drag&Drop」のモジュールからJ-OSを呼び出すとスタックが溢れて飛ん
でしまう問題が有ったのですが、シャワーを浴びているとき(^^)にふとある方法を思
い付いて実験してみました。で、以前「Tango」が使えなかったというユーザーの方
に試してもらったのですが、うまく動作したようでした。ただ、繰り返し呼び出すと
フリーズしたそうです。このフリーズはどこに関係するのか分からないので、この方
法が完全だとはまだ言い切れないのです。
そこで今回とった方法についてご意見を戴けたらと思います。その方法は、「新規
にスタックスペースを確保して、すり替える」というものです。具体的には、
// A7がスタック?
ULong saveStack, newStack, p;
newStack = (ULong) MemPtrNew (dStackSize);
if (newStack != 0)
{
p = newStack - dStackSize;
saveStack = __getA7 ();
__setA7 (p);
}
outHandled = handleFieldDown (&event, FrmGetActiveForm (), inField);
if (newStack)
{
__setA7 (saveStack);
MemPtrFree ((Ptr) newStack);
}
という具合にhandleFieldDown()を呼び出す前にメモリを確保して、現在のA7レジス
タをすり替えています。皆がこの方法を取ると大変なことになりそうですが...
ちなみに __getA7()と__setA7は、CodeWarriorのライブラリソースを見てて見つけ
ました(^^)。
アセンブラの知識はほとんど無いのですが、考え方は有っていますよね?
いかがでしょうか?
----------------------------------
Shuji Fukumoto
fukumoto@wakuwaku.ne.jp
PXY00620@niftyserve.or.jp
http://www.wakuwaku.ne.jp/shuji/
Hiroshima JAPAN
----------------------------------