(toppers-users 3596) Re: タスクを生成するだけでE_CTX

Masaki Muranaka monamour @ monaka.org
2011年 10月 14日 (金) 11:33:28 JST


TOPPERS Users ML のみなさま:
おはようございます.
動作確かめていませんが,高橋さんと同意見です.

初心者とのことなので,少し細かめに….
(細かく,とはいっても枝葉末節は端折ります)

TOPPERS/JSPが動作しているCPUでは,スタック領域がメモリ上に必要です.
μITRON仕様書で CRE_TSK を調べていただくと判る通り,第6引数がNULLのときは,
コンフィギュレータが第5引数分の領域を確保できるようケアしてくれます.

現代的なOS(LinuxやWindowsなど)の場合,スタックエリアの管理や保護は,OSがやってくれます.
スタックは勝手に用意してくれますし,少なくなれば自動的に伸長してくれますし,
場合によっては仮想記憶から調達してくれたりもします.

μITRONを始めとするリアルタイムカーネルのいくつかでは,上記のようなスタック管理は
行なってくれません.スタックが足りない場合や,リンク時にメモリ領域がスタックと他で
重なった場合は,実行時に他のメモリ領域を上書きします.容赦ありません.

C言語で開発なさった方ならば,文字列コピー時のバッファオーバーランに気をつけるべき
ということは,入門時に耳にタコができるほど聞かされていると思います.
加えて,μITRONを始めとするいくつかのリアルタイムカーネルでは,バッファコピーに加えて,
スタックによるメモリ破壊にも気を遣う必要があります.

…という前提知識を持って,搭載メモリ量 | 定義したスタックのサイズ | リンカが出力する map ファイルの内容 |
などなどを確認していくと,原因が見えてくるのかなと思います.

JSPのM16Cターゲットにバグがある可能性は,ゼロではありませんが,限りなく低いのではと思います.
最古に近いコードで,各地のセミナーや実製品で使われている実績もあります.


2011年10月13日13:54 霧島遼二 <kirishima9315 @ gmail.com>:
> 斉藤様
>
> 桐島です。
> エラーが出た周辺のコードですが、初級実装セミナーのOAKS-MINIボード用教材
> BeginnerTrainingSeminar0010103/jsp14-m16c-edc-041008/OBJ/TIMER3
> にある timer3m.cfg, timer3.c, timer3.h に以下の部分を追加しました。
> シリアル通信を行った瞬間にE_CTXが繰り返し発生するので、TEST_TASKを生成するところでおかしなことになっているのではないかと思うのですが。
>
> -------timer3m.cfg-------
> INCLUDE("\"timer3.h\"");
> CRE_TSK(ENTRY_TASK, { TA_HLNG, 0, entry_task,
> DEFAULT_MAIN_PRIORITY,STACK_SIZE, NULL});
> CRE_TSK(TIMER_TASK, { TA_HLNG, (VP_INT) 0, timer_task, TIMER_PRIORITY,
> STACK_SIZE, NULL });
> CRE_TSK(TEST_TASK,{ TA_HLNG, (VP_INT) 0,
> test_task,TEST_PRIORITY,STACK_SIZE,NULL}); // 追加
> -------------------------
>
> -------timer3.c-------
> /* 一番後ろに追加 */
> void
> test_task(VP_INT exinf)
> {
> }
> ----------------------
>
> -------timer3.h-------
> /*
>  *  タスク優先度の設定
>  */
> #define DEFAULT_MAIN_PRIORITY  8
> #define TIMER_PRIORITY         9
> #define TEST_PRIORITY          9 // 追加
>
> /*
>  *  関数のプロトタイプ宣言
>  */
> #ifndef _MACRO_ONLY
>
> extern void entry_task(VP_INT exinf);
> extern void  timer_task(VP_INT exinf);
> extern void  test_task(VP_INT exinf); // 追加
> #endif /* _MACRO_ONLY */
> ----------------------
>
> 2011年10月13日12:47 Saito Naoki <saito.naoki @ nmiri.city.nagoya.jp>:
>>
>> 桐島さん
>>
>> 斉藤と申します.
>>
>> エラーが出た周辺のコードなどは見せていただくことは可能でしょうか.
>>
>>
>> (11/10/13 10:42), 霧島遼二 wrote:
>> > お世話になります。
>> > 桐島と申します。
>> > 最近μitronの勉強を始めました。
>> > 初級実装セミナーのOAKS-MINIボード用教材でサンプルをボード(OAKS16-MINI
>> > FullKit)に実装して動作確認をしていたのですが、試しにTIMER3にCRE_TSKで新
>> > しくタスク(中身は空)を追加してみたところ、E_CTX reported by `isig_tim()'
>> > in line 63 of `timer.c' というコンテキストエラーが発生します。
>> > タスクを追加するだけでこのようなエラーが出るものなのでしょうか。
>> > 組み込みは全くの初心者なのでよろしくお願いします。
>>
>>
>
>