(toppers-users 3653) Re: TOPPERS/ASP cq_starm_gccの終了処理が変な気がしています。

杉本明加 asuka.choronos @ gmail.com
2011年 10月 23日 (日) 23:55:55 JST


こいさん様

杉本です.

最適化の問題でしたか,納得しました.
ありがちな問題ですが,思い付きませんでした.

NoReturnですが,これはコンパイラ依存です.
gccであれば__attribute__((noreturn ))に定義されています.
商用コンパイラの場合は#pragmaで指定できるものもありますが,
該当する機能を持たないコンパイラも多いですね.

以上,よろしくお願いします.

2011年10月23日19:57 koizumi yoshiyuki <koizumiyoshiyuki @ gmail.com>:
>  杉本さんへ
>
>  ヒント有難うございます。
>  無限ループに至らない原因が判明しました。exit_kernelは以下のようになっています。
>  assert(0)で無限ループにしようとしていると思われます。
>
> void void)
> {
>   call_terrtn();
>  target_exit();
>  assert(0);
> }
>  しかし、target_exit()は
> extern void target_exit(void) NoReturn;
>
>  と定義されているため、最適化を指定したコンパイラはassert(0)以後は必要ないとオブジェクトを落としません。ここはコンパイラ依存で処理されます。
>  後の動作は、前に説明した用にスタックは切り替わっているので、変な動作になっています。
>
> extern void target_exit(void);
>
>  NoRetuenを削除したら、assert(0)で無限ループになりました。
>
>  設計側の意図としてはどのように考えているのですかね。
>
>  独り言
>  extern void xxxxxx(void)
> NoReturn; を知りませんでした。前に、別な所で見て、なんだろうと思ったのですが、その時調べなかったのが敗因でした。
>
>
>  以上
>
> 2011年10月23日15:32 杉本明加 <asuka.choronos @ gmail.com>:
>>
>> こいさん様
>>
>> 杉本です.
>>
>> ご指摘のとおり,★Aに戻ってはいけません.
>>
>> おそらくASP 1.3.2をお使いだと思いますが,target_exitと
>> prc_terminateにも無限ループによる処理停止がありませんね.
>> (target_exitはJSPでのsys_exitにあたります)
>>
>> ちなみに多くのターゲット依存部ではどちらかで無限ループで
>> 処理を停止します.もしくはを停止する手段があれば該当する
>> 機能を呼び出します,例えばMAC OS Xではexit関数を
>> 使っています.
>>
>> 気になるのは,assertの処理です.exit_kernelの最後で
>> assert(0)からTOPPERS_assert_abortが呼び出されます.
>> 実装ではabort関数を呼んでいますが,その辺りは
>> どのように動作していますでしょうか?もしかするとそこで
>> プログラムが正常に終了する意図になっているのかもしれません.
>>
>>
>> ちなみに,ASP 1.7.0用のCortex-M3用のターゲット依存部では
>> target_exitで無限ループしています.簡単に対処するならばそれで
>> 問題ないかと思います.
>>
>> 以上,よろしくお願いします.
>>
>> 2011年10月23日14:03 koizumi yoshiyuki <koizumiyoshiyuki @ gmail.com>:
>> >  こいさんです
>> >
>> >  TOPPERS/ASP cq_starm_gccでsample1を動作させ、「Q」キーで終了させた後スタックが壊れて暴走しています。
>> >
>> >  TOPPERAS/ASPの終了処理はどうなるべきなのでしょうか。
>>
>> > >  JSPのcq_frk_nxp_armではsys_exit()で無限ループになっています。ASPにはsys_exit()はありませんでした。終了の仕方がJSPとASPでは変わったのでしょうか。
>> >
>>
>> > >  システムの終了処理は実装依存なので、適当に処理すればよいのでしょうか、OSの終了処理としては、OS設定した環境を元に戻して(割り込みコントローラや、モードなど)無限ループにして於くのが良いと思います。
>> >  現状
>> > sample1(){
>> > ---
>> >  SVC_PERROR(ext_ker());
>> > }
>> >
>> > ext_ker(){
>> > ----
>> >  call_exit_kernel();
>> > ----   ★A
>> > }
>> >
>> >  call_exit_kernel()はアセンブラ記述でモード切替た後exit_kernelにブランチ。
>> >
>> > exit_kernel(void){
>> > }
>> >
>>
>> > >  exit_kernel関数を終了したとき★Aに戻って欲しい作りのように見えますが、call_exit_kernelでモードの切り替えと共にスタックが切り替わるので★Aには戻れないはずです。又、たとえスタックが切り替わらなくても、exit_kernelからの戻りと、ext_kerからの戻り方はコンパイラ依存な為、こちらも不味い気がしています。
>> >  システムの終了はどうなるのがTOPPERSの設計意図なのでしょうか。
>> >
>> >  以上
>> >
>> >
>> >
>> >
>
>