私はAdaCore GPS(GPL)IDEを使用して、ARM "ベアボード"ハードウェア(Ravenscar SFPランタイムを使用するSTM32F4)を対象としたGNATコンパイラを使用してAdaを学習中です。Ada Last_Chance_Handlerに例外メッセージを出力する
私のARMベースの埋め込み作業では、私はC/C++バックグラウンドから来ています。
とにかく、私は次のように定義されています "最後のチャンスハンドラ"、ここで
procedure Last_Chance_Handler (Msg : System.Address; Line : Integer);
pragma Export (C, Last_Chance_Handler, "__gnat_last_chance_handler");
は、実際の手順(
.adb
ファイルから抜粋)だ、
procedure Last_Chance_Handler (Msg : System.Address; Line : Integer) is
begin
LEDs_All_On;
-- Put_Line("Detail :" & Address_To_String(Msg));
Put_Line("Line :" & Line'Image);
loop
null;
end loop;
end Last_Chance_Handler;
Msg
を実装しました引数は次のように文書化されています。
MsgパラメータはCのNULLで終了する文字列ですプラグインSuppress_Exception_Locationsが である場合は、 のraise文のソース位置をコンパイラによって生成された または長さゼロの文字列で表します。
私は私がセミホスティングを介して出力のこのタイプにアクセスすることができますデバッグするとき、それは(Put_Line()
コールを使用して表示できるようにエイダ列にnull
終了Msg
バイトを変換する方法を把握しようとしてきました機構)。
私は以前に、'Address
属性を一定値に設定することによって、デバイス・レジスタを表すAdaレコードを物理メモリー・アドレスにマップしました。しかし、変数に保持されているSystem.Address
の値を使ってアクセスメモリを試したのは初めてです。
Address_To_String()
手順の実装方法については、誰でもお勧めできますか?
私はAdaバイト配列とそれらととの間のチェックされていないコンバージョンを実験しましたが、Adaポインタもありましたが、これまでのところ成功しませんでした。
ご意見やご提案は大変ありがとうございます。
多くのおかげで、
...マックス
ニース!私は同様のアプローチを思いついたので、 'System.Address'を' Integer_Address'にキャストするために 'To_Integer()'を使い、 'Unchecked_Conversion'を使ってこれを' Character'ポインタなどに変換しました。コードははるかにクリーンです!私はオンボードUARTの1つを使用する独自のバージョンのPut()とPut_Line()を書きました(私はSTM32F407ベアボードターゲットで開発中です)。私は最終的に私自身の「ゼロフットプリント」ランタイムを使いたいので、とにかくこれらが必要でした。私は多くの面白いことを学んでいます。 –
MaxはAdaCoreのベアボードランタイムの1つを使用していますが、Ada.Text_IOは非常に単純化されています(GNAT.IOと同じ場所で終了します)。そして、これはPut_Lineを呼び出すよりもどのように優れていますか?この方法で、文字化けしたテキストでMaxの問題が取り除かれた場合、非常に奇妙なことが起こっています。 –
Ravenscar RTSは、どのようなRTS Maxを使用しているのか分かりませんでした。 GNAT.IOは整数の印刷を直接サポートしています。彼は、私がここで避けたい、セカンダリスタックを必要とするImage属性を使用します。私のバージョンでは、0の終了文字列のC知識を直接使用しています。 Put_Lineを使用する場合は、最初にゼロ終了文字列をAda文字列に変換し、最後にC形式で印刷する必要があります。 – RREE