討論區: 開發者論壇 (Thread #24448)

タスクのスタックの生成方法 (2009-11-02 22:37 by (del#40607) #46789)

今の手法は、Toppers Threadのスタックから全タスクのスタックをOS起動時に強制取得します。
本来ならスタックはcfg.exeで自動生成される、example¥sample1¥kernel_cfg.c にglobal変数で確保されるのですが、こちらはすべて無視されています。
さらにこれらは、_kernel_tinib_table に登録されていますので、コンパイラが自動削除することはなく、単なる無駄領域として残ってしまいます。

なぜ、Threadのスタックからタスクのスタックを取得するかは、setjmp/longjmp の仕組みを使っているからです。
本当は kernel_cfg.c で確保されるスタックを使いたいのはやまやまです。

一応、今の手法でも回避策があり、kernel_cfg.c で確保されるglobal領域を極力抑えることができます。
それは、スタックサイズを 1 にすることです。Toppers JSP for iPhoneでは、最低でもスタックサイズがMINSIGSTKSZ(=32kB) は各タスクとも確保します。タスクのスタックサイズをConfiguratorで 1 に設定しても、32kB は必ず確保されるので安心です。

RE: タスクのスタックの生成方法 (2009-11-03 09:29 by (del#40607) #46797)

ASP の maxosx 依存部を見てみると、こちらはまた違った手法を使用していました。
タスクのスタックはcfg.exeで自動生成されるglobal変数を使っていて、この点は大変理想的な実装です。
ただ、これをするために無理をしているところもあります。それはjmp_bufにPCとStackアドレスを直接埋め込んでいる点です。これをすると、完全にCPU依存になってしまいます。PPCとi386用の設定がASPにあるのはそのためです。
さて、これをiPhoneでするとどうなるでしょうか。それぞれCPU毎にjmp_bufの設定を書く必要があります。iPhoneはARMを使用していますのでARM用の設定方法を書きます。Simulatorはどうかくのでしょうか。おそらくi386用の設定でいいかもしれません。それでは、iPod Touchはどうでしょう。ARMにもいろいろ種類があるのでまた違うかもしれません。それでは今後発売されるiPhoneやiPod Touchはどうでしょう・・・。きりがありません。
したがって、強力にCPUに依存するASPの方法は採用するとこはやめます。

まとめると
・ASPの手法:jmp_bufに直接値を入れる:    メモリの有効利用○ CPUの汎用性×
・JSPの手法:規格通りsetjmpでjmp_bufに代入: メモリの有効利用× CPUの汎用性○
で後者を選んで実装しています。
回覆: #46789