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

Hiroaki TAKADA hiro @ ertl.jp
2010年 12月 12日 (日) 09:41:07 JST


こいさん様

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だけで考えれば良いとは思えないので、困っています)
> 
>  以上