(toppers-users 3319) Re: TOPPERS/ASPをLPC1343チップに移植していますが、難儀しています。

koizumi yoshiyuki koizumiyoshiyuki @ gmail.com
2010年 12月 14日 (火) 17:55:17 JST


 大野さま

 有り難うございます。

 取り急ぎの情報です。
 信じられませんが、私が使っているLPC1343チップが誤動作しているようです。

SVC命令でPSPの更新がされた値が-0x20になっていません。私はHWを1つしか持っていません。通販で手に入れることと、SVCをテストするプログラムを作成します。しばらく時間が必要です。

細々説明したスタックの値はあれで正しいようです。4byteのずれは、レジスタを復元するとき優先度レジスタの値としてつかわれている事を確認しました。私の中途半端な解析でお迷惑をおかけしたようです。

 本件は解り次第、詳細情報をメールします。

 以上

2010年12月14日16:30 Toshiharu Ohno <tohno @ sirius.ocn.ne.jp>:

> 大野と申します。
>
> わたしはLPC1343を使ったことはありませんが、次の記事と
> 同じ問題であると推測します。
>
> http://blog.goo.ne.jp/sirius506/d/20100516
>
> *記事中のレジスタ名表記はATMEL流なので、適宜変更してください。
>
> ASPのCortex-M3依存部は Rev 1にしか対応していないために
> このスタックポインタのずれが生じてしまいます。
> 今後も各社からCortex-M3 Rev.2 マイコンが登場することを
> 考えると、同じ問題が繰り返されることになると思われます。
> Cortex-M3依存部をRev 2にも対応するようにしていただくのが、
> 一番よろしいかと思います。
>
>
> 大野俊治
>
>
> (2010/12/14 14:40), koizumi yoshiyuki wrote:
> >  こいさんです。
> >
> >
>  小生、LPC1343チップにTOPPERS/ASPを移植しています。sample1のmain_task動作中にusageフォルトが発生しています。
> > 移植の誤りの可能性もありますがディスパッチャ周りの動きが理解出来ず難儀しています。 何かヒントが頂ければ幸いです。
> >  当初メモリ不足でだましだましデバッグしていましたが、istack問題でこちらは解決です。
> >
> > ★
> >
> targetの修正部はtarget_serial.cとtarget_config.cで後はincludeファイル名変更程度です。(cq_starmを使わないようした為)
> >  非依存部やアセンブラ部には手を入れていません。
> >
> > 現象
> > 1
> >
> logtask_mainのsyslog_1を表示中(UART割り込みで出力継続)にmain_taskが動作しsyslogで出力します、がdoのループまで到達しないうちにusageフォルトになる。
> >
> > 2
> >
> main_taskはsyslog_1の出力が完了し、時間に計測処理を行っています。計測処理中にタイマ割り込みでlogtaskのdly_tsk(LOGTASK_INTERVAL)が解除されます。logtaskの優先度が高いのでmain_taskは待ちになります。
> >
> > 3
> >
> LPC1343のUARTはFIFIOが8段あります。logtask中に2byte出力して、UARTの割り込みが解除になり、残り6byteは割り込み処理でUARTにデータを詰め込みます。この時はまだlogtaskが動作しています。其の後、logtaskはdly_tskで待ちになります。
> >
> > 4
> logtaskはdly_tskで待ちになったので、2で待たされたmain_taskに起動がかかりますが、このときusageフォルトが発生します。
> >
> > 5
> >
> 2の時、タイマ割り込みを禁止にして、logtaskのメッセージ表示が終わった後、タイマ割り込みを有効にするとusageフォルトは発生せず、logtask_mainのメッセージは表示されます。(処理を単純にするため、テストタスクは起動していません。テストタスクのメッセージがどうなるのかは未確認)
> >
> > 6 UARTの出力時にブレークポイント設定してもusageフォルトは発生しません。正常に動作します。
> >  ブレークポイントを設定すると条件が変わってしまい、発生しなくなるため現象の把握に苦労しています。
> >  何かタイミング絡んでします。となると、UARTドライバの作りかも知れませんが、UARTドライバの戻りでフォルトが出ているわけではないようです。
> >
> > ★ ディスパッチャ周りで変だと思われる流れを見つけました。
> >
> 3のlogtaskはdly_tskの後をデバッガを使ってシングルステップで追いました。main_taskのスタックポインタが4byteずれているのではないか思っています。
> >
> > 1 signal_timeで(*(p_tmevtb->callback))(p_tmevtb->arg);によりlogtaskがreadyになる
> > 2 signal_time関数を終了するとret_int:に戻り
> > 3 EXC_RETURN_PSPなのでret_int_1:に飛ぶ
> > 4 ”trueならret_int_3へ”でret_int_3:へ飛ぶ
> > 5 ”Threadモードへ移行”でret_int_4:へ飛ぶ
> > 6 残りのレジスタを保存のときのスタックポインタが本来の値より-4されていると思っています。
> >
> >  割り込み時に8byteスタックに積み、4byteは捨てているが、4byte残ったままになっているのだと思います。
> >
> どこかでPSPを-4すればよいのでしょうが、何処で行えばよいのか分かりません。適当にPSP-4のルーチンを入れてみましたが別な処でトラップが発生しました。
> >
> > ★ ブレークポイントを設定しデバッグを行っているので、この動きが正しいのかは分かっていません。
> >
> > ■ 分かりにくい説明で済みませんが、この辺り解る方が居られましたら、サポートをお願いします。
> >  一週間ほど費やしました、この間istackの設定誤り(?)を見つけ解決かと思いきや、システムは相変わらすフォールトで、私はハングアップ状態です。
> >
> >  追伸
> >  既にLPC13xx系にTOPPERS/ASPを移植された方は居られませんでしょうか。
> >
> >  以上
>
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://www.toppers.jp/pipermail/users/attachments/20101214/facb10ba/attachment.html>