質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
RTOS

RTOS(リアルタイムOS)は、リアルタイムシステムのためのOSです。実時間システムや実時間OSとも呼ばれ、時間的な制限のある処理を行うための機能・特性を備えています。組み込みシステムの制御に多く用いられています。

GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

Q&A

2回答

2675閲覧

メモリアドレスのオフセットが何を指しているのか分かりたい(gdb)

marny

総合スコア19

RTOS

RTOS(リアルタイムOS)は、リアルタイムシステムのためのOSです。実時間システムや実時間OSとも呼ばれ、時間的な制限のある処理を行うための機能・特性を備えています。組み込みシステムの制御に多く用いられています。

GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

0グッド

0クリップ

投稿2018/12/18 11:50

マイコンボードのgr-peachを使っていろいろ触り始めたものです。
リアルタイムカーネルのToppers/asp3カーネルを動かし、デバッグをgdbでしているのですが、デバッグ中に以下のようなメッセージが出ました。

Data Abort exception occurs.
pc = 1800a178, cpsr = 80000013, lr = 1800ccd4, r12 = 20028278
r0 = fcfe3018, r1 = 1800c284, r2 = 00000087, r3 = 18018c40
nest_count = 0, intpri = 0
Fault status: 0x080d (permission fault (1st level))
Fault address: 0x18018e5c

Data Abort exception occursは未定義の例外が入ったときの処理のようです。
"x 0x18018e5c"でFault addressを調べてみると、

0x18018e5c <_kernel_inh_table+540>: 0x1800e92c

というメッセージが出力されました。kernel_inh_tableは割込みハンドラテーブルなのでそこに問題があるのでしょうが、さらにオフセット540の指すものを調べる方法はあるでしょうか?
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

まず、そのCPUのハードウエアマニュアルを読みましょう。
割り込みベクタテーブルの割当を調べ、そのオフセット540はなんの割り込みのベクタなのかを見ます。

が、この場合はあくまでアクセス違反だからそれが出ているので、ぶっちゃけアクセス場所は問題ではないです。
プログラムが異常だから、あるいは暴走しているから、そこへアクセスに行って例外が出ているので、その場所を調べたところで全く意味はありません

投稿2018/12/18 11:58

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marny

2018/12/18 14:22

回答ありがとうございます。 GR-PEACHのCPUはArmアーキテクチャということで https://www.macs.hw.ac.uk/~hwloidl/Courses/F28HS/Docu/DEN0013D_cortex_a_series_PG.pdf を読んでみましたが、vector tableについては広い範囲でIRQ interruptという記載だけでした。読むものが間違っているのでしょうか。 それともしよろしければ、y_waiwaiさんがこういった場合にはどのあたりが怪しいと思われるのか教えていただけないでしょうか。足りない情報などあれば仰ってください。
y_waiwai

2018/12/18 15:06

RZはれっきとした日本メーカルネサス製です 日本語のハードウエアマニュアルありますぜ で、回答にも書いてあるけど、アドレス調べてもほとんど無駄です 暴走するときはたいがいどっか不正アクセスしてスタックぶっ壊して、ってパターンです。 JTAGエミュレータあるならトレースできるけど、ないならひたすらソース追っかけるしかないでしょうねえ
marny

2018/12/19 11:32

https://www.renesas.com/jp/ja/doc/products/mpumcu/doc/rz/r01uh0403jj0400_rz_a1h.pdf?key=85f5b62e59cc4d41d8ae08a7e00275cd でしょうか。 ベクタテーブルなどで調べてもヒットしないのでまだベクタテーブルの内訳のようなものは見つけられていませんが... 考え方をお教えくださりありがとうございます、他の方の回答にコメントしたように、定義されていない割込みハンドラにアクセスしていたのが原因かなと考えています。
guest

0

オフセット540

ビルドした時に、マップファイルは出力してませんか?
もし、あれば、kernel_inh_table のテーブルを見て、その +540を見て何の割込みか調べましょう。
問題があるとすると、+540で示される割込みが未定義だった(で、不正処理となった)
また、+540となる割込みは発生してはいけない割込みだった。

あたりでしょうか。

投稿2018/12/18 13:48

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marny

2018/12/18 14:35

回答有り難うございます。 未定義というのがありそうな気がします。 マップファイルの出力をしようと、-MAP=〇〇.mapというのを追記したのですが、unrecognized command line optionと怒られたので、少し時間がかかりそうです。できたらすぐにコメントさせていただきます。
marny

2018/12/19 11:12

あれから調べてたところ中間生成ファイルにて以下の記述がありました。 kernel_default_int_handlerは未定義の割込みが入った時の処理です。 0x219 = 537なのでおそらく未定義のオフセット540にアクセスしようとして、エラーが出たものと思われます。 この割込ハンドラテーブルを生成する関数なり変数なりに問題があると見て間違いないでしょうか。 const FP _kernel_inh_table[TNUM_INHNO] = { /* 0x000 */ (FP)(_kernel_default_int_handler), /* 0x001 */ (FP)(_kernel_default_int_handler), /* 0x002 */ (FP)(_kernel_default_int_handler), /* 0x003 */ (FP)(_kernel_default_int_handler), /* 0x004 */ (FP)(_kernel_default_int_handler), /* 0x005 */ (FP)(_kernel_default_int_handler), /* 0x006 */ (FP)(_kernel_default_int_handler), /* 0x007 */ (FP)(_kernel_default_int_handler), /* 0x008 */ (FP)(_kernel_default_int_handler), /* 0x009 */ (FP)(_kernel_default_int_handler), /* 0x00a */ (FP)(_kernel_default_int_handler), /* 0x00b */ (FP)(_kernel_default_int_handler), /* 0x00c */ (FP)(_kernel_default_int_handler), ... ... /* 0x215 */ (FP)(_kernel_default_int_handler), /* 0x216 */ (FP)(_kernel_default_int_handler), /* 0x217 */ (FP)(_kernel_default_int_handler), /* 0x218 */ (FP)(_kernel_default_int_handler), /* 0x219 */ (FP)(_kernel_default_int_handler) };
pepperleaf

2018/12/19 13:12 編集

仕様見て無いので推測ですが、ユーザー定義の割込みでしょう。 どこかに割込みテーブルの定義があるのでは。(既に指摘はありますが) あ、仕様確認の手間省くなら、該当のアドレスに適当な関数のアドレスを設定して、その関数の先頭で、ブレイクし、スタックをトレースすれば、どこで例外が発生しているか分かると思います。
marny

2018/12/20 14:36

関数のアドレスを直接設定する方法を調べたのですがあまりはっきりわからず、 例えば以下のようなプログラムで、test関数のアドレスを直接設定するとしたらどう修正すればいいでしょうか.基本的なところですみません. #include <stdio.h> void test(void); int main(void){ void (*funcptr)() = test; (*funcptr)(); return 0; } void test(void){ printf("test.\n"); }
pepperleaf

2018/12/20 15:53

0x18018e5c を リンク先のマニュアルで見ると、 > 0x1800_0000~0x1BFF_FFFF SPIマルチI/Oバス領域 チャネル0 になっています。とすると、 FP _kernel_inh_table[] という説明と合わない気がするのですが、見方が間違っている? また、ARM A9を見ると、r13がスタックポインタみたいですが、デバッガで止まった時の値はどうなっているのでしょうか? ただ、 > pc = 1800a178 なんで、同じ場所、間違え(エラー)て、ここに飛んだか、ちょっとここだけでは分かりません。
marny

2018/12/24 13:28

返事が遅くなってしまいました。 自分もそのマニュアルを読んで?となっていました。 asp3カーネルではスタックポインタがspと定義されているので、gdbを動かしてエラーが表示されたところで p $spでみたところ $1 = (void *) 0x20023de8 <_kernel_istack+8176> という表示でした。 エラーが出るタイミングもまちまちで、まだまだ調査中です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問