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

koizumi yoshiyuki koizumiyoshiyuki @ gmail.com
2010年 12月 12日 (日) 00:52:57 JST


 こいさんです

 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/20101212/0c84e677/attachment.html>