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

Saito Naoki saito.naoki @ nmiri.city.nagoya.jp
2011年 10月 18日 (火) 13:25:08 JST


もなかさん,みなさま

斉藤です.
お返事が遅れてしまいました.

NCの場合でも非タスクコンテキストのスタック用として
セクションを定義してやれば,セクションのオーバーラップ時の
異常を検出することはできると思います.
その場合,割り当てアドレスを明示的に指定する必要はありますが.

以上です.


(11/10/15 9:20), Masaki Muranaka wrote:
> 斉藤さん,みなさま:
> おはようございます.
> 
> 高橋さんのマップ情報も併せると,概ね原因が見えてきましたね.
> ついでの枝葉末節というか蛇足になりますが….
> 
>> 非タスクコンテキストのスタック領域については,
>> RAM領域の何にも使われていないであろうと「思われる」部分を
>> こっそり使っているにすぎないため,リンカも警告の出しようがないと
>> 思います.
> 
> NCのリンカについて詳しくないのですが,GNU ld では,配置できる
> メモリエリアを ldscript に記述することができます.非タスクコンテキストの
> スタックが占有しそうなエリアを明示することでリンク時にエラー(warning だったかも?)は出せます.
> 厳密にはスタック使用量の最大値が読めないので,ランタイムのメモリ破壊を完全に
> 防ぐことはできませんが,概ねASPと同程度の効果は得られるはずです.
> 
> …なのですが,GCCを使うターゲットでも,そのように記述しているものは
> 無いようですね.:-(
> 
> 2011年10月14日17:40 Saito Naoki<saito.naoki @ nmiri.city.nagoya.jp>:
>> もなかさん,みなさま
>>
>> 先ほどに続いて下記の件ですが,
>>
>>> この時点でおかしい(STACK_SIZE のほうが大きい)ので,何が起こっても変で
>> はないですね.
>>> // リンカがエラー出さないのが不思議ですが,NCのリンカってそういうもの
>> なのでしょうか…?
>>
>> 非タスクコンテキストのスタック領域については,
>> RAM領域の何にも使われていないであろうと「思われる」部分を
>> こっそり使っているにすぎないため,リンカも警告の出しようがないと
>> 思います.
>>
>> 非タスクコンテキストのスタックについてもタスクスタックのように
>> 配列を定義すれば,サイズ超過した場合にリンカは警告を出してくれると
>> 思います.
>> TOPPERS/ASP はその点で問題が起こりにくいのかな,と思います.
>>
>> (11/10/14 15:27), Masaki Muranaka wrote:
>>> 斉藤さん,みなさま:
>>> こんにちは.
>>> 当方あいかわらずあてずっぽうですが….
>>>
>>>>> ・純粋にスタックとして使用可能なサイズは 339バイト
>>>>> ・CRE_TSK の STACK_SIZE マクロのデフォルト値は 386
>>>
>>> この時点でおかしい(STACK_SIZE のほうが大きい)ので,何が起こっても変ではないですね.
>>> // リンカがエラー出さないのが不思議ですが,NCのリンカってそういうものなのでしょうか…?
>>>
>>> バッファの増分だけ,メモリマップが変わって,シリアルタスクか非タスクコンテキストか,
>>> その当たりのスタックがクリティカルなところを破壊したというシナリオがまず考えられそうに
>>> 思います.
>>>
>>> 2011年10月14日13:07 Saito Naoki<saito.naoki @ nmiri.city.nagoya.jp>:
>>>> 斉藤@自己レス です.
>>>>
>>>>> というわけで,多分スタック周りかな,と思います.
>>>>
>>>> しかし,タスクを呼び出たりしてなければ別に消費している訳では
>>>> ないですので...何だか変ですね.
>>>>
>>>> (11/10/14 12:55), Saito Naoki wrote:
>>>>> 桐島様(霧島様?)
>>>>>
>>>>> 斉藤です.
>>>>> #ご連絡遅れました.
>>>>>
>>>>> 拝見した情報だけで考えると,問題が発生する様には見えないですね.
>>>>>
>>>>> そこで当方でも
>>>>> NC30WA v4.00 Entry版 + TM3.11 の環境で初級実装セミナーの
>>>>> timer3 をビルドし,MapViewer というツールで
>>>>> メモリマップを眺めてみました.
>>>>> (アドレスはお使いの環境と多少変わるかもしれません)
>>>>>
>>>>> それによると
>>>>> ・ISP の初期値は 0xc00
>>>>> ・RAMの最後のセクションは bss_NO で,その開始アドレスは 0xaac
>>>>> ・bss_NO には intnest だけが配置されている.サイズは1バイト.
>>>>> ・純粋にスタックとして使用可能なサイズは 339バイト
>>>>> ・CRE_TSK の STACK_SIZE マクロのデフォルト値は 386
>>>>>
>>>>> というわけで,多分スタック周りかな,と思います.
>>>>>
>>>>>
>>>>> (11/10/13 13:54), 霧島遼二 wrote:
>>>>>> 斉藤様
>>>>>>
>>>>>> 桐島です。
>>>>>> エラーが出た周辺のコードですが、初級実装セミナーの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
>>>>>> <mailto: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' というコンテキストエラーが発生します。
>>>>>>         >    タスクを追加するだけでこのようなエラーが出るものなのでしょうか。
>>>>>>         >    組み込みは全くの初心者なのでよろしくお願いします。
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>
>>
>>
>>
>