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

koizumi yoshiyuki koizumiyoshiyuki @ gmail.com
2010年 12月 15日 (水) 14:52:29 JST


 大野さま, 高木@未来技術研究所さま

有り難うございます。ご指摘の通りCPUのレビジョンの違いでスタックのアライメントの動作に違いが有ります。現行のCortex-M3版ではレビジョン1対応なのでレビジョン2では動作しない場合があります。

 CPUがレビジョン2の場合CMIS形式で

 SCB->CCR &=  ~SCB_CCR_STKALIGN_Msk;

 をtarget_config.cに追加することで、動作が可能になります。

回避策としてはCPUのスタックアライメントをレビジョン1互換にしなくてても、SVCのスタックを捨てる処理で捨てるサイズを切り替えることでも動作すると思います。この手法だとディパッチャの処理が4命令長くなるのでどちらを選択するのか悩ましいところですね。CM3_REV1を指定すると遅くならない工夫をしました。指定しなければrev1,2どちらでも動作します。さて、

prc_support.S

svc_handler:
 /*
  *  割込み処理からのリターンにより,CPUロック解除状態に移行するよ
  *  う準備する.
  */
 cpsid f                       /* 割込みロック状態へ */
 mrs   r0, psp
#ifndef CM3_REV1
 ldr   r1, [r0,#0x1c]
 tst   r1,#0x200
 ite   ne
 addne   r0, #EXC_FRAME_SIZE+4 /* スタックを捨てる   */
 addeq   r0, #EXC_FRAME_SIZE   /* スタックを捨てる   */
#else
 add   r0, #EXC_FRAME_SIZE     /* スタックを捨てる   */
#endif
 msr   psp, r0

------------------------------------------------------------------------------------------------

 高木@未来技術研究所

 CM3の担当の方と伺いました。本件もスタックサイズ問題と友に修正に加えて頂けると幸いです。
 (スタックを捨てる処理は一応動いていますが、再度検討される事をお願いします)

 余分な話かも知れませんが
現状スタックエリアはstaticで定義されており、static定義の変数はマップファイルにアドレスが載りません。スタックサイズはシステムを設計する際いくつにすべきか悩ましい部分です。システムを動作させた後、何処まで使っているか確認することもしばしば行いました。staticが付いていると、この作業を容易に行うことは出来ません。C++などでグローバルを使わない、見せない事が望ましいと言われるこの頃ですが、私は見せるべきだ(見たい)と思っています。名前のバッティング問題も有るかとは思いますが、重要なデータは容易にアクセスや認識出来るように願いたいと思っています。
 この問題、CM3
TOPPERS/ASPを既に利用されている方はびっくりされたと思います。当方は単なるトラブルの一環で安易な質問を出し、高田先生の返信を受け見直したところ「今頃信じられない」がその時の感想です。スタックの番地が容易に認識できていたら、誰かがもっと早く気がついたような気もしています。

 よろしくお願いします。

以上



2010年12月14日17:55 koizumi yoshiyuki <koizumiyoshiyuki @ gmail.com>:

>  大野さま
>
>  有り難うございます。
>
>  取り急ぎの情報です。
>  信じられませんが、私が使っている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/20101215/04679627/attachment.html>