(toppers-users 3316) Re: Cortex-M3版 TOPPERS/ASPのistackが変だと思います

koizumi yoshiyuki koizumiyoshiyuki @ gmail.com
2010年 12月 13日 (月) 11:19:14 JST


 高田先生

 有り難うございます。もう一箇所修正が必要ですね。別件の不具合(?)も連絡します。

1 スタックサイズの記述
 DEFAULT_ISTKSZはByte単位で表現ですね。了解です。
ここのコメントに8で割るとかかれてています。割るなら本来4だろうし・・・、sizeof()で書いて欲しいと思ったり・・・。最初が違っていたので、以降のdefine定義を読み切れませんでした。(問題が1つだけでは無いので、やむを得なかったと自分を許そう・・)

 mapファイルで確認
_kernel_istack      0x1000            ./obj/kernel_cfg.o
2 上記を修正でスタックは確保できましたが、スタックポインタがが合いません
 ソースの記述は以下の通り

 (FP)(TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ)),   // 0 The initial
stack pointer
 スタックに設定された値は0x20009170です。mapファイルで番地を確認すると

                0x10001170                _kernel_istack
なので、本来は0x20002170になるべきだと思います。
 そこで、以下の修正が必要ではないかと思っています。arch\arm_m_gcc\prc_config.c

/*
 *  非タスクコンテキスト用のスタック初期値
 */
#define TOPPERS_ISTKPT(istk, istksz) ((STK_T *)((istk) +
(istksz/sizeof(STK_T))))

 (istksz)を(istksz/sizeof(STK_T))に修正

3 別件で以前のバージョンでは動作していましたが、カーネル1.6でコンパイルエラーになる不具合(?)があります。

 asp\arch\arm_m_gccprc_config.hの

/*
 *  タスクコンテキストブロックの定義
 */
typedef struct task_context_block {
 void *sp;  /* スタックポインタ */
 FP  pc;   /* プログラムカウンタ */
} CTXB;

 のCTXBを

} TSKCTXB;  //k TOPPERS1.6対応

SKCTXBに修正して動作させています。この修正だけで今のところ問題は出ていません。単に名前の変更なら必要ないと思いますが、注意を引くためにわざと名前を変えた(別な重大な修正がある?)なのでしょうか。
 スタックの件と合わせて連絡いただけるようお願いします。
 以上

2010年12月12日9:41 Hiroaki TAKADA <hiro @ ertl.jp>:

> こいさん様
>
> Cortex-M3依存部を全部見たわけではありませんが、とりあえず
>
> > ● スタックを4Kbyteと記述されている
> >
> > #define DEFAULT_ISTKSZ (0x1000/8U) /* 4KByte */
>
> が間違っていると思います。DEFAULT_ISTKSZはバイト数で指定すべきで、
> 8Uで割ってはいけません。
>
> TOPPERS開発者メーリングリストの方に、このメールを転送して、修正を
> 依頼しておきます。
>
> ユーザ側では、DEF_ICSを使えば回避できます。
>
> 高田広章
> 名古屋大学
>
> (10/12/12 0:52), koizumi yoshiyuki wrote:
> > こいさんです
> > Cortex-M3版のTOPPERS/ASPで自作アプリを動作させると暴走したり、Usage
> > Faultが発生します。
> > アプリのデータを大きさを変えるとエラーの出方が変わることに気がついた。
> > スタックはstaticになっているのでmapファイルにアドレスが出ないので気がつ
> > くまで時間がかかってしまった。
> > 原因はメモリの内容が壊れている。
> > スタックが壊れるとUsage Faultになり、制御フラグが壊されると暴走してい
> > るようである。
> > メモリが壊れるのはスタックポインタがスタック外を指しているので、データ
> > が壊れてしまう。 istackの記述方がおかしいと思われる。
> > ● スタックを4Kbyteと記述されている
> >
> > #define DEFAULT_ISTKSZ (0x1000/8U) /* 4KByte */
> >
> >
> > ● スタックの定義(自動生成 kernel_cfg.c)
> >
> > static STK_T _kernel_istack[COUNT_STK_T(DEFAULT_ISTKSZ)];
> >
> >
> > ● ベクタのスタックポインタの記述(自動生成 kernel_cfg.c)
> >
> > const FP _kernel_vector_table[] =
> >
> > {
> >
> > (FP)(TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ)), // 0 The initial
> > stack pointer
> >
> >
> > ■ istackの記述とベクタのポインタ記述が異なっている。
> > COUNT_STK_T(DEFAULT_ISTKSZ) と TOPPERS_ISTKSZ
> > これで良いのか分からず
> >
> > ■ 値をコンパイル済みで確認したが変です。
> >
> > int xx_stz = TOPPERS_ISTKSZ; // 0x00000200 4Kの1/4 ???
> >
> > int xx_stz2 = COUNT_STK_T(DEFAULT_ISTKSZ); // 0x00000040
> > TOPPERS_ISTKSZの1/8 ???
> >
> > ■ istackは4Kbyte確保されていない *.mapにて確認
> >
> > _kernel_istack 0x200 ./obj/kernel_cfg.o
> >
> > sizeof(STK_T)は4byte
> >
> > ■ ベクタのスタックポインタは値は4Kスタックなら正しい
> >
> > 説明文ではソース上はスタックの大きさは8byte単位と説明されているが、
> > STK_Tは4byteになっているし、実際に確保されているスタックは4Kより少ない。
> > 何が正しいのか良く分かりません。無理やりスタックサイズを4Kbyteに合わせ
> > れば正しく動作します。
> >
> > 本来どう記述すべきなのでしょうか。
> > (Cortex-M3だけで考えれば良いとは思えないので、困っています)
> >
> > 以上
>
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://www.toppers.jp/pipermail/users/attachments/20101213/07c2f3ec/attachment.html>